[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#873384: Diff between 3.9.0-4 and 4.0.0-beta4



I attach th diff file between th version 3.9.0-4 in Stretch and the
version in testing 4.0.0-beta4.

-- 
Mechtilde Stehmann
## Apache OpenOffice.org
## Freie Office Suite für Linux, MacOSX, Windows
## Debian Developer
## Loook, calender-exchange-provider, libreoffice-canzeley-client
## PGP encryption welcome
## Key-ID 0x141AAD7F
diff -Nru calendar-exchange-provider-3.9.0/build.sh calendar-exchange-provider-4.0.0~beta4/build.sh
--- calendar-exchange-provider-3.9.0/build.sh	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/build.sh	2017-07-03 22:10:10.000000000 +0200
@@ -1,28 +1,32 @@
 #!/bin/sh
 
-usage() { echo "Usage: $0 [-u | -d ]" 1>&2;echo "-u:enable update";echo "-d:disable update"; exit 1; }
+usage() {
+    printf "Usage: %s [ -u | -d ]\n" "$0" 1>&2
+    printf "  -u   enable update\n" 1>&2
+    printf "  -d   disable update\n" 1>&2
+    exit 1
+}
 
-if [  $#  =  0 ];then
-usage
+if [ $# = 0 ];then
+    usage
 fi
 
-version=`sed -n -e "s/.*<em:version>\(.*\)<\/em:version>/\1/p" install.rdf`
-while getopts  ":ud" OPTION
+version=$(sed -n -e "s/.*<em:version>\(.*\)<\/em:version>/\1/p" install.rdf)
+while getopts ":ud" OPTION
 do
     case ${OPTION} in
         u) echo "update"  
-	cat defaults/preferences/update_enable.txt > defaults/preferences/update.js
- 	zip -r exchangecalendar-v$version.xpi * -x \*.git \*.xpi \*.sh  update\*.txt
-	exit
-	;;
+	   cat defaults/preferences/update_enable.txt > defaults/preferences/update.js
+ 	   zip -r exchangecalendar-v"$version".xpi ./* -x \*.git \*.xpi \*.sh  update\*.txt
+	   exit
+	   ;;
         d) echo "no update" 
-	cat defaults/preferences/update_disable.txt > defaults/preferences/update.js
- 	zip -r exchangecalendar-v$version.xpi * -x \*.git \*.xpi \*.sh  update\*.txt
-	exit
-	;;
+	   cat defaults/preferences/update_disable.txt > defaults/preferences/update.js
+ 	   zip -r exchangecalendar-v"$version".xpi ./* -x \*.git \*.xpi \*.sh  update\*.txt
+	   exit
+	   ;;
 	*) usage ;; 
     esac
 done 
- 
-usage
 
+usage
diff -Nru calendar-exchange-provider-3.9.0/CHANGELOG.md calendar-exchange-provider-4.0.0~beta4/CHANGELOG.md
--- calendar-exchange-provider-3.9.0/CHANGELOG.md	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/CHANGELOG.md	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,684 @@
+# Change Log
+All notable changes to this project will be documented in this file.
+
+## [4.0.0-beta4] - 2017-07-03
+### Added
+- Turkish localization #43, #44, #46
+- Missing release notes of 3.9 and 3.8 releases #35
+- Support for shared task list #41
+
+### Changed
+- Clean up and improve compatibility of build scripts #38, #40
+
+### Fixed
+- File permissions #36
+- HTML content editor #28, #29
+- Activate Italian localization #46
+
+## [4.0.0-beta3] - 2017-06-25
+### Added
+- Added Italian translation #22
+
+### Changed
+- Updated README.md #26, master
+
+### Fixed
+- Colorpick on calender creation doesn't work #19 
+- Can't update tasks/events descriptions #5
+
+## [4.0.0-beta2] - 2017-06-10
+### Fixed
+- Opening and working with Attachment dialog #12
+
+## [3.9.0] - unknown release date
+- Stable Release
+- Support enabled for TB 50.*
+- Tested on TB 45.5.1 Lightning 4.7.4
+- We don't support TB/Lightning beta.
+- bug: add new calendar or no password prompt
+
+## [3.8.0] - unknown release date
+- Support of Thunderbird 45.0
+- Support to Office365 calendar new calendar. Note: New users has to Create calendar using office365 type.
+- fix auto discovery for new hosted calendar
+- fix cancelled not removed
+- fix forward event
+- d9f170f fix #459 #426 #466 #464 #462 remove extra info
+- 1d4b8b4 fix #459 #426 #466 #464 #462
+- 0d1a78a fix: #459
+- 5e02727 (origin/master, origin/HEAD, master) rename folowup mail window
+- ab836f9 task-fixed
+- eaa1c2d (HEAD -> ec-3.8, tag: v3.8-beta3) bump-version
+- a641199 (master) bump-version-tb-support
+- 98c047c (origin/master, origin/HEAD) status-undefined-for-ipmnote
+- c8af0bd strict-error
+- 78377ee Merge branch 'master' into ec-3.8
+- 8edfea3 js strict error
+- 65f46a5 strict error
+- 4f92738 js strict error
+
+## [3.7.0] - unknown release date
+- d1b2860 (origin/master, origin/HEAD, master) revert calendar-event-dialog
+- df713f4 Merge pull request #458 from enozkan/patch-5
+- 180e91a Update preferences.dtd for Turkish locale
+
+## [3.6.0] - unknown release date
+- a2a50be strict mode error fix
+- 5db3c8d task sync and strict mode error fix
+- 16d56bf translation for preference password fix
+- 22850a8 preference password fix
+- 1fcaf4c Merge pull request #423 from Dominique-2202/patch-2
+- 6b16cad French translation calendar-summary-dialog.dtd
+- ae091d5 Merge pull request #422 from Mechtilde/Translation
+- d716986 German translation for calendar-summary-dialog.dtd
+- 65c222a Merge pull request #415 from enozkan/patch-4
+- 1fd65b1 Merge pull request #416 from Trim/erFindContactsOffset
+- 23ca0b3 Merge pull request #417 from Trim/erFindCalendarItems
+- e537089 Update calendar-summary-dialog.dtd for tr
+- 7b4b9fb erFindContacts: give a copy of arrays to callback
+- 2235634 erFindContacts: Use server offset instead of own computation
+- b7dd3aa erFindContacts: remove trailing blanks and use contact logs instead of main logs
+- 9a5b78d erFindContacts: Requests all contacts of address books
+- 4681316 erFindCalendarItems: use slice method to clone javascript arrays
+- 91ac17f erFindCalendarItems: don't cal too many times possibly big array
+- b45a6f4 erFindCalendarItems: use LOG instead of dump
+- 3f9de40 string not translatable #409
+- 9a82408 its good to have xpi filename with 'v' preceeding the version
+
+## [3.5.0] - unknown release date
+- Fix Thunderbird hangs on startup
+- Fix Be more defensive about terminating the loop: under some circumstances startYearDay (and I presume startYear) can be greater than endYear[Day] on entry to the loop.
+- Fix Reword log, Bug #373 "Incorrect exhortationto MAIL THIS LINE TO ..."
+- Fix Bug #371 "Cannot add custom reminder (alarm) to an event ..."
+- Fix Lightning 4.0.2.1
+
+## [3.4.0] - unknown release date
+- New Support Extended to Lightning 4.0.0.1
+- New Support Extended to Thunderbird 38.*
+- New EWS Tagger - Feature
+- New Task Email Follow Up - Feature
+- New Language Support For exchange address Book
+- New Mail folder Delegation - Feature
+- New Automatically set lightning time zone
+- New Plug in Builder for deb package
+
+- Fix Reminder Problem 
+- Fix #190 - Can not add manually add exchange address book
+- Fix Calendar not refreshing during suspend/resume
+- Fix Busy/Free information wasn’t available
+- Fix Ignore domain request for email user names.
+- Fix freezing on start up
+- Fix Restoring cache
+- Fix rtews.dtd typo fixed
+- Fix Cant not add Google calendar
+- Fix Avoid JS exception in auto completion.
+- Fix Also fill out primary email address if local ID is present
+- Fix Treat public DLs the same way as private ones in auto completion
+- Fix Exchange Icon Update in preference
+- Fix Missing Translation English language
+- Fix Israel Timezone fix for Daylight savings time
+- Fix Password Looping fix
+- New Updated French,German Translation
+- New Preference for mail properties syncing
+- New Preference for Email Follow up
+
+- Change Update suggestions only for stable release
+- Change Minimum Refresh time is set to 60
+- Change Enabled Cache by default or No disable option for cache
+- Change Removed all calendar Refresh time
+- Change Optimized syncing method
+- Change Enable NTLM by default in Thunderbird
+- Change Remove  old saved password if user doesn’t choose
+- Change Block adding domain entry in autodiscovery window when email used
+- Change Platform based CSS thanks to git-hub user  "@mariolorenz"
+- Change Clear Logging.
+
+## [3.3.2] - unknown release date
+- Bug fix release
+
+## [3.3.1] - unknown release date
+- New     New Column for invite mail in message list pane
+- New     Support for Thunderbird Nightly Aurora 38.0+
+- New     Locale improved
+- New     Delegating Calendar feature
+- New     Auto-update from Git-hub releases
+- New     High priority mails with auto tagging - important
+
+- Changed Meetings that are canceled are  removed
+- Changed New Event usability issue in lightning
+- Changed Priority column with updated icons,startup preference
+- Changed Cache Clear on Add on Update
+
+- Fixed  Dismissing  reminder
+- Fixed  Accept/Tentative/Reject button appearance
+- Fixed  Fix Address Book freeze when attempting to view "Properties"
+- Fixed  Tentative status does not get saved
+- Fixed  Unable to forward event  in Thunderbird
+- Fixed  Breaking other add on columns in message list pane
+- Fixed  UX error when saving Out of Office 
+
+## [3.2.0] - unknown release date
+- changed add-on name to "Exchange EWS Provider" as it is shorter than including all the exchange versions it can connect to.
+- Fixes bug where sometimes the date/time is shifted on Free/busy info in calendar of someone else.
+- Added preference userAgent. User can now specify their own userAgent string to use in communication.
+- Fixes Bug 277 - Cannot extend the time on a calendar event (Exchange2007)
+- Improved Out Of Office text editor so it is fully HTML aware again.
+- Improved memory usage. It shoud use less memory now. Please read bug 279 on https://www.1st-setup.nl/bugzilla
+- Fixed Bug 287 - no folder details anymore in the ews settings of calendar
+- Fixed a bug where it was not possible to create an exception.
+- Update on French locale.
+- Fixed Bug 291 - Modify instance of recurring meeting fails silently
+- Added Access Control List functionality of Lightning to follow user rights and permissions.
+- Russian translation is added.
+- Fixed problem with new exchange versions of Office365 and Exchange2013.
+- User can mark calendar as readonly. This state is preserved between restarts.
+- Rich text editing of description (body) part for calendar items and task items.
+- Fixed problem where offline cache became out of sync.
+- You can click on links in the description text of invitation and read-only events/tasks
+
+## [3.2.0-Beta20] - unknown release date
+- Fixed Bug 276 - Duplicate entries, wrong hours and sometimes missing entries when viewving other calendars
+
+## [3.2.0-Beta16] - unknown release date
+- Fixed Bug 273 - Tmezone in US or Canada triggers XML error and results in HTTP 400 Bad Request.
+
+## [3.2.0-Beta14] - unknown release date
+- Received new German translation from Björn Töpper.
+- Fixed some small outstanding bugs which will get mentioned when I release the final version.
+
+## [3.2.0-Beta11] - unknown release date
+- Bug 267 - Problem with upgrade from 3.1.2-bug175-3 to 3.2.0-Beta10
+
+## [3.2.0-Beta10] - unknown release date
+- Fixed problem where the add-on would not show events and task against an Exchange2013 server.
+- Changed the title of the add-on to "Exchange 2007/2010/2013 Calendar, Tasks, Contacts and GAL Provider"
+- Started work on improving the progress tooltip info.
+- Fixes bug 162 Changing recurring meeting to Wednesdays, moved it to Thursday
+
+## [3.2.0-Beta9] - unknown release date
+- Introduced loading/showing image when one is available for a contact (addressbook). Only works starting from Exchange server 2010_SP2
+- Fixes a bug where creation of new tasks and Event was not possible since Beta8.
+- Finalized autocompletion. Depending on the connetion speed with the exchange server it can take some time to fill the autocomplete list.
+
+## [3.2.0-Beta8] - unknown release date
+- Introduced an icon which shows connection status to the exchange server.
+- Introduced autocompletion. It works but could use some refinement.
+- Improved CPU load when the add-on has problems connecting to the exchange server .
+
+## [3.2.0-Beta6] - unknown release date
+- Improved copying between exchange calendars and non exchange calendars.
+- Fixed snooze/dismiss reminder problems for events and tasks.
+- Improved UI scripts used in XUL.
+- Fixes Bug 264 - Schema failure when dismissing a reminder
+- Fixes Bug 261 - Number of jobs in Status Bar increasing
+- Fixes Bug 255 - Complete state of tasks not working in today pane
+- Fixes Bug 254 - NewEventInterfaces lists calendars twice
+- Fixes Bug 253 - Import Calendar into Exchange Calendar / copy calendar items from one to another
+- Fixes Bug 252 - Internal server error on reminder dismissal
+
+## [3.2.0-Beta5] - unknown release date
+- Fixed working with attachments lists in the different views/dialogs/panes
+- Customized settings reminders on events and tasks according to what is possible in Exchange.
+- Fixes Bug 255 - Complete state of tasks not working in today pane
+- Fixes Bug 256 - Set custom reminder on task created in outlook without due or entry date not possible
+
+## [3.2.0-Beta4] - unknown release date
+- Split mivExchangeEvent object into mivExchangeEvent and mivExchangeBaseItem. As preparation for mivExchangeTodo.
+- Improved the conversion from Exchange Timezone to Lightning timezone and from Lightning timezone to Exchange timezone.
+- Added the Exchange task/todo detail fields. Lightning does not known about the by default.
+- Fixes Bug 63 - Repeating tasks posted to Exchange Server have incorrect due date/time
+- Fixes Bug 107 - Snooze state of tasks gets lost after restart
+- Fixes Bug 194 - Tasks appear at wrong date
+- Fixes Bug 215 - Snoozed task reminders continually pop up, dismissing task reminders takes 2 clicks of Dismiss
+- Fixes Bug 235 - Try to set a task due date aways sets the current date time
+- Fixes Bug 250 - No tasks with current 3.2.0 beta
+
+## [3.2.0-Beta3] - unknown release date
+- Fixes Bug 150 - Dismissing reminders asks to send update for meeting
+- Fixes Bug 180 - NTLM and Kerberos fail
+- Fixes bug 229 - Creating a custom repeating event - creates event on following day
+- Fixes bug 238 - "All day Event" created for day prior to selected date 
+- Fixes bug 241 - Autodiscover RedirectAddr not followed 
+- Fixes bug 246 - Modifying recurring meeting resulted in "modification failed" errors 
+- Moved exchangecalendar object into it's own interface.
+- Create our own recurrenceInfo object/interface.
+
+## [3.2.0-Beta2] - unknown release date
+- Fixes bug 241 -  Autodiscover RedirectAddr not followed
+
+## [3.2.0-Beta1] - unknown release date
+- Added own ExchangeEvent Interface. With this creation of items from cache or exchange server should be faster.
+- Converted handling of timezones to own interface. 
+- Timezone of Lightning events are set to those of Exchange. As close as possible because the timezone databases between Exchange and Lighting are not the same.
+- Added new SOAP Autodiscovery functionality which is supported since Exchange2010. It will use this when available.
+
+## [3.1.102] - unknown release date
+- Fixes bug 226: No more than 20 contacts are shown.
+
+## [3.1.99] - unknown release date
+- Fixes Bug 212 - version >= 3.x leaks memory
+- Fixes Bug 211 - 3.1.2 breaks login (3.1.1 working)
+- Fixes Bug 188 - Adding a new Exchange 2010 EWS Calendar via add-on goes into an infinite password prompt loop
+- Fixes Bug 173 - Exchange 2007/2010 Calendar and Tasks Provider deletes Outlook Calendar entries
+- Fixes Bug 164 - Can not Connect to server
+- Fixes Bug 159 - Thunderbird freezes
+- Fixes Bug 157 - Infinity Loope for Password/Username
+- Fixes Bug 143 - The adding uses wrong folder and does not fetch contacts
+
+## [3.1.2] - unknown release date
+- Fixed bug 175: After 10 calendars the jobs will hang up
+- Fixed bug 201: Number of Jobs displayed in status bar is negative
+- Added new loadbalancer for request to Exchange servers. You can now control the simultaneous request to the exchange server.
+- Created new interface for the global functions.
+- Added extra info to progress indicator. It now also uses the new loadbalancer for the statistics.
+
+## [3.1.1] - unknown release date
+- Fixed bug 205 Extension overwrites URI for non-exchange calendars
+
+## [3.1.0] - unknown release date
+- Fixed part of bug51. When emailaddress of attendee is empty do not throw an error.
+- Fixed: Bug where removal of last attachment was not possible.
+- Enhancement: Startup of Thunderbird has been improved.
+- Fixed problem when turning off and on offlineCache.
+
+## [3.0.2] - unknown release date
+- Minor bug fix.
+
+## [3.0.1] - unknown release date
+- Fixed bug 196: Version 3.0.0-rc3 seems to interfere with address autocompletion
+- Fixed bug 204: Thunderbird hangs when creating a new item with attachment
+- Added automatic update functionality. This will check the developer website for new versions and give the change to autmoatically install it. 
+
+## [3.0.0] - unknown release date
+- Removed all references to e4x
+- Removed some bugs and stabilized the code.
+
+## [3.0.0-rc4] - unknown release date
+- Add Japanese translation.
+- Added fix for new chunked message responses from Exchange server.
+
+## [3.0.0-rc3] - unknown release date
+- Optimized the code to improve speed.
+
+## [3.0.0-rc2] - unknown release date
+- Optimized the xml handling code so startup and other communications are faster.
+
+## [3.0.0-rc1] - unknown release date
+- Converted last part, editing of tasks, from e4x to xml2jxon.
+
+## [3.0.0-beta4] - unknown release date
+- Fixed problem where a reminder change (dismiss or new time) was not saved to exchange.
+
+## [3.0.0-beta3] - unknown release date
+- Fixed bug 182: Reoccuring Events keep popping up in reminder.
+
+## [3.0.0-beta2] - unknown release date
+- Fixed two parts which were not yet converted. Editing of tasks still to do.
+
+## [3.0.0-beta] - unknown release date
+- Complete rewrite of all xml handling stuff from using e4x to the new xmlToJxon object.
+
+## [2.2.3] - unknown release date
+- Fixed: bug 176 - Calendars whose names contains a slash can't be opened
+
+## [2.2.2] - unknown release date
+- Fixed: bug 160 - Meeting invitation received does not get added after accepting
+
+## [2.2.1] - unknown release date
+- Fixed bug when closing TB the offline cache would be emptyed.
+- Fixed: Bug 161 - pb accessing calendars
+
+## [2.2.0] - unknown release date
+- Fixed complaint of ad-on checker.
+- Fixed bug of cloning a calendar showed empty fields.
+
+## [2.1.4] - unknown release date
+- Fixed: "Unresponsive script" bug.
+
+## [2.1.3] - unknown release date
+- Fixed: Bug 52 - Incorrect sync: random calendar events missing, others duplicated
+
+## [2.1.2] - unknown release date
+-Fixed: Bug 118 - Kerberos authentication broken in 1.8.11
+
+## [2.1.1] - unknown release date
+- Fixed: Bug 151 - Email id property of exchange calendar becomes None on updating thunderbird to 13.0
+- Fixed: Bug 153 - "allday" event -> invite someone -> password request -> communication stopped
+- Improved: Disabled calendars are not started on TB startup.
+- Fixed: The way a calendar startup after is has been created newly.
+
+## [2.1.0] - unknown release date
+- Fixed filtering of events
+- Fixed saving of the EWS settings.
+- Fixed calendarReset.
+- Improved getItems function.
+
+## [2.0.5] - unknown release date
+- Added: Processing of getItemsFromOfflineCache into a seperate thread.
+- Fixed: Problem when turning on offline cache this would only start after restarting TB. 
+
+## [2.0.4] - unknown release date
+- Fixed: bug with reminders in offline cache.
+- Added: Extra dialog when answering an invitation.
+
+## [2.0.2] - unknown release date
+- Improved: Further improved Offline cache items retrieval.
+- Fixed: Bug when receiving a HTTP 302 relative redirect. Because of a typo in the code it threw an exception. Possibly bug 51.
+
+## [2.0.1] - unknown release date
+- Improved: Offline cache items retrieval.
+
+## [2.0.0] - unknown release date
+- Added: Offline cache functionality. (When not connected or offline it goes into Read-Only mode)
+- Added: Invitation forwarding functionality.
+
+## [1.8.19] - unknown release date
+- Fixes: problem where Out Of Office stopped working int TB12. Fix replaces the WYSIWYG editor into a flat text editor.
+- Fixes: Several small bugs.
+
+## [1.8.18] - unknown release date
+- Addedd access to exchange contacts folders. (Currently READ-ONLY)
+- Fixed: Problem with dismissing and snoozing alarms.
+- Fixed: Problem on autodiscovery where sometimes a EWS URL select list was shown with duplicate entries.
+- Fixed: Other small problems.
+- Fixed: Bug 116 - Authentication fails after Thunderbird-restart
+- Fixed: Bug 24 - Accepting or rejecting of invitations changes owner
+
+## [1.8.16] - unknown release date
+- Fixed: Bug 122 - New: I get "Event Invitation" email for my own meetings when I import them
+- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future
+- Fixed a lot of smaller bugs.
+
+## [1.8.13] - unknown release date
+- Fixed: Bug 120 - All my calendar appointments are not visible in Thunderbird
+- Fixed: Bug 94 - Credentials (Username, Password) for calendars are not stored
+
+## [1.8.12] - unknown release date
+- Fixed: Bug 117 - tasks calendar shows calendar items
+- Fixed: Problem where only Free/Busy information would be shown for defalt personal calendar.
+
+## [1.8.6] - unknown release date
+- Fixed: Bug 111 - No events are visible when user only has calendar permission to see Free/Busy info
+
+## [1.8.5] - unknown release date
+- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future occurrences
+- Fixed: Bug 107 - Snooze state of tasks gets lost after restart
+- Updated: Code for setting of alarms and snooze parameters changed completely.
+
+## [1.8.4] - unknown release date
+- Fixed: Bug 103 - aListener not defined in calExchangeCalendar
+- Added: Global minimal memory cache size preferences.
+
+## [1.8.3] - unknown release date
+- fixed: Bug 102 - Extension continually asks for password
+
+## [1.8.1] - unknown release date
+- Fixed: Bug 99 - Tasks do not show up in the tasks pane/tab
+
+## [1.8.0] - unknown release date
+- Added: Full attachment functionality. 
+- Fixed: Bug 97 - Last month's events are missing
+
+## [1.7.18] - unknown release date
+- Fixed: Bug it is not possible to accept or decline a meeting invitation
+
+## [1.7.17] - unknown release date
+- Fixed: Bug where a HTTP 302 redirect which was called as an error was not handled correctly.
+- Fixed: Bug 31 - Unable to invite attendees
+- Fixed: Bug 45 - Cannot display users own calendar
+- Fixed: Bug 68 - MenuItems for creating new items are disabled
+- Fixed: Bug 77 - Lightening fails to save Microsoft Live Meeting style events to the Exchange calendar
+- Fixed: Bug 80 - request response HTTP 302 redirect is NOT redirected and communication stops
+- Fixed: Bug 82 - Copying of events from google calendar does not work
+- Fixed: Bug 83 - Can't add a calendar -> HTTP-ERROR 500
+- Fixed: Bug 84 - checks performed on disabled calendars
+- Fixed: Bug 85 - Can't open or save file attachments in a calendar meeting
+- Fixed: Bug 86 - Invalid log path on Windows
+- Added: When you try to access another person's calendar but do not have full read permissions it will switch and only tries to get Free/Busy/Tentative/OOF information.
+- Added: The domainname is no longer a required field
+- Added: German localization
+- Added: Setting logging preferences can now be done from the TB preferences.
+- Added: Exporting to ICS. Currently it only export what is has requested from the Exchange server. Default a period of one month ahead and one month back from currentdate.
+- Changed: Changed default CalendarPollInterval to once every 60 seconds and InboxPollInterval to once every 180 seconds.
+
+## [1.7.15] - unknown release date
+- Fixed: Bug 59 - Exchange sends extra invitations when first one is accepted
+- Fixed: Bug 32 - Unable to add event to calendar using iTIP buttons 
+- Fixed: Bug 33 - Accept multiple-day appointment request via iTIP creates single-day event
+- Fixed: Bug 61 - Error: reference to invalid character number when trying to pull in calendar
+- Fixed: Bug 62 - Moving calendar item from one calendar to another fails
+- Added: Functionality to clone an Exchange Calendar.
+- Fixed: Bug 19 - Event stays shown after deletion
+- Fixed: Bug 66 - No workflow (accept, reject, ...) buttons are shown in invitations
+- Fixed: Bug 65 - read only of calendar
+- Added: New debugging preferences and possibility to create a log/debug file.
+- Added: Finer info/error control in communication object.
+
+## [1.7.13] - unknown release date
+- Added: Folder properties visible in EWS Settings dialog.
+- Added: Mouse cursor wait indication when browsing folders.
+- Added: Add a new calendar base on the information in a share calendar invitation from someone.
+- Fixed: BUG 54 Shared Calendar w/notification: error when closing
+- Fixed: BUG 55 Can't set reminder for a task
+- Added: Opening and saving of attachments. (ReadOnly)
+- Added: Check if lightning is installed and active. When not it will show a warning.
+- Added: Functionality to migrate an Exchange Provider add-on calendar to this add-on.
+- Added: User can change poll interval for calendar through EWS Settings.
+- Fixed: Bug 56 - Not possible to acknowledge repeating meeting
+- Fixed: Small bug when importing an invitation send from a Google Calendar. It does not contain timezone information.
+- Fixed: Bug 38 - Invalid security certificate
+- Added: Mouse cursor wait indicatie when checking server and username on creating an calendar or changing the server settings.
+
+
+## [1.7.12] - unknown release date
+- Added: Support for Seamonkey.
+- Added: Access to public/shared folders without a mailbox. Only windows username, domain & password required.
+- Added: You can use now a username consisting of a username part followed by ampersand (@) and full domainname and empty domain field or a username and domain field value.
+- Fixed: BUG37. Alarm info on a master calendar item is not show correctly.
+- Fixed: BUG41. Synching meetings with empty titles fails
+- Added: French localization.
+- Fixed: Bug 44 - Synchronizaton fails when a calendar item has no start date
+- Fixed: Bug 39 - Accepting a meeting does not get updated in Lightning
+- Added: Importing ICS file.
+- Change: Changed namespacing on request of Mozilla.
+
+
+## [1.7.11] - unknown release date
+- Modified: Debug log lines show more usefull information.
+- Fixed: BUG 30: Accept via iTIP button fails for requests sent to distribution lists
+- Improved: The processing of meeting invitations is complete. Even the iTIP buttons work.
+
+## [1.7.10a3] - unknown release date
+- Fixed an Exchange server version problem in function GetMeetingRequestByUID. It did not work correctly on Exchange 2007
+
+## [1.7.10a1] - unknown release date
+- Fixed: BUG 28 "NL -> EN translation string" EN != "Settings voor calendar"
+- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner". Meeting invitations are not yet working as wanted when using iTIP buttons.
+
+## [1.7.9] - unknown release date
+- Fixed: Meeting requests and updates to these requests were not processed in the right way.
+
+## [1.7.8] - unknown release date
+- Fixed: BUG 25 Recuring event with reminder prevents calendar refresh
+- Fixed: BUG 26 Deleting a single occurrence in a sequence has no effect
+- Fixed: BUG 27 Today Pane Tasks fails to show newly created tasks
+
+## [1.7.7] - unknown release date
+- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner"
+- Fixed: Stabilized meeting invitations in global. Now works with distribution lists, other alias name, etc...
+
+## [1.7.7a3] - unknown release date
+- Fixed: BUG 23 "Request sent instead of Confirmation; wrong Timezone"
+- Fixed: Trying to mark a task as completed gives an update error: "CompleteDate cannot be set to a date in the future."
+- Fixed: Removing the completed task status through the checkbox in the task view produces an error.
+
+## [1.7.7a2] - unknown release date
+- Fixed: Could not respond to aa meeting invitation where the mailbox name was different in character Upper/Lowercase than the emailaddress in the invitation.
+
+## [1.7.7a1] - unknown release date
+- Fixed: Chagning/updating of an existing item where you are the organiser but also on the attendee list, created by outlook, gave an error.
+- Added: The add-on now modifies the Exchange nextreminderdate on the Exchange server as the old Exchange provider add-on did. This is part of the merge of the add-ons.
+
+## [1.7.6] - unknown release date
+- Added: Progres indicator with tooltip. (closes BUG report 14)
+- Solved: BUG 16 Cannot create event due to Time Zone error (reported by Sven)
+- solved: BUG 17 Out of office retrieval of incorrect values (reported by Sven)
+- Solved: When you are editing Out Of Office settings and had the externel reply window open and did a save the text for the external reply was changed by the internal reply message.
+- Added: It is not possible anymore to add tasks to a calendar folder and calendaritems in a tasks folder. This would produce an error.
+- Fixed: BUG 18 Changing the end or start date of an allday event produces an error. (reported by Sven)
+
+## [1.7.5] - unknown release date
+- Minor changes to keep the add-on working in version 10.0a2.
+- Fixed: Problem where timezone information downloading did not work for exchange 2007.
+
+## [1.7.4] - unknown release date
+- Added: The snooze and dismiss states are saved on the exchange server so they survive a restart of TB. Was a problem when "show missed alarms" was on. (BUG 12 reported by pazz)
+- Solved: Shut-down is faster.
+
+## [1.7.3] - unknown release date
+- Solved: BUG 11/ During creation of an allday event with a reminder or turning on the reminder on an existing allday event triggers an error and change is not saved.  (reported by gislair)
+
+## [1.7.2] - unknown release date
+- Solved: When the windows account got locked the password manager kept asking for a password. Now after tree failed attempts it will stop asking until a restart.
+- Solved: Respong to a meeting request through the iTIP buttons generated an error and did not work.
+
+## [1.7.1] - unknown release date
+- Solved: When an organiser removed a meeting which was confirmed the update in your calendar was performed every 3 seconds.
+
+## [1.7.0] - unknown release date
+- Changed: Folder browser shows different icons for different folderclass property.
+- Solved: Removing a meeting in a public folder did not work an give error.
+- Solved: Buttons Save and cancel in the EWS settings dialog would drop of dialog window.
+- Major version changed into 1 because the add-on is feature complete.
+
+## [0.7.47] - unknown release date
+- New: Selecting the right folder below the folderbase can now be done through a folder browser.
+
+## [0.7.46] - unknown release date
+- Improved: Creation, modification and deletion of repeating events.
+
+## [0.7.45] - unknown release date
+- Solved: Removing a repeating event did not allways work.
+
+## [0.7.44] - unknown release date
+- Solved: Creating an all day event did not work anymore.
+
+## [0.7.42] - unknown release date
+- Solved: Some alarms could not be removed.
+- Solved: For repeating meetings multiple alarms were shown, with same titel and date, when option show missed alarms was on in Lightning settings.
+- Added: Option to automatically remove responses to meetingrequest from your inbox when you are not the organiser.
+- Solved: BUG10 reported by P.Palai.
+
+## [0.7.41] - unknown release date
+- Solved: Checking/searching for certain folderpath locations did not work.
+- Solved: Manipulating occurrences in a repeating meeting did not always work.
+- Solved: Changing the EWS settings did not refresh the calendar and therefore the changes were not visible.
+
+## [0.7.40] - unknown release date
+- Some small changed to make shared funcitonality available to the Exchange Contacts add-on
+- Meetingrequest in a non personal folder we show als invitation request to the use. Now they are not shown anymore as invitation request.
+- Added different job queues for synchronization and modify actions to the EWS server. During startup changes are show earlier.
+
+## [0.7.39] - unknown release date
+- User must choose to whom invitation updates are send.
+- Added a new calender folder poller which will sync by default every 10 seconds.
+
+## [0.7.38] - unknown release date
+- Changes in meetings in personal calendars will be send always to all involved persons. 
+- In a later version the extension will ask the user to specify what he wants (send updates or not)
+
+## [0.7.37] - unknown release date
+- Fixed problem where after an autodiscovery and server and mailbox check did not work.
+- Removing a calendar will remove all settings and running processes.
+
+## [0.7.36] - unknown release date
+- Fixed a warning in the Mozilla tests.
+
+## [0.7.35] - unknown release date
+- Fixed bug (reported by Tudor Timisescu). Check for server and mailbox did not work anymore.
+
+## [0.7.34] - unknown release date
+- Added management of Out of Office settings.
+
+## [0.7.33] - unknown release date
+- Added three new options to the EWS preferences for each calendar.
+- Completed list of "base folder" options.
+
+## [0.7.32] - unknown release date
+- EWS Timezome information added for Exchange2007(_SP1) servers
+- Problems with allday event solved (see version 0.7.30)
+- Tasks date and times are working now for different timezones.
+- Version is stable for production use.
+
+## [0.7.31] - unknown release date
+- Fixed upgrade problem between versions 0.7.29 and 0.7.30
+
+## [0.7.30] - unknown release date
+- Timezone is added correctly. There is even a difference between a 2010 or 2007 version of Exchange.
+- Starting mechanism is optimized.
+- A calendar reset is done completely now.
+- Known problem: If you add a alldayevent EWS will add an extra day infront of it. So 1 allday becomes two.
+
+## [0.7.29] - unknown release date
+- Added the posibility to change your reaction to an invitation request in the meetingresponse screen.
+
+## [0.7.28] - unknown release date
+- Addedd extra options to the EWS Settings.
+
+## [0.7.27] - unknown release date
+- Fixed bug 6. TB becomes unresponsive on paging back in week view.
+
+## [0.7.26] - unknown release date
+- Extra settings for each calendar (poll inbox)
+- Inbox poller results are better processed.
+- Settings are now saved in the right location within preferences..
+
+## [0.7.22] - unknown release date
+- Deleting of an occurrence from a string does work now.
+- Alarms can be dismissed or gesnoozed. 
+	This status is not saved between TB restarts.
+	This is an in memory status maintained by TB.
+
+## [0.7.21] - unknown release date
+- iTIP processing improved.
+
+## [0.7.20] - unknown release date
+- Settings and alarm on recurring appointments is better handled.
+
+## [0.7.19] - unknown release date
+- Fixed BUG 4.
+- Fixed BUG 5.
+- So called observers are broken down in the right way.
+
+## [0.7.18] - unknown release date
+- Fixed BUG 3.
+- Alarm changing improved.
+
+## [0.7.17] - unknown release date
+- Fixed BUG 2.
+
+## [0.7.16] - unknown release date
+- Task alarms are being set in the right way.
+- Dismiss or snooze the alarm of a task is working now.
+
+## [0.7.15] - unknown release date
+- Removed all storage of passwords in Memory. All password are only stored by the default Thunderbird Password Manager.
+
+## [0.7.14] - unknown release date
+- Imporved iTIP processing.
+
+## [0.7.13] - unknown release date
+- Source code cleanup.
+- Exception "nsIAuthPrompt2.asyncPromptAuth" solved.
+- Failures during creating connections to server are better handled.
+
+## [0.7.12] - unknown release date
+- Changed text on buttons for MessageRespons screen.
+- Fixed where it was not possible to create an alldayevent.
+- Dismissing an alarm will work.
+
+## [0.7.11] - unknown release date
+- Improved iTIP processing.
+
+## [0.7.10] - unknown release date
+- Fixed problem for date/time conversions. Through this problem some appointments were show on the wrong date or time.
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/attachments-view.js calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.js
--- calendar-exchange-provider-3.9.0/chrome/content/attachments-view.js	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.js	2017-07-03 22:10:10.000000000 +0200
@@ -44,6 +44,7 @@
 }
 
 exchAttachments.prototype = {
+	_initialized: false,
 
 	addAttachmentDialog: function _addAttachmentDialog()
 	{
@@ -227,45 +228,75 @@
 		}
 	},
 
+	/**
+	 * Receives asynchronous messages from the parent context that contains the iframe.
+	 *
+	 * @param {MessageEvent} aEvent  Contains the message being received
+	 */
+	receiveMessage: function _receiveMessage(aEvent) {
+		let validOrigin = gTabmail ? "chrome://messenger" : "chrome://calendar";
+		if (aEvent.origin !== validOrigin) {
+			return;
+		}
+		switch (aEvent.data.command) {
+			case "exchWebService_addAttachmentDialog": this.addAttachmentDialog(); break;
+		}
+	},
+
 	onLoad: function _onLoad()
 	{
+		if(this._initialized){
+			return;
+		}
+
+		var self = this;
+
 		if (this._document.getElementById("calendar-task-tree")) {
 			this.globalFunctions.LOG("  -- calendar-task-tree --");
-			var self = this;
 			this._document.getElementById("calendar-task-tree").addEventListener("select", function(){ self.onSelectTask();}, true);
 			return;
-		} 
+		}
 
 		var args = this._window.arguments[0];
 		var item = args.calendarEvent;
 
-		//this.globalFunctions.LOG("  -- onLoad 2 ("+this.globalFunctions.STACKshort()+")");
 		this.attachmentListboxVisible = false;
 
+		// We can't update toolbar from iframe
 		if ((item.calendar) && (item.calendar.type == "exchangecalendar")) {
 			this.globalFunctions.LOG("  -- It is an Exchange Calendar event:"+item.title);
 
-			
-			try {
-				// Hide Lightning URL button 
-				this._document.getElementById("button-url").hidden = true;
-				this._document.getElementById("event-toolbar").setAttribute("currentset", "button-save,button-attendees,button-privacy,button-url,exchWebService-add-attachment-button,button-delete");
-				this._document.getElementById("exchWebService-add-attachment-button").hidden = false;
-				if(this._document.getElementById("options-attachments-menuitem")){
-				this._document.getElementById("options-attachments-menuitem").setAttribute("label", this._document.getElementById("exchWebService-add-attachment-button").getAttribute("label"));
-				this._document.getElementById("options-attachments-menuitem").setAttribute("command", "exchWebService_addAttachmentDialog");
-				}
+			if (this._document.getElementById("event-grid-attachment-row")) {
+				this._document.getElementById("event-grid-attachment-row").setAttribute("collapsed", true);
 			}
-			catch (ex) {this.globalFunctions.LOG("  -- Could not add exchange attachment buttons:"+ex.toString());}
 
-			// calendar-event-dialog (hide existing attachment view)
-			try {
-				this._document.getElementById("event-grid-attachment-row").setAttribute("collapsed", "true");
-			}
-			catch (ex) {}
+			// Modify context menu for the attachment list inside the "Attachment" panel
+			let attachmentListbox = this._document.getElementById("attachment-link");
+
+			attachmentListbox.setAttribute("context", "exchWebService-attachment-popup") ;
+			attachmentListbox.setAttribute("onkeypress", function (aEvent) { self.onKeyPress(aEvent);  }) ;
+			attachmentListbox.setAttribute("onclick", function (aEvent) { self.onSelect(aEvent);  }) ;
+			attachmentListbox.setAttribute("ondblclick", function (aEvent) { self.onDblClick(aEvent); }) ;
 
 			this.addAttachmentsFromItem(item);
+		} else {
+			if (this._document.getElementById("event-grid-attachment-row")) {
+				this._document.getElementById("event-grid-attachment-row").setAttribute("collapsed", false);
+			}
+
+			// Modify context menu for the attachment list inside the "Attachment" panel
+			let attachmentListbox = this._document.getElementById("attachment-link");
+
+			attachmentListbox.setAttribute("context", "attachment-popup") ;
+			attachmentListbox.setAttribute("onkeypress", "attachmentLinkKeyPress(event)") ;
+			attachmentListbox.setAttribute("onclick", "attachmentClick(event);") ;
+			attachmentListbox.setAttribute("ondblclick", "attachmentDblClick(event)") ;
 		}
+
+		// Add message listener to be able to receive message from parent window or tab
+		window.addEventListener("message", function(aEvent) { self.receiveMessage(aEvent); }, false);
+
+		this._initialized = true;
 	},
 
 	addAttachmentsFromItem: function _addAttachmentsFromItem(aItem)
@@ -584,6 +615,6 @@
 }
 
 var tmpAttachment = new exchAttachments(document, window);
-window.addEventListener("load", function _onLoad() { window.removeEventListener("load",arguments.callee,false); tmpAttachment.onLoad(); }, true);
+window.addEventListener("load", function _onLoad() { tmpAttachment.onLoad(); }, false);
 
 
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/attachments-view.xul calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.xul
--- calendar-exchange-provider-3.9.0/chrome/content/attachments-view.xul	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/attachments-view.xul	2017-07-03 22:10:10.000000000 +0200
@@ -47,20 +47,19 @@
 <overlay id="exchWebService-attachment-view"
          xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";>
 
-    <script type="application/javascript" src="chrome://exchangecalendar/content/attachments-view.js"/> 
+    <script type="application/javascript" src="chrome://exchangecalendar/content/attachments-view.js"/>
 
     <!-- Commands -->
-    <commandset id="itemCommands">
+    <commandset>
         <command id="exchWebService_openAttachment"
-                 oncommand="tmpAttachment.openAttachment();"/> 
+                 oncommand="tmpAttachment.openAttachment();"/>
         <command id="exchWebService_saveAttachment"
-                 oncommand="tmpAttachment.saveAttachment();"/> 
+                 oncommand="tmpAttachment.saveAttachment();"/>
         <command id="exchWebService_deleteAttachment"
-                 oncommand="tmpAttachment.deleteAttachment();"/> 
-	<command id="exchWebService_addAttachmentDialog"
-		 oncommand="tmpAttachment.addAttachmentDialog();"/>
+                 oncommand="tmpAttachment.deleteAttachment();"/>
     </commandset>
 
+    <!-- Update context popup-->
     <popupset id="event-dialog-popupset">
       <menupopup id="exchWebService-attachment-popup">
             <menuitem id="exchWebService-attachment-popup-open"
@@ -74,26 +73,9 @@
             <menuitem id="exchWebService-attachment-popup-delete"
                       label="&event.menu.item.delete.label;"
                       accesskey="&event.menu.item.delete.accesskey;"
-			disable-on-readonly="true"
+                      disable-on-readonly="true"
                       command="exchWebService_deleteAttachment"/>
       </menupopup>
     </popupset>
- 
-        <toolbarpalette id="event-toolbarpalette">
-		<toolbarbutton id="exchWebService-add-attachment-button" 
-			mode="dialog"
-			class="cal-event-toolbarbutton toolbarbutton-1"
-			label="&exchWebServie.add.attachment.button.label;"
-			disable-on-readonly="true"
-			removable="true"
-			command="exchWebService_addAttachmentDialog"
-			oncommand="tmpAttachment.addAttachmentDialog();" 
-			hidden="true"/>
-	</toolbarpalette>
-     <toolbar id="event-toolbar" defaultset="button-save,button-attendees,button-privacy,button-url,exchWebService-add-attachment-button,button-delete"> 
-     </toolbar> 
- 
 
 </overlay>
-
-
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog-attendees.xml calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog-attendees.xml
--- calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog-attendees.xml	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog-attendees.xml	2017-07-03 22:10:10.000000000 +0200
@@ -66,7 +66,7 @@
                          completedefaultindex="true"
                          forcecomplete="true"
                          minresultsforpopup="1"
-                         onblur="if (this.localName == 'textbox') document.getBindingParent(this).onBlurInput(event);"
+                         onblur="if (this.localName === 'textbox') document.getBindingParent(this).onBlurInput(event);"
                          ignoreblurwhilesearching="true"
                          oninput="this.setAttribute('dirty', 'true');">
             </xul:textbox>
@@ -138,7 +138,7 @@
 						  numRowsAdded++;
 					      }
 					  }
-					  if (numRowsAdded == 0) {
+					  if (numRowsAdded === 0) {
 					      this.appendAttendee(null, listbox, template, false);
 					  }
 
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.js calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.js
--- calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.js	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.js	2017-07-03 22:10:10.000000000 +0200
@@ -1,40 +1,10 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: GPL 3.0
- *
- * The contents of this file are subject to the General Public License
- * 3.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.gnu.org/licenses/gpl.html
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * -- Exchange 2007/2010 Calendar and Tasks Provider.
- * -- For Thunderbird with the Lightning add-on.
- *
- * Author: Michel Verbraak (info@1st-setup.nl)
- * Website: http://www.1st-setup.nl/wordpress/?page_id=133
- * email: exchangecalendar@extensions.1st-setup.nl
- *
- *
- * This code uses parts of the Microsoft Exchange Calendar Provider code on which the
- * "Exchange Data Provider for Lightning" was based.
- * The Initial Developer of the Microsoft Exchange Calendar Provider Code is
- *   Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London
- * Portions created by the Initial Developer are Copyright (C) 2009
- * the Initial Developer. All Rights Reserved.
- *
- * ***** BEGIN LICENSE BLOCK *****/
 var Cu = Components.utils;
 var Ci = Components.interfaces;
 var Cc = Components.classes;
 
-Cu.import("resource://calendar/modules/calUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
+Cu.import("resource://gre/modules/XPCOMUtils.jsm");
 
-function exchEventDialog(aDocument, aWindow)
+function exchCalendarEventDialog(aDocument, aWindow)
 {
 	this._document = aDocument;
 	this._window = aWindow;
@@ -43,334 +13,47 @@
 				.getService(Ci.mivFunctions);
 }
 
-exchEventDialog.prototype = {
-
-	_initialized: false,
-	_oldCallback: null,
-
-	onAcceptCallback: function _onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing)
-	{
-		if ((cal.isEvent(aItem)) && (aCalendar.type == "exchangecalendar")) {
-			if (!aItem.className) {
-				var newItem = Cc["@1st-setup.nl/exchange/calendarevent;1"]
-						.createInstance(Ci.mivExchangeEvent);
-				newItem.cloneToCalEvent(aItem);
-				aItem = newItem;
-			}
-		}
-
-		if ((!cal.isEvent(aItem)) && (aCalendar.type == "exchangecalendar")) {
-			// Save extra exchange fields to item.
-			if (!aItem.className) {
-				var newItem = Cc["@1st-setup.nl/exchange/calendartodo;1"]
-						.createInstance(Ci.mivExchangeTodo);
-				newItem.cloneToCalEvent(aItem);
-				aItem = newItem;
-			}
-
-			aItem.totalWork = this._document.getElementById("exchWebService-totalWork-count").value;
-			aItem.actualWork = this._document.getElementById("exchWebService-actualWork-count").value;
-			aItem.mileage = this._document.getElementById("exchWebService-mileage-count").value;
-			aItem.billingInformation = this._document.getElementById("exchWebService-billingInformation-count").value;
-			aItem.companies = this._document.getElementById("exchWebService-companies-count").value;
-		}
-
-try{
-		if (this.newItem) {
-			aItem.bodyType = "HTML";
-			aItem.body = this._document.getElementById("exchWebService-body-editor").content;
-		}
-		else {
-			if (aItem.bodyType == "HTML") {
-				aItem.body = this._document.getElementById("exchWebService-body-editor").content;
-			}
-		}
-}catch(err){dump("Error saving content\n");}
-
-		if (this._oldCallback) {
-			this._oldCallback(aItem, aCalendar, aOriginalItem, aIsClosing);
-		}
-	},
+exchCalendarEventDialog.prototype = {
 
+	/*
+	 * setup menu window and button toolbars when editing an Exchange item
+	 */
 	onLoad: function _onLoad()
 	{
-		//onLoad();
-		 this._document.getElementById("exchWebService-body-editor").setAttribute("scrollbars","yes");
- 		if (this._window.arguments[0].calendarEvent.calendar.type != "exchangecalendar") {
-			if (this._document.getElementById("item-description")) {
-				this._document.getElementById("item-description").hidden = false;
-			}
-			if (this._document.getElementById("exchWebService-body-editor")) {
-				this._document.getElementById("exchWebService-body-editor").hidden = true;
-			}
-			return;
-		}
+		let args = this._window.arguments[0];
+		let item = args.calendarEvent;
 
-		if (this._initialized) return;
-		this._oldCallback = this._window.onAcceptCallback;
-		var self = this;
-		this._window.onAcceptCallback = function(aItem, aCalendar, aOriginalItem, aIsClosing) { self.onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing); };
-
-		if (this._document.getElementById("todo-entrydate")) {
-			this._initialized = true;
-
-			var args = this._window.arguments[0];
-			var item = args.calendarEvent;
-			this.updateScreen(item, item.calendar);
-			//Cc["@mozilla.org/consoleservice;1"]
-	                //     .getService(Ci.nsIConsoleService).logStringMessage(item.exchangeXML);
-
-//dump("event.dialog: item.exchangeXML:"+item.exchangeXML+"\n");
-
-			if ((item.bodyType === undefined) || (item.bodyType == "HTML")) {
-				if (this._document.getElementById("item-description")) {
-					this._document.getElementById("item-description").hidden = true;
-				}
-				if (this._document.getElementById("exchWebService-body-editor")) {
-					this._document.getElementById("exchWebService-body-editor").hidden = false;
-					if (item.bodyType !== undefined) {
-						this._document.getElementById("exchWebService-body-editor").content = item.body;
-					}
-					else {
-						this.newItem = true;
-						if (item.body) {
-							if ((item.body.indexOf("<BODY>") > -1) || (item.body.indexOf("<body>") > -1)) {
-								this._document.getElementById("exchWebService-body-editor").content = item.body;
-							}
-							else {
-								this._document.getElementById("exchWebService-body-editor").content = this.globalFunctions.fromText2HTML(item.getProperty("DESCRIPTION"));
-							}
-						}
-						else {
-							this._document.getElementById("exchWebService-body-editor").content = this.globalFunctions.fromText2HTML(item.getProperty("DESCRIPTION"));
-						}
-					}
-				}
-			}
-			else {
-				if (this._document.getElementById("item-description")) {
-					this._document.getElementById("item-description").hidden = false;
-				}
-				if (this._document.getElementById("exchWebService-body-editor")) {
-					this._document.getElementById("exchWebService-body-editor").hidden = true;
-				}
-			}
-		}
-	},
-
-	updateScreen: function _updateScreen(aItem, aCalendar)
-	{
-		var item = aItem;
+		// We can't update toolbar from iframe
+		if ((item.calendar) && (item.calendar.type == "exchangecalendar")) {
 
-		if ((!cal.isEvent(item)) && (aCalendar.type == "exchangecalendar")) {
+			let eventToolbar = this._document.getElementById("event-toolbar");
 
-			var ownerLabel = this._document.getElementById("exchWebService-owner-label");
-			if (ownerLabel) {
-				ownerLabel.value = item.owner;
+			// If the standard add url button was enabled, hidde it and show exchangecalendar attachment
+			let currentSet = eventToolbar.getAttribute("currentset");
+			if (currentSet.indexOf("button-url") === 1
+					&& currentSet.indexOf("exchWebService-add-attachment-button") === -1) {
+				currentSet = currentSet.replace("button-url", "exchWebService-add-attachment-button");
 			}
 
-			try {
-				this._document.getElementById("exchWebService-details-row1").removeAttribute("collapsed");
-				this._document.getElementById("exchWebService-details-row2").removeAttribute("collapsed");
-				this._document.getElementById("exchWebService-details-row3").removeAttribute("collapsed");
-			}
-			catch (ex) {}
+			// Switch toolbar buttons display
+			this._document.getElementById("button-url").hidden = true;
+			this._document.getElementById("exchWebService-add-attachment-button").hidden = false;
 
-			this._document.getElementById("exchWebService-owner-row").setAttribute("collapsed", "false");
-			this._document.getElementById("exchWebService-details-separator").hidden = false;
+			// Switch window menu display
+			this._document.getElementById("options-attachments-menu").collapsed = true;
+			this._document.getElementById("exchWebService-options-attachments").collapsed = false;
 
-			if (item.className) {
-				this._document.getElementById("exchWebService-totalWork-count").value = item.totalWork;
-				this._document.getElementById("exchWebService-actualWork-count").value = item.actualWork;
-				this._document.getElementById("exchWebService-mileage-count").value = item.mileage;
-				this._document.getElementById("exchWebService-billingInformation-count").value = item.billingInformation;
-				this._document.getElementById("exchWebService-companies-count").value = item.companies;
-			}
+		} else {
+			// Switch toolbar buttons display
+			this._document.getElementById("button-url").hidden = false;
+			this._document.getElementById("exchWebService-add-attachment-button").hidden = true;
 
-			this._document.getElementById("event-grid-location-row").hidden = true;
-
-			// Clear reminder select list for todo
-			this._document.getElementById("reminder-none-separator").hidden = true;
-			this._document.getElementById("reminder-0minutes-menuitem").hidden = true;
-			this._document.getElementById("reminder-5minutes-menuitem").hidden = true;
-			this._document.getElementById("reminder-15minutes-menuitem").hidden = true;
-			this._document.getElementById("reminder-30minutes-menuitem").hidden = true;
-			this._document.getElementById("reminder-minutes-separator").hidden = true;
-			this._document.getElementById("reminder-1hour-menuitem").hidden = true;
-			this._document.getElementById("reminder-2hours-menuitem").hidden = true;
-			this._document.getElementById("reminder-12hours-menuitem").hidden = true;
-			this._document.getElementById("reminder-hours-separator").hidden = true;
-			this._document.getElementById("reminder-1day-menuitem").hidden = true;
-			this._document.getElementById("reminder-2days-menuitem").hidden = true;
-			this._document.getElementById("reminder-1week-menuitem").hidden = true;
-			
-			this._document.getElementById("timezone-starttime").hidden = true;
-			this._document.getElementById("timezone-endtime").hidden = true;
-
-			if (this._document.getElementById("item-repeat")) {
-				this._document.getElementById("item-repeat").addEventListener("command", function() { self.updateRepeat(); }, false);
-			}
-			//this.updateTime();
-			this.updateRepeat();
-		}
-		else {
-			try {
-				this._document.getElementById("exchWebService-details-row1").setAttribute("collapsed", "true");
-				this._document.getElementById("exchWebService-details-row2").setAttribute("collapsed", "true");
-				this._document.getElementById("exchWebService-details-row3").setAttribute("collapsed", "true");
-			}
-			catch (ex) {}
-
-			this._document.getElementById("exchWebService-owner-row").setAttribute("collapsed", "true");
-			this._document.getElementById("exchWebService-details-separator").hidden = true;
-
-			this._document.getElementById("event-grid-location-row").hidden = false;
-			this._document.getElementById("event-grid-recurrence-row").hidden=false;
-
-			// Clear reminder select list for todo
-			this._document.getElementById("reminder-none-separator").hidden = false;
-			this._document.getElementById("reminder-0minutes-menuitem").hidden = false;
-			this._document.getElementById("reminder-5minutes-menuitem").hidden = false;
-			this._document.getElementById("reminder-15minutes-menuitem").hidden = false;
-			this._document.getElementById("reminder-30minutes-menuitem").hidden = false;
-			this._document.getElementById("reminder-minutes-separator").hidden = false;
-			this._document.getElementById("reminder-1hour-menuitem").hidden = false;
-			this._document.getElementById("reminder-2hours-menuitem").hidden = false;
-			this._document.getElementById("reminder-12hours-menuitem").hidden = false;
-			this._document.getElementById("reminder-hours-separator").hidden = false;
-			this._document.getElementById("reminder-1day-menuitem").hidden = false;
-			this._document.getElementById("reminder-2days-menuitem").hidden = false;
-			this._document.getElementById("reminder-1week-menuitem").hidden = false;
-
-			this._document.getElementById("timezone-starttime").hidden = false;
-			this._document.getElementById("timezone-endtime").hidden = false;
-
-		}
-	},
-
-	// This will remove the time value from the repeat part and tooltip.
-	updateRepeat: function _updateRepeat()
-	{
-		var repeatDetails = this._document.getElementById("repeat-details").childNodes;
-		if (repeatDetails.length == 3) {
-			this._document.getElementById("repeat-details").removeChild(repeatDetails[2]);
-			var toolTip = repeatDetails[0].getAttribute("tooltiptext");
-			var tmpArray = toolTip.split("\n");
-			tmpArray.splice(2,1);
-			repeatDetails[0].setAttribute("tooltiptext", tmpArray.join("\n"));
-			repeatDetails[1].setAttribute("tooltiptext", tmpArray.join("\n"));
+			// Switch window menu display
+			this._document.getElementById("options-attachments-menu").collapsed = false;
+			this._document.getElementById("exchWebService-options-attachments").collapsed = true;
 		}
 	},
-
-	selectedCalendarChanged: function _selectedCalendarChanged(aMenuList)
-	{
-		updateCalendar();
-
-		this.updateScreen(this._window.calendarItem, getCurrentCalendar());
-	},
-
 }
 
-if (!exchWebService) var exchWebService = {};
-
-exchWebService.eventDialog = {
-
-    _initialized: false,
-    onLoad: function _onLoad() {
-        if (this._initialized) return;
-
-      //  exchWebService.eventDialog.updateAttendees();
-	}, 
-
-    editAttendees: function _editAttendees() {
-        let savedWindow = window;
-        let calendar = getCurrentCalendar();
-
-        var callback = function (attendees, organizer, startTime, endTime) {
-            savedWindow.attendees = attendees;
-            if (organizer) {
-                // In case we didn't have an organizer object before we
-                // added attendees to our event we take the one created
-                // by the 'invite attendee'-dialog.
-                if (savedWindow.organizer) {
-                    // The other case is that we already had an organizer object
-                    // before we went throught the 'invite attendee'-dialog. In that
-                    // case make sure we don't carry over attributes that have been
-                    // set to their default values by the dialog but don't actually
-                    // exist in the original organizer object.
-                    if (!savedWindow.organizer.id) {
-                        organizer.id = null;
-                    }
-                    if (!savedWindow.organizer.role) {
-                        organizer.role = null;
-                    }
-                    if (!savedWindow.organizer.participationStatus) {
-                        organizer.participationStatus = null;
-                    }
-                    if (!savedWindow.organizer.commonName) {
-                        organizer.commonName = null;
-                    }
-                }
-                savedWindow.organizer = organizer;
-            }
-            var duration = endTime.subtractDate(startTime);
-            startTime = startTime.clone();
-            endTime = endTime.clone();
-            var kDefaultTimezone = calendarDefaultTimezone();
-            gStartTimezone = startTime.timezone;
-            gEndTimezone = endTime.timezone;
-            gStartTime = startTime.getInTimezone(kDefaultTimezone);
-            gEndTime = endTime.getInTimezone(kDefaultTimezone);
-            gItemDuration = duration;
-          //  exchWebService.eventDialog.updateAttendees();
-            updateDateTime();
-            updateAllDay();
-            if (isAllDay != gStartTime.isDate) {
-                setShowTimeAs(gStartTime.isDate)
-            }
-        };
-
-        var startTime = gStartTime.getInTimezone(gStartTimezone);
-        var endTime = gEndTime.getInTimezone(gEndTimezone);
-
-        var isAllDay = getElementValue("event-all-day", "checked");
-        if (isAllDay) {
-            startTime.isDate = true;
-            endTime.isDate = true;
-            endTime.day += 1;
-        } else {
-            startTime.isDate = false;
-            endTime.isDate = false;
-        }
-
-        var menuItem = document.getElementById('options-timezone-menuitem');
-        var displayTimezone = true;
-        if( menuItem != null)
-            displayTimezone = menuItem.getAttribute('checked') == 'true';
-
-        var args = new Object();
-        args.startTime = startTime;
-        args.endTime = endTime;
-        args.displayTimezone = displayTimezone;
-        args.attendees = window.attendees;
-        args.organizer = window.organizer && window.organizer.clone();
-        args.calendar = calendar;
-        args.item = window.calendarItem;
-        args.onOk = callback;
-        args.fbWrapper = window.fbWrapper;
-
-        // open the dialog modally
-        openDialog(
-            "chrome://calendar/content/calendar-event-dialog-attendees.xul",
-            "_blank",
-            "chrome,titlebar,modal,resizable",
-            args);
-    }
-}
-
-window.addEventListener("load", exchWebService.eventDialog.onLoad, false);
-
-
-var tmpEventDialog = new exchEventDialog(document, window);
-window.addEventListener("load", function () { window.removeEventListener("load",arguments.callee,false); tmpEventDialog.onLoad(); }, true);
-
+var ewsCalendarEventDialog = new exchCalendarEventDialog(document, window);
+window.addEventListener("load", function () { ewsCalendarEventDialog.onLoad(); }, false);
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.xul calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.xul
--- calendar-exchange-provider-3.9.0/chrome/content/calendar-event-dialog.xul	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/calendar-event-dialog.xul	2017-07-03 22:10:10.000000000 +0200
@@ -1,148 +1,62 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!--
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: GPL 3.0
- *
- * The contents of this file are subject to the General Public License
- * 3.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.gnu.org/licenses/gpl.html
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * ## Exchange 2007/2010 Calendar and Tasks Provider.
- * ## For Thunderbird with the Lightning add-on.
- *
- * Author: Michel Verbraak (info@1st-setup.nl)
- * Website: http://www.1st-setup.nl/wordpress/?page_id=133
- * email: exchangecalendar@extensions.1st-setup.nl
- *
- *
- * This code uses parts of the Microsoft Exchange Calendar Provider code on which the
- * "Exchange Data Provider for Lightning" was based.
- * The Initial Developer of the Microsoft Exchange Calendar Provider Code is
- *   Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London
- * Portions created by the Initial Developer are Copyright (C) 2009
- * the Initial Developer. All Rights Reserved.
- *
- * ***** BEGIN LICENSE BLOCK *****/
--->
-<?xml-stylesheet type="text/css" href="chrome://global/skin/"?>
-<?xml-stylesheet type="text/css" href="chrome://global/skin/xul.css"?>
-<?xml-stylesheet type="text/css" href="chrome://messenger/skin/messengercompose/messengercompose.css"?>
-<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/itemBodyEditor.css"?>
-<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/exchWebServiceEditor.css"?>
+
 <!DOCTYPE dialog [
-    
-<!ENTITY % eventDialogDTD SYSTEM "chrome://calendar/locale/calendar-event-dialog.dtd">
+    <!ENTITY % eventDialogDTD SYSTEM "chrome://calendar/locale/calendar-event-dialog.dtd">
     %eventDialogDTD;
-    
-<!ENTITY % dtd1 SYSTEM "chrome://exchangecalendar/locale/calendar-event-dialog.dtd" > 
+    <!ENTITY % dtd1 SYSTEM "chrome://exchangecalendar/locale/attachments-view.dtd" >
     %dtd1;
 ]>
-<?xul-overlay href="chrome://exchangecalendar/content/attachments-view.xul"?>
-<overlay id="exchWebService-calendar-event-dialog.xul"
-    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";>
+
+<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/attachments-view.css"?>
+<?xml-stylesheet type="text/css" href="chrome://calendar/skin/calendar-event-dialog.css"?>
+<?xml-stylesheet type="text/css" href="chrome://calendar/content/calendar-event-dialog.css"?>
+
+
+<overlay id="exchWebService-calendar-event-dialog"
+         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";>
+
     <script type="application/javascript" src="chrome://exchangecalendar/content/calendar-event-dialog.js"/>
-    <script type="application/javascript" src="chrome://calendar/content/calendar-event-dialog.js"/>
-    <command id="cmd_attendees"
-			 oncommand="exchWebService.eventDialog.editAttendees();"/>
-    <rows id="event-grid-rows" insertbefore = "event-grid-alarmrow">
-        <row id="exchWebService-owner-row" collapsed="true" insertafter="event-grid-title-row">
-            <label value="&exchWebService.owner.label;"/>
-            <label id="exchWebService-owner-label" value=""/>
-        </row>
-        <row id="event-grid-category-color-row">
-            <hbox id="event-grid-category-box">
-                <menulist id="item-calendar" oncommand="tmpEventDialog.selectedCalendarChanged(this);"/>
-            </hbox>
-        </row>
-        <separator id="exchWebService-details-separator" hidden="true" class="groove" insertafter="event-grid-todo-status-row"/>
-        <row id="exchWebService-details-row1" align="center"
-			collapsed="true" insertafter="exchWebService-details-separator">
-            <label value="&exchWebService.totalWork.label;"
-				disable-on-readonly="true"/>
-            <hbox  align="center">
-                <textbox id="exchWebService-totalWork-count"
-					increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/>
-                <label value="&exchWebService.mileage.label;"
-					disable-on-readonly="true"/>
-                <textbox id="exchWebService-mileage-count" value="" disable-on-readonly="true"/>
-            </hbox>
-        </row>
-        <row id="exchWebService-details-row2" align="center"
-			collapsed="true" insertafter="exchWebService-details-row1">
-            <label value="&exchWebService.actualWork.label;"
-				disable-on-readonly="true"/>
-            <hbox  align="center">
-                <textbox id="exchWebService-actualWork-count"
-					increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/>
-                <label value="&exchWebService.billingInformation.label;"
-					disable-on-readonly="true"/>
-                <textbox id="exchWebService-billingInformation-count" value="" disable-on-readonly="true"/>
-            </hbox>
-        </row>
-        <row id="exchWebService-details-row3" align="center"
-			collapsed="true" insertafter="exchWebService-details-row2">
-            <label value="&exchWebService.companies.label;"
-				disable-on-readonly="true"/>
-            <textbox id="exchWebService-companies-count" value="" disable-on-readonly="true"/>
-        </row>
-    </rows>
-    <rows flex="1" id="event-grid-rows" >
-        <row id="exchWebService-owner-row" collapsed="true" insertafter="event-grid-title-row">
-            <label value="&exchWebService.owner.label;"/>
-            <label id="exchWebService-owner-label" value=""/>
-        </row>
-        <row id="event-grid-category-color-row">
-            <hbox id="event-grid-category-box">
-                <menulist id="item-calendar" oncommand="tmpEventDialog.selectedCalendarChanged(this);"/>
-            </hbox>
-        </row>
-        <separator id="exchWebService-details-separator" hidden="true" class="groove" insertafter="event-grid-todo-status-row"/>
-        <row id="exchWebService-details-row1" align="center"
-			collapsed="true" insertafter="exchWebService-details-separator">
-            <label value="&exchWebService.totalWork.label;"
-				disable-on-readonly="true"/>
-            <hbox  align="center">
-                <textbox id="exchWebService-totalWork-count"
-					increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/>
-                <label value="&exchWebService.mileage.label;"
-					disable-on-readonly="true"/>
-                <textbox id="exchWebService-mileage-count" value="" disable-on-readonly="true"/>
-            </hbox>
-        </row>
-        <row id="exchWebService-details-row2" align="center"
-			collapsed="true" insertafter="exchWebService-details-row1">
-            <label value="&exchWebService.actualWork.label;"
-				disable-on-readonly="true"/>
-            <hbox  align="center">
-                <textbox id="exchWebService-actualWork-count"
-					increment="10" min="0" type="number" size="3" value="0" disable-on-readonly="true"/>
-                <label value="&exchWebService.billingInformation.label;"
-					disable-on-readonly="true"/>
-                <textbox id="exchWebService-billingInformation-count" value="" disable-on-readonly="true"/>
-            </hbox>
-        </row>
-        <row id="exchWebService-details-row3" align="center"
-			collapsed="true" insertafter="exchWebService-details-row2">
-            <label value="&exchWebService.companies.label;"
-				disable-on-readonly="true"/>
-            <textbox id="exchWebService-companies-count" value="" disable-on-readonly="true"/>
-        </row>
-    </rows>
-    <tabbox
-        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"; id="event-grid-tabbox" 		selectedIndex="2" flex="1">
-        <tabpanels id="event-grid-tabpanels" flex="1" selectedIndex="2">
-            <tabpanel id="event-grid-tabpanel-description">
-                <itemBodyEditor id="exchWebService-body-editor" 
-					flex="1" 
-					insertafter="item-description" 
-					disable-on-readonly="true"/>
-            </tabpanel> 
-        </tabpanels>
-    </tabbox>
-</overlay>
\ Kein Zeilenumbruch am Dateiende.
+
+    <!-- Commands -->
+    <commandset id="itemCommands">
+        <command id="exchWebService_addAttachmentDialog"
+                 oncommand='sendMessage( {command: "exchWebService_addAttachmentDialog"} );'/>
+    </commandset>
+
+    <!-- Update windows menu -->
+    <toolbox id="event-toolbox">
+        <menubar id="event-menubar">
+            <menu id="options-menu">
+                <menupopup id="options-menupopup">
+                    <menu id="options-attachments-menu"
+                          collapsed="false" />
+
+                    <menuitem id="exchWebService-options-attachments"
+                              insertafter="options-attendees-menuitem"
+                              label="&exchWebServie.add.attachment.button.label;"
+                              command="exchWebService_addAttachmentDialog"
+                              collapsed="true" />
+                </menupopup>
+            </menu>
+        </menubar>
+    </toolbox>
+
+    <!-- Update toolbar -->
+    <toolbarpalette id="event-toolbarpalette">
+        <toolbarbutton id="exchWebService-add-attachment-button"
+            mode="dialog"
+            class="cal-event-toolbarbutton toolbarbutton-1"
+            label="&exchWebServie.add.attachment.button.label;"
+            disable-on-readonly="true"
+            removable="true"
+            command="exchWebService_addAttachmentDialog"
+            hidden="true"/>
+    </toolbarpalette>
+
+    <!-- Add exchangecalendar attachment button
+         Note: defaultset needs to be synced with common-central/calendar/base/content/dialogs/calendar-event-dialog.xul -->
+     <toolbar id="event-toolbar"
+        defaultset="button-saveandclose,button-attendees,button-privacy,button-url,exchWebService-add-attachment-button,button-delete" >
+     </toolbar>
+
+</overlay>
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/ecCalendarCreation.js calendar-exchange-provider-4.0.0~beta4/chrome/content/ecCalendarCreation.js
--- calendar-exchange-provider-3.9.0/chrome/content/ecCalendarCreation.js	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/ecCalendarCreation.js	2017-07-03 22:10:10.000000000 +0200
@@ -147,50 +147,65 @@
 	
 	},
 
+	/*
+	 * saveSettings: save calendar settings after calendar wizard completed
+	 *
+	 * Lightning original code to save calendar can be found in:
+	 * comm-central/calendar/resources/content/calendarCreation.js
+	 */
 	saveSettings: function _saveSettings()
 	{
 		this.globalFunctions.LOG("saveSettings Going to create the calendar in prefs.js");
 
-		// Calculate the new calendar.id
-		var newCalId = this.globalFunctions.getUUID();
+		// Calculate the new calendar.id and properties
+		let newCalId = this.globalFunctions.getUUID();
+		let newCalName = this._document.getElementById("calendar-name").value;
+		let newCalColor = this._document.getElementById("calendar-color").value;
 
 		// Save settings in dialog to new cal id.
 		tmpSettingsOverlay.exchWebServicesSaveExchangeSettingsByCalId(newCalId);
 
 		// Need to save the useOfflineCache preference separetly because it is not part of the main.
 		this.prefs = Cc["@mozilla.org/preferences-service;1"]
-	                    .getService(Ci.nsIPrefService)
-			    .getBranch("extensions.exchangecalendar@extensions.1st-setup.nl."+newCalId+".");
+			.getService(Ci.nsIPrefService)
+			.getBranch("extensions.exchangecalendar@extensions.1st-setup.nl."+newCalId+".");
 		this.prefs.setBoolPref("useOfflineCache", this._document.getElementById("exchange-cache").checked);
 		this.prefs.setIntPref("exchangePrefVersion", 1);
 
 		// We create a new URI for this calendar which will contain the calendar.id
-		var ioService = Cc["@mozilla.org/network/io-service;1"]  
-				.getService(Ci.nsIIOService);  
-		var tmpURI = ioService.newURI("https://auto/"+newCalId, null, null);  
+		var ioService = Cc["@mozilla.org/network/io-service;1"]
+				.getService(Ci.nsIIOService);
+		var tmpURI = ioService.newURI("https://auto/"+newCalId, null, null);
 
+		// Register calendar to global settings
+		var calPrefs = Cc["@mozilla.org/preferences-service;1"]
+			.getService(Ci.nsIPrefService)
+			.getBranch("calendar.registry."+newCalId+".");
+		calPrefs.setCharPref("name", newCalName);
+
+		// Create the new calendar object
+		// Should be synced with Lightning doCreateCalendar() code
 		var calManager = Cc["@mozilla.org/calendar/manager;1"]
 			.getService(Ci.calICalendarManager);
+
 		var newCal = calManager.createCalendar("exchangecalendar", tmpURI);
 
 		newCal.id = newCalId;
-		newCal.name = this._document.getElementById("calendar-name").value;
+		newCal.name = newCalName;
 
-		var calPrefs = Cc["@mozilla.org/preferences-service;1"]
-		            .getService(Ci.nsIPrefService)
-			    .getBranch("calendar.registry."+newCalId+".");
+		newCal.setProperty("color", newCalColor);
 
-		calPrefs.setCharPref("name", this._document.getElementById("calendar-name").value);
+		newCal.setProperty("cache.enabled", false);
 
-		newCal.setProperty("color", this._document.getElementById('calendar-color').color);
 		if (!this._document.getElementById("fire-alarms").checked) {
 			newCal.setProperty("suppressAlarms", true);
 		}
+		// End of sync
 
+		var emailCalendarIdentity = this._document.getElementById("email-identity-menulist").selectedItem;
 
-		var selItem = this._document.getElementById("email-identity-menulist").selectedItem;
-		if (selItem) {
-			var identity = selItem.getAttribute("value");
+		if (emailCalendarIdentity) {
+			var identity = emailCalendarIdentity.getAttribute("value");
 		}
 		else {
 			var identity = "";
@@ -199,13 +214,11 @@
 		newCal.setProperty("imip.identity.key", identity); 
 
 
-		newCal.setProperty("cache.enabled", false);
-
 		Cc["@mozilla.org/preferences-service;1"]
-	                    .getService(Ci.nsIPrefService).savePrefFile(null);
+			.getService(Ci.nsIPrefService).savePrefFile(null);
 
+		// Finally register completly the new calendar
 		calManager.registerCalendar(newCal);
-
 	},
 }
 
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/exchangeSettingsOverlay.js calendar-exchange-provider-4.0.0~beta4/chrome/content/exchangeSettingsOverlay.js
--- calendar-exchange-provider-3.9.0/chrome/content/exchangeSettingsOverlay.js	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/exchangeSettingsOverlay.js	2017-07-03 22:10:10.000000000 +0200
@@ -431,7 +431,7 @@
 	{
 		this.globalFunctions.LOG("exchWebServicesGetFolderOK: aFolderID:"+aFolderID+", aChangeKey:"+aChangeKey+", aFolderClass:"+aFolderClass);
 
-		if (aFolderClass == "IPF.Appointment") {
+		if (aFolderClass == "IPF.Appointment" || aFolderClass == "IPF.Task") {
 			this.exchWebServicesgFolderID = aFolderID;
 			this.exchWebServicesgChangeKey = aChangeKey;
 			this.gexchWebServicesDetailsChecked = true;
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/exchService-followup-event-dialog.xml calendar-exchange-provider-4.0.0~beta4/chrome/content/exchService-followup-event-dialog.xml
--- calendar-exchange-provider-3.9.0/chrome/content/exchService-followup-event-dialog.xml	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/exchService-followup-event-dialog.xml	2017-07-03 22:10:10.000000000 +0200
@@ -445,7 +445,7 @@
                   accesskey="&event.menu.options.accesskey;">
                 <menupopup id="options-menupopup"
                            onpopupshowing="onPopupShowing(this)">
-                  <menuitem id="options-attendess-menuitem"
+                  <menuitem id="options-attendees-menuitem"
                             label="&event.menu.options.attendees.label;"
                             accesskey="&event.menu.options.attendees.accesskey;"
                             command="cmd_attendees"
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/exchWebServiceEditor.xml calendar-exchange-provider-4.0.0~beta4/chrome/content/exchWebServiceEditor.xml
--- calendar-exchange-provider-3.9.0/chrome/content/exchWebServiceEditor.xml	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/exchWebServiceEditor.xml	2017-07-03 22:10:10.000000000 +0200
@@ -36,7 +36,12 @@
           xmlns:xul="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";>
 	<binding id="exchWebServiceEditor">
 
-    <content>
+	<!-- CSS needed to correctly display color buttons (font and background) -->
+	<resources>
+		<stylesheet src="chrome://messenger/skin/messengercompose/messengercompose.css" />
+	</resources>
+
+	<content>
 
 	<xul:vbox flex="1">
 		<xul:toolbox anonid="FormatToolbox" mode="icons">
@@ -105,7 +110,7 @@
 					state="state_all"/>
 				<xul:toolbarseparator class="toolbarseparator-standard"/>
 				<xul:toolbaritem class="formatting-button">
-					<xul:stack align="enter" state="rgb(102,102,102)">
+					<xul:stack align="center" state="rgb(102,102,102)">
 						<xul:box style="background-color:#FFFFFF"
 							anonid="cmd_backgroundColor"
 							class="color-button"
@@ -192,63 +197,72 @@
 			flex="1"/>
 	</xul:vbox>
 
-    </content>
+	</content>
 	<implementation>
 		<constructor><![CDATA[
-			this.editorElement = document.getAnonymousElementByAttribute(this, "anonid", "editor");
 			var self=this;
+
+			// To be able to set correct HTML content
+			this.globalFunctions = Components.classes["@1st-setup.nl/global/functions;1"]
+				.getService(Components.interfaces.mivFunctions);
+
+			this.editorElement = document.getAnonymousElementByAttribute(this, "anonid", "editor");
 			if (this.editorElement) {
 				this.commandManager = this.editorElement.commandManager;
 				this.editorClickFunction = function(aEvent) { self.onClickEditor(aEvent);};
-				this.editorElement.addEventListener("click", this.editorClickFunction, true);
+				this.editorElement.addEventListener("click", this.editorClickFunction, false);
 
 				this.editorDblClickFunction = function(aEvent) { self.onDblClickEditor(aEvent);};
-				this.editorElement.addEventListener("dblclick", this.editorDblClickFunction, true);
+				this.editorElement.addEventListener("dblclick", this.editorDblClickFunction, false);
 
 				this.editorKeyPressFunction = function(aEvent) { self.onKeyPressEditor(aEvent);};
-				this.editorElement.addEventListener("keyup", this.editorKeyPressFunction, true);
+				this.editorElement.addEventListener("keyup", this.editorKeyPressFunction, false);
 
 				this.editorMouseOver = function(aEvent) { self.onMouseOver(aEvent);};
-				this.editorMouseOut = function(aEvent) { self.onMouseOut(aEvent);};
-
 				this.editorElement.addEventListener("mouseover", this.editorMouseOver , false);
+
+				this.editorMouseOut = function(aEvent) { self.onMouseOut(aEvent);};
 				this.editorElement.addEventListener("mouseout", this.editorMouseOut, false);
 
+				// Set default document to empty HTML content
+				this.editorElement.contentDocument.documentElement.innerHTML = this.globalFunctions.fromText2HTML(null);
 			}
 
-			this.atomService = Components.classes["@mozilla.org/atom-service;1"].getService(Components.interfaces.nsIAtomService);
+			this.atomService = Components.classes["@mozilla.org/atom-service;1"]
+				.getService(Components.interfaces.nsIAtomService);
+
+			this.connectAllCommandListenerToolbar("FormatToolbar");
 
-			this.connectButtons("FormatToolbar");
 			// Connect color button
 			this.bgColorFunction = function(){ self.selectColor("cmd_backgroundColor");};
 			var bgColorElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor")
-			bgColorElement.addEventListener("click", this.bgColorFunction, true);
+			bgColorElement.addEventListener("click", this.bgColorFunction, false);
 
 			this.fontColorFunction = function(){ self.selectColor("cmd_fontColor");};
 			var fontColorElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor")
-			fontColorElement.addEventListener("click", this.fontColorFunction, true);
+			fontColorElement.addEventListener("click", this.fontColorFunction, false);
 
 			this.highlightColor = "#FFFFFF";
 			this.fontColor = "#000000";
 
-			// Fill fontfac popup menu
+			// Connect FontFace popup menu
 			this.menuPopupFunction = function(event){ self.selectFont("cmd_fontFace", event.target.value);};
 			this.menuPopup = document.getAnonymousElementByAttribute(this, "anonid", "fontFaceSelect");
-			this.menuPopup.addEventListener("command", this.menuPopupFunction, true);
+			this.menuPopup.addEventListener("command", this.menuPopupFunction, false);
 			this.fillFontFace();
 
+			// Connect HyperLink buttons
 			this.addLinkFunction = function(){ self.addLink();};
 			var addLinkElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_add_link")
-			addLinkElement.addEventListener("click", this.addLinkFunction, true);
+			addLinkElement.addEventListener("click", this.addLinkFunction, false);
 
 			this.removeLinkFunction = function(){ self.removeLink();};
 			var removeLinkElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_remove_link")
-			removeLinkElement.addEventListener("click", this.removeLinkFunction, true);
+			removeLinkElement.addEventListener("click", this.removeLinkFunction, false);
 
 			this.editLinkFunction = function(){ self.editLink();};
 			var editLinkElement = document.getAnonymousElementByAttribute(this, "anonid", "cmd_edit_link")
-			editLinkElement.addEventListener("click", this.editLinkFunction, true);
-
+			editLinkElement.addEventListener("click", this.editLinkFunction, false);
 		]]></constructor>
 
 		<destructor><![CDATA[
@@ -256,40 +270,52 @@
 				this.editorElement.removeEventListener("click", this.editorClickFunction, false);
 				this.editorElement.removeEventListener("keyup", this.editorKeyPressFunction, false);
 
-				this.editorElement.removeEventListener("dblclick", this.editorDblClickFunction, true);
+				this.editorElement.removeEventListener("dblclick", this.editorDblClickFunction, false);
 
 				this.editorElement.removeEventListener("mouseover", this.editorMouseOver , false);
 				this.editorElement.removeEventListener("mouseout", this.editorMouseOut, false);
 			}
-			this.disconnectButtons("FormatToolbar");
-			document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor").removeEventListener("click", this.bgColorFunction, false);
-			document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor").removeEventListener("click", this.fontColorFunction, false);
+
+			this.removeAllCommandListenerToolbar("FormatToolbar");
+
+			// Disconnect color button
+			document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor")
+				.removeEventListener("click", this.bgColorFunction, false);
+			document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor")
+				.removeEventListener("click", this.fontColorFunction, false);
+
+			// Disconnect Font face button
 			if (this.menuPopupFunction) {
 				this.menuPopup.removeEventListener("command", this.menuPopupFunction, false);
 			}
-			document.getAnonymousElementByAttribute(this, "anonid", "cmd_add_link").removeEventListener("click", this.addLinkFunction, true);
-			document.getAnonymousElementByAttribute(this, "anonid", "cmd_remove_link").removeEventListener("click", this.removeLinkFunction, true);
-			document.getAnonymousElementByAttribute(this, "anonid", "cmd_edit_link").removeEventListener("click", this.editLinkFunction, true);
+
+			// Disconnect HyperLink buttons
+			document.getAnonymousElementByAttribute(this, "anonid", "cmd_add_link")
+				.removeEventListener("click", this.addLinkFunction, false);
+			document.getAnonymousElementByAttribute(this, "anonid", "cmd_remove_link")
+				.removeEventListener("click", this.removeLinkFunction, false);
+			document.getAnonymousElementByAttribute(this, "anonid", "cmd_edit_link")
+				.removeEventListener("click", this.editLinkFunction, false);
 		]]></destructor>
 			
-			<property name="content">
-				<getter>
-				  <![CDATA[
-				    return this.editorElement.contentDocument.documentElement.innerHTML;
-				  ]]>
-				</getter>
-				<setter>
-				  <![CDATA[
-					if (this.editorElement) {
-						this.editorElement.contentDocument.documentElement.innerHTML = val;
-					}
-				  ]]>
-				</setter>
-			</property>
+		<property name="content">
+			<getter>
+			  <![CDATA[
+			    return this.editorElement.contentDocument.documentElement.innerHTML;
+			  ]]>
+			</getter>
+			<setter>
+			  <![CDATA[
+				if (this.editorElement) {
+					this.editorElement.contentDocument.documentElement.innerHTML = this.globalFunctions.fromText2HTML(val);
+				}
+			  ]]>
+			</setter>
+		</property>
 
 		<method name="fillFontFace">
 			<body><![CDATA[
-			if (gExchWebServiceLocalFonts == undefined) {
+			if (gExchWebServiceLocalFonts === undefined) {
 				// Build list of all local fonts once per editor
 				try {
 					var enumerator = Components.classes["@mozilla.org/gfx/fontenumerator;1"]
@@ -300,7 +326,7 @@
 				catch(e) { }
 			}
 
-			if (gExchWebServiceLocalFonts != undefined) {
+			if (gExchWebServiceLocalFonts !== undefined) {
 
 				var itemNode = document.createElementNS("http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";, "menuitem");
 				itemNode.setAttribute("label", "Variable width");
@@ -323,7 +349,7 @@
 		]]></body>
 		</method>
 
-		<method name="connectButtons">
+		<method name="connectAllCommandListenerToolbar">
 			<parameter name="aAnonId" />
 			<body><![CDATA[
 			var toolbar = document.getAnonymousElementByAttribute(this, "anonid", aAnonId);
@@ -335,15 +361,15 @@
 			if (toolbar) {
 				var toolbarButtons = toolbar.getElementsByTagName("xul:toolbarbutton");
 				for (var i=0; i<toolbarButtons.length;i++) {
-					if ((toolbarButtons[i].hasAttribute("connect")) && (toolbarButtons[i].getAttribute("connect") == "true")) {
-						this.connectButton(toolbarButtons[i].getAttribute("anonid"), aAnonId);
+					if ((toolbarButtons[i].hasAttribute("connect")) && (toolbarButtons[i].getAttribute("connect") === "true")) {
+						this.addCommandListener(toolbarButtons[i].getAttribute("anonid"), aAnonId);
 					}
 				}
 			}
 		]]></body>
 		</method>
 
-		<method name="connectButton">
+		<method name="addCommandListener">
 			<parameter name="aAnonId" />
 			<parameter name="aStore" />
 			<body><![CDATA[
@@ -353,22 +379,22 @@
 				this.functions[aStore] = {};
 			}
 			this.functions[aStore][aAnonId] = function() { self.toggleButton(aAnonId);};
-			document.getAnonymousElementByAttribute(this, "anonid", aAnonId).addEventListener("command", this.functions[aStore][aAnonId], true);
+			document.getAnonymousElementByAttribute(this, "anonid", aAnonId).addEventListener("command", this.functions[aStore][aAnonId], false);
 		]]></body>
 		</method>
 
-		<method name="disconnectButtons">
+		<method name="removeAllCommandListenerToolbar">
 			<parameter name="aAnonId" />
 			<body><![CDATA[
 			if ((this.functions) && (this.functions[aAnonId])) {
 				for (var name in this.functions[aAnonId]) {
-					this.disconnectButton(name, aAnonId);
+					this.removeCommandListener(name, aAnonId);
 				}
 			}
 		]]></body>
 		</method>
 
-		<method name="disconnectButton">
+		<method name="removeCommandListener">
 			<parameter name="aAnonId" />
 			<parameter name="aStore" />
 			<body><![CDATA[
@@ -391,10 +417,7 @@
 		<method name="onKeyPressEditor">
 			<parameter name="aEvent" />
 			<body><![CDATA[
-//if (aEvent) {
-//dump("aEvent.keyCode:"+aEvent.keyCode+"\n");
-//}
-			if ( ( (aEvent.keyCode > 36) && (aEvent.keyCode < 41) ) || (aEvent.keyCode == 33) || (aEvent.keyCode == 34)) {
+			if ( ( (aEvent.keyCode > 36) && (aEvent.keyCode < 41) ) || (aEvent.keyCode === 33) || (aEvent.keyCode === 34)) {
 				this.onClickEditor(aEvent);
 			}
 		]]></body>
@@ -405,12 +428,9 @@
 			<body><![CDATA[
 			{
 				var href = "";
-				var isKeyCommand = (event.type == "command");
+				var isKeyCommand = (event.type === "command");
 				var linkNode = isKeyCommand ? this.editorElement.commandDispatcher.focusedElement
 							: event.originalTarget;
-//dump("event.type:"+event.type+"\n");
-//dump("event.originalTarget:"+event.originalTarget+"\n");
-//dump("linkNode:"+linkNode+"\n");
 				while (linkNode instanceof Element) {
 					if (linkNode instanceof HTMLAnchorElement ||
 					  linkNode instanceof HTMLAreaElement ||
@@ -434,7 +454,6 @@
 					}
 					linkNode = linkNode.parentNode;
 				}
-//dump("href:"+href+"\n");
 				return href ? {href: href, linkNode: linkNode} : null;
 			}
 		]]></body>
@@ -482,27 +501,27 @@
 			}
 
 			var color = this.getCStringCommandState("cmd_fontColor", this.commandManager, this.editorElement.contentWindow, "state_attribute");
-			if (color == "") {
+			if (color === "") {
 				color = "transparent";
 			}
 			else {
 				color = this.ConvertRGBColorIntoHEXColor(color);
 			}
 			document.getAnonymousElementByAttribute(this, "anonid", "cmd_fontColor").setAttribute("style","background-color:"+color);
-			
+
 			var aFirst = { value: false };
 			var aAny = { value: false };
 			var aAll = { value: false };
 			var propAtom = this.atomService.getAtom("font");
 			var edElement = this.editorElement.getHTMLEditor(this.editorElement.contentWindow);
-			color = edElement.getInlinePropertyWithAttrValue(propAtom, "bgcolor", null, aFirst, aAny, aAll);			
+			color = edElement.getInlinePropertyWithAttrValue(propAtom, "bgcolor", null, aFirst, aAny, aAll);
 
 			document.getAnonymousElementByAttribute(this, "anonid", "cmd_backgroundColor").setAttribute("style","background-color:"+color);
 			
 			var font = this.getCStringCommandState("cmd_fontFace", this.commandManager, this.editorElement.contentWindow, "state_attribute");
 			font = font.replace(/"/g, "");
 			var fontElement;
-			if (font.indexOf(",") > -1) {
+			if (font.indexOf(",") !== -1) {
 				var fonts = font.split(",");
 				for(var i = 0; ((i<fonts.length) && (!fontElement)); i++) {
 					fontElement = document.getAnonymousElementByAttribute(this, "label", fonts[i]);
@@ -577,7 +596,7 @@
 
 			// Get current color
 			var color = this.getCStringCommandState(aAnonId, this.commandManager, this.editorElement.contentWindow, "state_attribute");
-			if (color == "") {
+			if (color === "") {
 				color = "transparent";
 			}
 			else {
@@ -594,7 +613,7 @@
 
 			element.setAttribute("style","background-color:"+colorObj.TextColor);
 
-			if (aAnonId == "cmd_fontColor") {
+			if (aAnonId === "cmd_fontColor") {
 				var state = Components.classes["@mozilla.org/embedcomp/command-params;1"]
 						.createInstance(Components.interfaces.nsICommandParams);
 				state.setCStringValue("state_attribute", colorObj.TextColor);
@@ -614,11 +633,20 @@
 			<body><![CDATA[
 			  if ( /rgb\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*\)/.test(color) ) {
 			    var r = Number(RegExp.$1).toString(16);
-			    if (r.length == 1) r = "0"+r;
+			    if (r.length === 1){
+			    	r = "0"+r;
+			    }
+
 			    var g = Number(RegExp.$2).toString(16);
-			    if (g.length == 1) g = "0"+g;
+			    if (g.length === 1) {
+			    	g = "0"+g;
+			    }
+
 			    var b = Number(RegExp.$3).toString(16);
-			    if (b.length == 1) b = "0"+b;
+			    if (b.length === 1) {
+			    	b = "0"+b;
+			    }
+
 			    return "#"+r+g+b;
 			  }
 			  else
@@ -662,7 +690,7 @@
 			if (this.commandManager) {
 				var button = document.getAnonymousElementByAttribute(this, "anonid", aAnonId);
 				if (button.hasAttribute("state")) {
-					if (aAnonId.indexOf("cmd_align") > -1) {
+					if (aAnonId.indexOf("cmd_align") !== -1) {
 						button.checked = (aAnonId.indexOf(this.getCStringCommandState("cmd_align", this.commandManager, this.editorElement.contentWindow, "state_attribute")) > 0);
 					}
 					else {
@@ -676,7 +704,7 @@
 			<parameter name="aAnonId" />
 			<body><![CDATA[
 			if (this.commandManager) {
-				if (aAnonId.indexOf("cmd_align") > -1) {
+				if (aAnonId.indexOf("cmd_align") !== -1) {
 					var state = Components.classes["@mozilla.org/embedcomp/command-params;1"]
 							.createInstance(Components.interfaces.nsICommandParams);
 					state.setCStringValue("state_attribute", aAnonId.substr(10));
@@ -685,7 +713,7 @@
 				else {
 					this.commandManager.doCommand(aAnonId, null, null);
 				}
-//				this.setButtonState(aAnonId);
+
 				this.onClickEditor();
 			}
 		]]></body>
@@ -693,35 +721,31 @@
 
 		<method name="addLink">
 			<body><![CDATA[
-//dump("addLink\n");
+
 				var result = window.prompt("Link URL:", "http://";);
 				if (result) {
 					var selObj = this.editorElement.contentDocument.getSelection();
-//dump("selObj.rangeCount:"+selObj.rangeCount+"\n");
+
 					var range  = selObj.getRangeAt(0);
 					var textElement = range.startContainer;
 					var parent = textElement.parentElement;
-//dump("parent:"+parent+"\n");
+
 					var startOffset = range.startOffset;
-//dump("1. parent.outerHTML:"+parent.outerHTML+"\n");
-//dump("range.startOffset:"+range.startOffset+"\n");
 					
 					var newLink = document.createElement("a");
 					newLink.setAttribute("href", result);
 					range.surroundContents(newLink);
-//dump("newLink.outerHTML:"+newLink.outerHTML+"\n");
 
 					var splitText = textElement.splitText(startOffset);
 					parent.insertBefore(newLink, splitText);
 					this.content = this.content;
-//dump("2. parent.outerHTML:"+parent.outerHTML+"\n");
 				}
 		]]></body>
 		</method>
 
 		<method name="removeLink">
 			<body><![CDATA[
-//dump("removeLink\n");
+
 			if (this.ceParams) {
 				var parent = this.ceParams.linkNode.parentElement;
 				while (this.ceParams.linkNode.firstChild) {
@@ -734,7 +758,7 @@
 
 		<method name="editLink">
 			<body><![CDATA[
-//dump("editLink\n");
+
 			if (this.ceParams) {
 				var result = window.prompt("Link URL:", this.ceParams.href);
 				if (result) {
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.js calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.js
--- calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.js	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.js	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,324 @@
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: GPL 3.0
+ *
+ * The contents of this file are subject to the General Public License
+ * 3.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * -- Exchange 2007/2010 Calendar and Tasks Provider.
+ * -- For Thunderbird with the Lightning add-on.
+ *
+ * Author: Michel Verbraak (info@1st-setup.nl)
+ * Website: http://www.1st-setup.nl/wordpress/?page_id=133
+ * email: exchangecalendar@extensions.1st-setup.nl
+ *
+ *
+ * This code uses parts of the Microsoft Exchange Calendar Provider code on which the
+ * "Exchange Data Provider for Lightning" was based.
+ * The Initial Developer of the Microsoft Exchange Calendar Provider Code is
+ *   Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * ***** BEGIN LICENSE BLOCK *****/
+var Cu = Components.utils;
+var Ci = Components.interfaces;
+var Cc = Components.classes;
+
+Cu.import("resource://calendar/modules/calUtils.jsm");
+Cu.import("resource://gre/modules/Services.jsm");
+
+function exchangeEventDialog(aDocument, aWindow)
+{
+	this._document = aDocument;
+	this._window = aWindow;
+
+	this.globalFunctions = Cc["@1st-setup.nl/global/functions;1"]
+				.getService(Ci.mivFunctions);
+}
+
+exchangeEventDialog.prototype = {
+	_initialized: false,
+	_oldCallback: null,
+
+	/*
+	 * onAcceptCallback: read caller content to save extra information if caller was exchangecalendar
+	 */
+	onAcceptCallback: function _onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing)
+	{
+		if (aCalendar.type === "exchangecalendar") {
+			if (cal.isEvent(aItem)) {
+				if (!aItem.className) {
+					var newItem = Cc["@1st-setup.nl/exchange/calendarevent;1"]
+						.createInstance(Ci.mivExchangeEvent);
+					newItem.cloneToCalEvent(aItem);
+					aItem = newItem;
+				}
+			}
+			else {
+				// Save extra exchange fields to item.
+				if (!aItem.className) {
+					var newItem = Cc["@1st-setup.nl/exchange/calendartodo;1"]
+						.createInstance(Ci.mivExchangeTodo);
+					newItem.cloneToCalEvent(aItem);
+					aItem = newItem;
+				}
+
+				aItem.totalWork = this._document.getElementById("exchWebService-totalWork-count").value;
+				aItem.actualWork = this._document.getElementById("exchWebService-actualWork-count").value;
+				aItem.mileage = this._document.getElementById("exchWebService-mileage-count").value;
+				aItem.billingInformation = this._document.getElementById("exchWebService-billingInformation-count").value;
+				aItem.companies = this._document.getElementById("exchWebService-companies-count").value;
+			}
+
+			// Copy content from HTML editor
+			try{
+				if (this.newItem) {
+					aItem.bodyType = "HTML";
+					aItem.body = this._document.getElementById("exchWebService-body-editor").content;
+					this.newItem = false;
+				}
+				else if (aItem.bodyType === "HTML") {
+					aItem.body = this._document.getElementById("exchWebService-body-editor").content;
+				}
+			} catch(err) {
+				dump("Error saving content\n");
+			}
+		}
+
+		if (this._oldCallback) {
+			this._oldCallback(aItem, aCalendar, aOriginalItem, aIsClosing);
+		}
+	},
+
+	/*
+	 * Update repeat informations on Exchange tasks
+	 */
+	updateRepeat: function _updateRepeat()
+	{
+		var repeatDetails = this._document.getElementById("repeat-details").childNodes;
+		if (repeatDetails.length === 3) {
+			this._document.getElementById("repeat-details").removeChild(repeatDetails[2]);
+			var toolTip = repeatDetails[0].getAttribute("tooltiptext");
+			var tmpArray = toolTip.split("\n");
+			tmpArray.splice(2,1);
+			repeatDetails[0].setAttribute("tooltiptext", tmpArray.join("\n"));
+			repeatDetails[1].setAttribute("tooltiptext", tmpArray.join("\n"));
+		}
+	},
+
+	/*
+	 * Adds HTML editor for exchangecalendar items
+	 * Adds extra informations for Exchange tasks
+	 *
+	 * As the same dialog is used for non-Exchange tasks and for events, this function
+	 * removes too these details when necessary.
+	 */
+	updateScreen: function _updateScreen(aItem, aCalendar)
+	{
+		var item = aItem;
+
+		if (aCalendar.type === "exchangecalendar") {
+
+			// For all item type, enable HTML editor
+
+			// Set HTML content editor
+			let itemBodyEditor = this._document.getElementById("exchWebService-body-editor");
+
+			// Try to read directly item body, otherwise fallback to item description property
+			if (item.body) {
+				itemBodyEditor.content = item.body;
+
+				// As this dialog set the bodyType, we check it to know if it's a new Item or not
+				this.newItem = item.bodyType.toLowerCase() !== "html";
+			}
+			else {
+				this.newItem = true;
+				itemBodyEditor.content = item.getProperty("DESCRIPTION");
+			}
+
+			// Display HTML content editor
+			if (item.bodyType === undefined // item is not already defined
+					|| item.bodyType.toLowerCase() === "html" // current item contains HTML
+				) {
+				// Hidde original item description editor
+				this._document.getElementById("item-description").hidden = true;
+
+				// Display our own HTML content editor
+				itemBodyEditor.setAttribute("collapsed", "false");;
+
+				itemBodyEditor.setAttribute("scrollbars","yes");
+			}
+
+			// If not an event, add Exchange task extra informations
+			if (!cal.isEvent(item)) {
+
+				// Set and display task owner
+
+				var ownerLabel = this._document.getElementById("exchWebService-owner-label");
+				if (ownerLabel) {
+					ownerLabel.setAttribute("collapsed", "false");
+					ownerLabel.value = item.owner;
+				}
+
+				// Set and display Exchange task details
+
+				this._document.getElementById("exchWebService-details-separator").hidden = false;
+				this._document.getElementById("exchWebService-details-row1").collapsed = false;
+				this._document.getElementById("exchWebService-details-row2").collapsed = false;
+				this._document.getElementById("exchWebService-details-row3").collapsed = false;
+
+				if (item.className) {
+					this._document.getElementById("exchWebService-totalWork-count").value = item.totalWork;
+					this._document.getElementById("exchWebService-actualWork-count").value = item.actualWork;
+					this._document.getElementById("exchWebService-mileage-count").value = item.mileage;
+					this._document.getElementById("exchWebService-billingInformation-count").value = item.billingInformation;
+					this._document.getElementById("exchWebService-companies-count").value = item.companies;
+				}
+
+				// Remove some standard inputs
+
+				this._document.getElementById("event-grid-location-row").hidden = true;
+
+				this._document.getElementById("reminder-none-separator").hidden = true;
+				this._document.getElementById("reminder-0minutes-menuitem").hidden = true;
+				this._document.getElementById("reminder-5minutes-menuitem").hidden = true;
+				this._document.getElementById("reminder-15minutes-menuitem").hidden = true;
+				this._document.getElementById("reminder-30minutes-menuitem").hidden = true;
+				this._document.getElementById("reminder-minutes-separator").hidden = true;
+				this._document.getElementById("reminder-1hour-menuitem").hidden = true;
+				this._document.getElementById("reminder-2hours-menuitem").hidden = true;
+				this._document.getElementById("reminder-12hours-menuitem").hidden = true;
+				this._document.getElementById("reminder-hours-separator").hidden = true;
+				this._document.getElementById("reminder-1day-menuitem").hidden = true;
+				this._document.getElementById("reminder-2days-menuitem").hidden = true;
+				this._document.getElementById("reminder-1week-menuitem").hidden = true;
+
+				this._document.getElementById("timezone-starttime").hidden = true;
+				this._document.getElementById("timezone-endtime").hidden = true;
+
+				// Manage repeat for Exchange tasks
+
+				if (this._document.getElementById("item-repeat")) {
+					this._document.getElementById("item-repeat").addEventListener("command", function() { self.updateRepeat(); }, false);
+				}
+
+				this.updateRepeat();
+			}
+		}
+
+		// For events and other calendar type, hidde back all Exchange task details, display back standard items
+		if (cal.isEvent(item)
+			|| cal.type !== "exchangecalendar") {
+
+			// Hide Exchange task details
+
+			// Task owner
+			this._document.getElementById("exchWebService-owner-row").setAttribute("collapsed", "true");
+
+			// Task details
+			this._document.getElementById("exchWebService-details-separator").hidden = true;
+			this._document.getElementById("exchWebService-details-row1").collapsed = true;
+			this._document.getElementById("exchWebService-details-row2").collapsed = true;
+			this._document.getElementById("exchWebService-details-row3").collapsed = true;
+
+			// Reset standard form
+			this._document.getElementById("event-grid-location-row").hidden = false;
+			this._document.getElementById("event-grid-recurrence-row").hidden=false;
+
+			// Reset reminder select list for todo
+			this._document.getElementById("reminder-none-separator").hidden = false;
+			this._document.getElementById("reminder-0minutes-menuitem").hidden = false;
+			this._document.getElementById("reminder-5minutes-menuitem").hidden = false;
+			this._document.getElementById("reminder-15minutes-menuitem").hidden = false;
+			this._document.getElementById("reminder-30minutes-menuitem").hidden = false;
+			this._document.getElementById("reminder-minutes-separator").hidden = false;
+			this._document.getElementById("reminder-1hour-menuitem").hidden = false;
+			this._document.getElementById("reminder-2hours-menuitem").hidden = false;
+			this._document.getElementById("reminder-12hours-menuitem").hidden = false;
+			this._document.getElementById("reminder-hours-separator").hidden = false;
+			this._document.getElementById("reminder-1day-menuitem").hidden = false;
+			this._document.getElementById("reminder-2days-menuitem").hidden = false;
+			this._document.getElementById("reminder-1week-menuitem").hidden = false;
+
+			// Reset timezone start/end time
+			this._document.getElementById("timezone-starttime").hidden = false;
+			this._document.getElementById("timezone-endtime").hidden = false;
+		}
+
+		// Reset content editor when not exchangecalendar items
+		if (aCalendar.type !== "exchangecalendar") {
+			// Hidde HTML content editor
+			this._document.getElementById("item-description").hidden = false;
+			this._document.getElementById("exchWebService-body-editor").setAttribute("collapsed", "true");
+		}
+	},
+
+
+	/**
+	 * Receives asynchronous messages from the parent context that contains the iframe.
+	 *
+	 * @param {MessageEvent} aEvent  Contains the message being received
+	 */
+	receiveMessage: function _receiveMessage(aEvent) {
+		let validOrigin = gTabmail ? "chrome://messenger" : "chrome://calendar";
+		if (aEvent.origin !== validOrigin) {
+			return;
+		}
+		switch (aEvent.data.command) {
+			//case "exchWebService_addAttachmentDialog": this.addAttachmentDialog(); break;
+		}
+	},
+
+	/*
+	 * onLoad: setup event dialog window
+	 * - Update screen according to type of item (task / event)
+	 * - Add callback (once)
+	 **/
+	onLoad: function _onLoad()
+	{
+		// Update screen according to task / event
+		let item = this._window.calendarItem;
+		this.updateScreen(item, item.calendar);
+
+		if (this._initialized) {
+			return;
+		}
+
+		var self = this;
+
+		// Override dialog callback to add extra exchangecalendar information processing
+		this._oldCallback = this._window.onAcceptCallback;
+		this._window.onAcceptCallback = function(aItem, aCalendar, aOriginalItem, aIsClosing) {
+			self.onAcceptCallback(aItem, aCalendar, aOriginalItem, aIsClosing);
+		};
+
+		// Add message listener to be able to receive message from parent window or tab
+		window.addEventListener("message", function(aEvent) { self.receiveMessage(aEvent); }, false);
+
+		this._initialized = true;
+	},
+
+	/*
+	 * selectedCalendarChanged: modify event-dialog to add extra exchangecalendar info when an exchange calendar is selected
+	 */
+	selectedCalendarChanged: function _selectedCalendarChanged(aMenuList)
+	{
+		updateCalendar();
+
+		this.updateScreen(this._window.calendarItem, getCurrentCalendar());
+	}
+}
+
+
+var exchToolsEventDialog = new exchangeEventDialog(document, window);
+
+// Add our loader to update dialog window with Exchange extra widgets if needed
+window.addEventListener("load", function () { exchToolsEventDialog.onLoad(); }, false);
+
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.xul calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.xul
--- calendar-exchange-provider-3.9.0/chrome/content/lightning-item-iframe.xul	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/lightning-item-iframe.xul	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,151 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: GPL 3.0
+ *
+ * The contents of this file are subject to the General Public License
+ * 3.0 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.gnu.org/licenses/gpl.html
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * ## Exchange 2007/2010 Calendar and Tasks Provider.
+ * ## For Thunderbird with the Lightning add-on.
+ *
+ * Author: Michel Verbraak (info@1st-setup.nl)
+ * Website: http://www.1st-setup.nl/wordpress/?page_id=133
+ * email: exchangecalendar@extensions.1st-setup.nl
+ *
+ *
+ * This code uses parts of the Microsoft Exchange Calendar Provider code on which the
+ * "Exchange Data Provider for Lightning" was based.
+ * The Initial Developer of the Microsoft Exchange Calendar Provider Code is
+ *   Andrea Bittau <a.bittau@cs.ucl.ac.uk>, University College London
+ * Portions created by the Initial Developer are Copyright (C) 2009
+ * the Initial Developer. All Rights Reserved.
+ *
+ * ***** BEGIN LICENSE BLOCK *****/
+-->
+
+<!-- CSS for the HTML content editor -->
+<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/itemBodyEditor.css"?>
+<?xml-stylesheet type="text/css" href="chrome://exchangecalendar/skin/exchWebServiceEditor.css"?>
+
+<!-- Attachment overlay -->
+<?xul-overlay href="chrome://exchangecalendar/content/attachments-view.xul"?>
+
+<!DOCTYPE dialog [
+
+<!ENTITY % eventDialogDTD SYSTEM "chrome://calendar/locale/calendar-event-dialog.dtd">
+    %eventDialogDTD;
+
+<!ENTITY % dtd1 SYSTEM "chrome://exchangecalendar/locale/lightning-item-iframe.dtd" >
+    %dtd1;
+]>
+
+<overlay id="exchangecalendar-lightning-item-iframe.xul"
+    xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";>
+
+    <!-- Manage special Exchange items and provide attendee speicific dialog -->
+    <script type="application/javascript" src="chrome://exchangecalendar/content/lightning-item-iframe.js"/>
+
+    <!-- These rows correspond to the full form under the toolbar -->
+    <rows id="event-grid-rows">
+        <!-- If the current element is a Task and is an Exchange one, add a label to show the current owner of the task. -->
+        <row id="exchWebService-owner-row"
+            insertafter="event-grid-title-row"
+            align="center"
+            collapsed="true" >
+            <label value="&exchWebService.owner.label;" />
+            <label id="exchWebService-owner-label"
+                value="" />
+        </row>
+
+        <!-- When other calendar is selected, we have to clean the current dialog if the new calendar is not an Exchange one -->
+        <row id="event-grid-category-color-row">
+            <hbox id="event-grid-category-box">
+                <menulist id="item-calendar"
+                    oncommand="exchToolsEventDialog.selectedCalendarChanged(this); tmpAttachment.selectedCalendarChanged(this);" />
+            </hbox>
+        </row>
+
+        <!-- Exchange task details (hidden by defaults, displayed only by javascript) -->
+        <separator id="exchWebService-details-separator"
+            insertafter="event-grid-todo-status-row"
+            class="groove"
+            hidden="true" />
+
+        <row id="exchWebService-details-row1"
+            insertafter="exchWebService-details-separator"
+            align="center"
+            collapsed="true" >
+            <label value="&exchWebService.totalWork.label;"
+                disable-on-readonly="true" />
+
+            <hbox align="center">
+                <textbox id="exchWebService-totalWork-count"
+                    type="number" increment="10" min="0" size="3"
+                    value="0"
+                    disable-on-readonly="true" />
+
+                <label value="&exchWebService.mileage.label;"
+                    disable-on-readonly="true" />
+                <textbox id="exchWebService-mileage-count" value=""
+                    disable-on-readonly="true"/>
+            </hbox>
+        </row>
+
+        <row id="exchWebService-details-row2"
+            insertafter="exchWebService-details-row1"
+            align="center"
+            collapsed="true" >
+            <label value="&exchWebService.actualWork.label;"
+                disable-on-readonly="true" />
+
+            <hbox align="center">
+                <textbox id="exchWebService-actualWork-count"
+                    type="number" increment="10" min="0" size="3"
+                    value="0"
+                    disable-on-readonly="true" />
+
+                <label value="&exchWebService.billingInformation.label;"
+                    disable-on-readonly="true"/>
+                <textbox id="exchWebService-billingInformation-count"
+                    value=""
+                    disable-on-readonly="true"/>
+            </hbox>
+        </row>
+
+        <row id="exchWebService-details-row3"
+            insertafter="exchWebService-details-row2"
+            align="center"
+            collapsed="true" >
+            <label value="&exchWebService.companies.label;"
+                disable-on-readonly="true"/>
+            <textbox id="exchWebService-companies-count"
+                value=""
+                disable-on-readonly="true"/>
+        </row>
+    </rows>
+
+    <tabbox xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
+        id="event-grid-tabbox">
+
+        <tabpanels id="event-grid-tabpanels">
+            <!-- Add HTML text editor for Exchange tasks -->
+            <tabpanel id="event-grid-tabpanel-description">
+                <itemBodyEditor id="exchWebService-body-editor"
+                    flex="1"
+                    insertafter="item-description"
+                    disable-on-readonly="true"
+                    collapsed="true"/>
+            </tabpanel>
+
+        </tabpanels>
+    </tabbox>
+
+</overlay>
diff -Nru calendar-exchange-provider-3.9.0/chrome/content/msgHdrUtils.js calendar-exchange-provider-4.0.0~beta4/chrome/content/msgHdrUtils.js
--- calendar-exchange-provider-3.9.0/chrome/content/msgHdrUtils.js	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/content/msgHdrUtils.js	2017-07-03 22:10:10.000000000 +0200
@@ -208,18 +208,16 @@
 function msgHdrSetTags (aMsgHdr, aTags) {
   let oldTagList = msgHdrGetTags(aMsgHdr);
   let oldTags = {}; // hashmap
-  for each (let [, tag] in Iterator(oldTagList))
+  for (let tag of oldTagList)
     oldTags[tag.key] = null;
 
   let newTags = {};
   let newTagList = aTags;
-  for each (let [, tag] in Iterator(newTagList))
+  for (let tag of newTagList)
     newTags[tag.key] = null;
 
-  let toAdd = [x.key for each ([, x] in Iterator(newTagList))
-    if (!(x.key in oldTags))];
-  let toRemove = [x.key for each ([, x] in Iterator(oldTagList))
-    if (!(x.key in newTags))];
+  let toAdd = newTagList.filter( tag => !(tag.key in oldTags));
+  let toRemove = oldTagList.filter( tag => !(tag.key in newTags));
 
   let folder = aMsgHdr.folder;
   let msgHdr = toXPCOMArray([aMsgHdr], Ci.nsIMutableArray);
diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/mac/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/mac/attachments-view.css
--- calendar-exchange-provider-3.9.0/chrome/skins/mac/attachments-view.css	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/mac/attachments-view.css	2017-07-03 22:10:10.000000000 +0200
@@ -1,22 +1,20 @@
-#exchWebService-add-attachment-button {
-	-moz-image-region: rect(0px 96px 24px 72px);
-}
-#exchWebService-add-attachment-button[disabled="true"],
-#exchWebService-add-attachment-button[disabled="true"]:hover {
-	-moz-image-region: rect(48px 96px 72px 72px);
-}
-#exchWebService-add-attachment-button:hover {
-	-moz-image-region: rect(24px 96px 48px 72px);
-}
+/*
+ * Should be synced with chrome://calendar/skin/calendar-event-dialog.css
+ * especially the #button-url rules (as it displays the attachment icon)
+ */
 
-toolbar[iconsize="small"] #exchWebService-add-attachment-button {
-	-moz-image-region: rect(0px 64px 16px 48px);
+@media not all and (-moz-mac-yosemite-theme) {
+  #exchWebService-add-attachment-button  {
+    list-style-image: url(chrome://calendar-common/skin/calendar-toolbar-osxlion.svg#attach);
+  }
 }
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"],
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"]:hover {
-	-moz-image-region: rect(32px 64px 48px 48px);
-}
-toolbar[iconsize="small"] #exchWebService-add-attachment-button:hover {
-	-moz-image-region: rect(16px 64px 32px 48px);
+
+@media (-moz-mac-yosemite-theme) {
+  #exchWebService-add-attachment-button  {
+    list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach);
+  }
+
+toolbar[brighttext] #exchWebService-add-attachment-button {
+  list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted);
 }
 
diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/unix/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/unix/attachments-view.css
--- calendar-exchange-provider-3.9.0/chrome/skins/unix/attachments-view.css	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/unix/attachments-view.css	2017-07-03 22:10:10.000000000 +0200
@@ -1,21 +1,13 @@
-#exchWebService-add-attachment-button {
-	-moz-image-region: rect(0px 96px 24px 72px);
-}
-#exchWebService-add-attachment-button[disabled="true"],
-#exchWebService-add-attachment-button[disabled="true"]:hover {
-	-moz-image-region: rect(48px 96px 72px 72px);
-}
-#exchWebService-add-attachment-button:hover {
-	-moz-image-region: rect(24px 96px 48px 72px);
-}
+/*
+ * Should be synced with chrome://calendar/skin/calendar-event-dialog.css
+ * especially the #button-url rules (as it displays the attachment icon)
+ */
 
-toolbar[iconsize="small"] #exchWebService-add-attachment-button {
-	-moz-image-region: rect(0px 64px 16px 48px);
+#exchWebService-add-attachment-button  {
+  list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach);
 }
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"],
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"]:hover {
-	-moz-image-region: rect(32px 64px 48px 48px);
-}
-toolbar[iconsize="small"] #exchWebService-add-attachment-button:hover {
-	-moz-image-region: rect(16px 64px 32px 48px);
+
+toolbar[brighttext] #exchWebService-add-attachment-button {
+  list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted);
 }
+
diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/win/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/win/attachments-view.css
--- calendar-exchange-provider-3.9.0/chrome/skins/win/attachments-view.css	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/win/attachments-view.css	2017-07-03 22:10:10.000000000 +0200
@@ -1,21 +1,13 @@
-#exchWebService-add-attachment-button {
-	-moz-image-region: rect(0px 96px 24px 72px);
-}
-#exchWebService-add-attachment-button[disabled="true"],
-#exchWebService-add-attachment-button[disabled="true"]:hover {
-	-moz-image-region: rect(48px 96px 72px 72px);
-}
-#exchWebService-add-attachment-button:hover {
-	-moz-image-region: rect(24px 96px 48px 72px);
-}
+/*
+ * Should be synced with chrome://calendar/skin/calendar-event-dialog.css
+ * especially the #button-url rules (as it displays the attachment icon)
+ */
 
-toolbar[iconsize="small"] #exchWebService-add-attachment-button {
-	-moz-image-region: rect(0px 64px 16px 48px);
+#exchWebService-add-attachment-button  {
+  list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach);
 }
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"],
-toolbar[iconsize="small"] #exchWebService-add-attachment-button[disabled="true"]:hover {
-	-moz-image-region: rect(32px 64px 48px 48px);
+
+toolbar[brighttext] #exchWebService-add-attachment-button {
+  list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted);
 }
-toolbar[iconsize="small"] #exchWebService-add-attachment-button:hover {
-	-moz-image-region: rect(16px 64px 32px 48px);
-}
\ Kein Zeilenumbruch am Dateiende.
+
diff -Nru calendar-exchange-provider-3.9.0/chrome/skins/winaero/attachments-view.css calendar-exchange-provider-4.0.0~beta4/chrome/skins/winaero/attachments-view.css
--- calendar-exchange-provider-3.9.0/chrome/skins/winaero/attachments-view.css	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome/skins/winaero/attachments-view.css	2017-07-03 22:10:10.000000000 +0200
@@ -1,3 +1,13 @@
-#exchWebService-add-attachment-button {
-	-moz-image-region: rect(1px 71px 17px 55px);
+/*
+ * Should be synced with chrome://calendar/skin/calendar-event-dialog.css
+ * especially the #button-url rules (as it displays the attachment icon)
+ */
+
+#exchWebService-add-attachment-button  {
+  list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach);
 }
+
+toolbar[brighttext] #exchWebService-add-attachment-button {
+  list-style-image: url(chrome://calendar-common/skin/calendar-toolbar.svg#attach-inverted);
+}
+
diff -Nru calendar-exchange-provider-3.9.0/chrome.manifest calendar-exchange-provider-4.0.0~beta4/chrome.manifest
--- calendar-exchange-provider-3.9.0/chrome.manifest	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/chrome.manifest	2017-07-03 22:10:10.000000000 +0200
@@ -12,10 +12,14 @@
 overlay chrome://messenger/content/messenger.xul chrome://exchangecalendar/content/progress_panel.xul
 overlay chrome://calendar/content/calendar-task-view.xul chrome://exchangecalendar/content/messenger_task_delegation.xul
 overlay chrome://lightning/content/lightning-standalone.xul chrome://exchangecalendar/content/progress_panel.xul
+
 overlay chrome://calendar/content/calendar-event-dialog.xul chrome://exchangecalendar/content/calendar-event-dialog.xul
+overlay chrome://lightning/content/lightning-item-iframe.xul chrome://exchangecalendar/content/lightning-item-iframe.xul
+
 overlay chrome://calendar/content/calendar-event-dialog-reminder.xul chrome://exchangecalendar/content/calendar-event-dialog-reminder.xul
 overlay chrome://calendar/content/calendar-summary-dialog.xul chrome://exchangecalendar/content/calendar-summary-dialog.xul
 overlay chrome://calendar/content/calendar-properties-dialog.xul chrome://exchangecalendar/content/calendar-properties-dialog.xul
+
 overlay chrome://messenger/content/messenger.xul chrome://exchangecalendar/content/sharedCalendarParser.xul application={3550f703-e582-4d05-9a08-453d09bdfdc6}
 overlay chrome://messenger/content/messenger.xul chrome://exchangecalendar/content/check4lightning.xul
 overlay chrome://messenger/content/preferences/preferences.xul  chrome://exchangecalendar/content/messenger-overlay-preferences.xul
@@ -46,6 +50,8 @@
 locale exchangecalendar ja-JP locale/exchangecalendar/ja-JP/
 locale exchangecalendar sv locale/exchangecalendar/sv/
 locale exchangecalendar ru locale/exchangecalendar/ru/
+locale exchangecalendar it-IT locale/exchangecalendar/it-IT/
+locale exchangecalendar tr locale/exchangecalendar/tr/
 
 manifest interfaces/exchangeCalendar/mivExchangeCalendar.manifest
 
diff -Nru calendar-exchange-provider-3.9.0/components/accountFunctions.js calendar-exchange-provider-4.0.0~beta4/components/accountFunctions.js
--- calendar-exchange-provider-3.9.0/components/accountFunctions.js	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/components/accountFunctions.js	1970-01-01 01:00:00.000000000 +0100
@@ -1,173 +0,0 @@
-/* ***** BEGIN LICENSE BLOCK *****
- * Version: GPL 3.0
- *
- * The contents of this file are subject to the General Public License
- * 3.0 (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- * http://www.gnu.org/licenses/gpl.html
- *
- * Software distributed under the License is distributed on an "AS IS" basis,
- * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- * for the specific language governing rights and limitations under the
- * License.
- *
- * -- Global Functions for Exchange Calendar and Exchange Contacts.
- * -- For Thunderbird.
- *
- * Author: Michel Verbraak (info@1st-setup.nl)
- * Website: http://www.1st-setup.nl/wordpress/?page_id=133
- * email: info@1st-setup.nl
- *
- *
- * ***** BEGIN LICENSE BLOCK *****/
-
-var Cc = Components.classes;
-var Ci = Components.interfaces;
-var Cu = Components.utils;
-var Cr = Components.results;
-var components = Components;
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource:///modules/Services.jsm");
-Cu.import("resource://exchangecalendar/ecFunctions.js");
-
-var EXPORTED_SYMBOLS = [];
-
-if (! exchWebService) var exchWebService = {};
-
-exchWebService.accountFunctions = {
-
-		prefs: Cc["@mozilla.org/preferences-service;1"]
-		                    .getService(Ci.nsIPrefService)
-				    .getBranch("extensions.exchangeWebServices.accounts."),
-
-		logInfo: function _logInfo(message)
-		{
-			exchWebService.commonFunctions.LOG("[exchWebService.accountFunctions] "+message + " ("+exchWebService.commonFunctions.STACKshort()+")");
-		},
-
-		getAccountIds: function _getAccountIds()
-		{
-			var ids = exchWebService.commonFunctions.safeGetCharPref(this.prefs, "ids", "");
-			this.logInfo("ids:"+ids);
-			return ids.split(",");
-		},
-
-		getAccounts: function _getAccounts()
-		{
-			var result = {};
-			var ids = this.getAccountIds()
-			for (var index in ids) {
-
-				if (ids[index] != "") {
-					this.logInfo("id:"+ids[index]);
-					result[ids[index]] = {};
-					this.getAccountById(ids[index], result[ids[index]]);
-				}
-			}
-
-			return result;
-		},
-
-		getAccountById: function _getAccountById(aId, aAccount)
-		{
-			var result = false;
-
-			this.logInfo("id:"+aId);
-			var children = this.prefs.getChildList(aId+".",{});
-			if (children.length > 0) {
-				result = true;
-				aAccount["id"] = aId;
-				for (var index in children) {
-					var attribute = children[index].substr(children[index].indexOf(".")+1);
-					switch (this.prefs.getPrefType(children[index])) {
-					case this.prefs.PREF_STRING:
-						aAccount[attribute] = this.prefs.getCharPref(children[index]);
-						break;
-					case this.prefs.PREF_INT:
-						aAccount[attribute] = this.prefs.getIntPref(children[index]);
-						break;
-					case this.prefs.PREF_BOOL:
-						aAccount[attribute] = this.prefs.getBoolPref(children[index]);
-						break;
-					}
-				}
-			}
-
-			return result;
-		},
-
-		getAccountByServer: function _getAccountByServer(aServer)
-		{
-			var accounts = this.getAccounts();
-			var account = null;
-			for (var index in accounts) {
-				if ((accounts[index].server) && (accounts[index].server.toLowerCase() == aServer.toLowerCase())) {
-					return accounts[index];
-				}
-			}
-		},
-
-		saveAccount: function _saveAccount(aAccount)
-		{
-			for (var index in aAccount) {
-				switch (typeof(aAccount[index])) {
-				case "string": 
-					this.prefs.setCharPref(aAccount.id+"."+index, aAccount[index]);
-					break;
-				case "number":
-					this.prefs.setIntPref(aAccount.id+"."+index, aAccount[index]);
-					break;
-				default:
-					this.logInfo("Unknown object index:"+index);
-				}
-			}
-
-			// Check if the ids all ready exists. If not add it.
-			var ids = this.getAccountIds();
-			var idExists = false;
-			for (var index in ids) {
-				if (ids[index] == aAccount.id) {
-					idExists = true;
-					break;
-				}
-			}
-			if (!idExists) {
-				ids.push(aAccount.id);
-				ids = ids.join(",");
-				this.prefs.setCharPref("ids", ids);
-			}
-		},
-
-		removeAccount: function _removeAccount(aAccount)
-		{
-			if (aAccount.id) {
-				this.removeAccountById(aAccount.id);
-			}
-		},
-
-		removeAccountById: function _removeAccountById(aAccountId)
-		{
-			this.prefs.deleteBranch(aAccountId);
-			// Remove from ids list.
-			var oldIds = this.getAccountIds();
-			var newIds = [];
-			for (var index in oldIds) {
-				if (oldIds[index] != aAccountId) {
-					newIds.push(oldIds[index]);
-				}
-			}
-
-			if (newIds.length > 0) {
-				newIds = newIds.join(",");
-			}
-			else {
-				newIds = "";
-			}
-			this.prefs.setCharPref("ids", newIds);
-		},
-
-
-}
-
-
diff -Nru calendar-exchange-provider-3.9.0/components/ecExchangeRequest.js calendar-exchange-provider-4.0.0~beta4/components/ecExchangeRequest.js
--- calendar-exchange-provider-3.9.0/components/ecExchangeRequest.js	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/components/ecExchangeRequest.js	2017-07-03 22:10:10.000000000 +0200
@@ -66,7 +66,9 @@
 
 var gExchangeRequestVersion = "0.1";
 
-if (! exchWebService) var exchWebService = {};
+if (! exchWebService) {
+	var exchWebService = {};
+}
 
 exchWebService.prePasswords = {};
 
@@ -87,10 +89,10 @@
 	this.shutdown = false;
 	this.badCert = false;
 	this.badCertCount = 0;
-	this._notificationCallbacks = null;
+	this.channelCallbackEcAuthPrompt2 = null;
 
 	this.globalFunctions = Cc["@1st-setup.nl/global/functions;1"]
-				.getService(Ci.mivFunctions);
+		.getService(Ci.mivFunctions);
 
 	this.uuid = this.globalFunctions.getUUID();
 
@@ -99,22 +101,22 @@
 	this.kerberos = true;
 
 	this.prefB = Cc["@mozilla.org/preferences-service;1"]
-			.getService(Ci.nsIPrefBranch);
+		.getService(Ci.nsIPrefBranch);
 
 	this.exchangeStatistics = Cc["@1st-setup.nl/exchange/statistics;1"]
-			.getService(Ci.mivExchangeStatistics);
+		.getService(Ci.mivExchangeStatistics);
 
 	this.exchangeBadCertListener2 = Cc["@1st-setup.nl/exchange/badcertlistener2;1"]
-			.getService(Ci.mivExchangeBadCertListener2);
+		.getService(Ci.mivExchangeBadCertListener2);
 
-	this.observerService = Cc["@mozilla.org/observer-service;1"]  
-	                          .getService(Ci.nsIObserverService); 
+	this.observerService = Cc["@mozilla.org/observer-service;1"]
+		.getService(Ci.nsIObserverService);
+	this.observerService.addObserver(this, "http-on-modify-request", true);
 
 	this.timeZones = Cc["@1st-setup.nl/exchange/timezones;1"]
-				.getService(Ci.mivExchangeTimeZones);
-				
-	this.xml2json = false;
+		.getService(Ci.mivExchangeTimeZones);
 
+	this.xml2json = false;
 }
 
 ExchangeRequest.prototype = {
@@ -156,9 +158,42 @@
 
 	ERR_PASSWORD_ERROR: -300, // To many password errors.
 
+	QueryInterface: XPCOMUtils.generateQI([Ci.nsISupportsWeakReference, Ci.nsIObserver]),
+
+	/*
+	In Mozilla bug 1221320, changes were done to XMLHttpRequest so that the authPrompt dialog only appears
+	if neither username nor password is set in the request URL. So you only asyncPromptAuth called when both
+	are blank. But Exchange calendar sets a username on the first authentication attempt (supporting Basic
+	and Kerberos), expecting a callback to asyncPromptAuth if that fails, which it does for NTLM.
+
+	Further changes to authentication are all controlled through these asyncPromptAuth calls which never occur, hence failure. What we
+	do with the observer is reverse the effect of that bug, adding back the calls to asyncPromptAuth
+	*/
+	observe(aSubject, aTopic, aData) {
+		let channel = aSubject.QueryInterface(Components.interfaces.nsIHttpChannel);
+		this.logInfo("ecExchangeRequest observing http-on-modify-request for URI " + channel.URI.spec +
+		             " originalURI " + (channel.originalURI ? channel.originalURI.spec : "none"));
+
+		// Only respond to our host
+		let myHost = this.xmlReq && this.xmlReq.channel && this.xmlReq.channel.URI.host;
+		let theirHost = channel.URI.host;
+		if (myHost && (myHost != theirHost)) {
+			this.logInfo("Host does not match, theirs: " + theirHost + " mine: " + myHost);
+			return;
+		}
+
+		let internalChannel = channel.QueryInterface(Ci.nsIHttpChannelInternal);
+		if (internalChannel.blockAuthPrompt) {
+			this.logInfo("unblocking request");
+			internalChannel.blockAuthPrompt = false;
+		}
+		else
+			this.logInfo("Already unblocked");
+	},
+
 	get debug()
 	{
-		if ((this.debuglevel == 0) || (!this.globalFunctions.shouldLog())) {
+		if ((this.debuglevel === 0) || (!this.globalFunctions.shouldLog())) {
 			return false;
 		}
 
@@ -172,7 +207,9 @@
 
 	logInfo: function _logInfo(aMsg, aLevel)
 	{
-		if (!aLevel)  aLevel = 1;
+		if (!aLevel) {
+			aLevel = 1;
+		}
 
 		if ((this.debug) && (aLevel <= this.debuglevel)) {
 			this.globalFunctions.LOG(this.uuid+": "+aMsg);
@@ -201,137 +238,176 @@
 
 	sendRequest: function(aData, aUrl)
 	{
+		// Stop process while exchangecalendar is shutted down
 		if (this.shutdown) {
 			return;
 		}
 
-//		this.logInfo(": sendRequest\n");
-		this.mData = aData;
-		this.currentUrl = "";
-
-		while ((!aUrl) && (this.urllist.length > 0 )) {
+		//////////////////////////////////
+		// Looking for URL to send data //
+		//////////////////////////////////
+		this.currentUrl = null;
+
+		// If no URL is given, try cached next known URL
+		// This handle the process of AutoDiscovery while list of URLs to try is not empty
+		if ((!aUrl) && (this.urllist.length > 0 )) {
 			aUrl = this.urllist[0];
 			this.urllist.shift();
 		}
 
-		if ((!aUrl) || (aUrl == "") || (aUrl == undefined)) {
-			this.fail(this.ER_ERROR_INVALID_URL, "No url to send request to (sendRequest).");
+		// If no URL is given and we have tried every known URL, stop process
+		if ((!aUrl) || (aUrl === "") || (aUrl === undefined)) {
+			this.fail(this.ER_ERROR_INVALID_URL,
+				"No url to send request to (sendRequest).");
 			return;
 		}
 
-		this.currentUrl = aUrl;
-
-		if (this.exchangeBadCertListener2.userCanceledCertProblem(this.currentUrl)) {
-			this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled adding server certificate for url="+this.currentUrl+". Aborting this request.");
+		// If previously user canceled request on the "Certification issue dialog" for this URL,
+		// we have to not go further with this one
+		if (this.exchangeBadCertListener2.userCanceledCertProblem(aUrl)) {
+			this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION,
+				"User previously canceled adding server certificate for url=" + aUrl + ". Aborting this request.");
 			return;
 		}
 
-		// remove domain part in xmlhttprequest.open call
+		// We found an URL to send data, save it to current process
+		this.currentUrl = aUrl;
+
+		/////////////////////////////
+		// Processing data to send //
+		/////////////////////////////
+		this.mData = aData;
+
+		//////////////////////////////////////
+		// Looking for user authentications //
+		////////////////////////////////////
 		var openUser = this.mArgument.user;
-/*		if (openUser.indexOf("\\") > -1) {
-			openUser = openUser.substr(openUser.indexOf("\\")+1);
-		}*/
+		var password = null;
+
+		var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(
+			Ci.mivExchangeAuthPrompt2);
 
-		var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(Ci.mivExchangeAuthPrompt2);
 		if (myAuthPrompt2.getUserCanceled(this.currentUrl)) {
-			
-			this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled providing a valid password for url="+this.currentUrl+". Aborting this request.");
+			this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION,
+				"User canceled providing a valid password for url="
+				+ this.currentUrl + ". Aborting this request.");
 			return;
 		}
 
 		try {
-			var password = myAuthPrompt2.getPassword(null, openUser, this.currentUrl);
-//			var password = myAuthPrompt2.getPassword(null, this.mArgument.user, this.currentUrl);
+			password = myAuthPrompt2.getPassword(null, openUser, this.currentUrl);
 		}
 		catch(err) {
 			this.logInfo(err);
-			this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION, "User canceled providing a valid password for url="+this.currentUrl+". Aborting this request.");
+			this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION,
+				"User canceled providing a valid password for url="
+				+ this.currentUrl + ". Aborting this request.");
 			myAuthPrompt2 = null;
 			return;
 		}
 		myAuthPrompt2 = null;
 
-		this.xmlReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
+		////////////////////////////////////////////////////
+		// Sending data through standard XML HTTP Request //
+		////////////////////////////////////////////////////
+		// http://dvcs.w3.org/hg/progress/raw-file/tip/Overview.html
+		// https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIXMLHttpRequestEventTarget
 
+		this.xmlReq = Cc["@mozilla.org/xmlextras/xmlhttprequest;1"].createInstance();
 		this.mXmlReq = this.xmlReq;
 
-		var tmp = this;
-
-		// http://dvcs.w3.org/hg/progress/raw-file/tip/Overview.html
-		// https://developer.mozilla.org/en/XPCOM_Interface_Reference/nsIXMLHttpRequestEventTarget
-		this.xmlReq.addEventListener("loadstart", function(evt) { tmp.loadstart(evt); }, false);
-		this.xmlReq.addEventListener("progress", function(evt) { tmp.progress(evt); }, false);
-		this.xmlReq.addEventListener("error", function(evt) { tmp.error(evt); }, false);
-		this.xmlReq.addEventListener("abort", function(evt) { tmp.abort(evt); }, false);
-		this.xmlReq.addEventListener("load", function(evt) { tmp.onLoad(evt); }, false);
-		this.xmlReq.addEventListener("loadend", function(evt) { tmp.loadend(evt); }, false);
+		var currentEcRequest = this;
 
-		if (this.debug) this.logInfo(": 1 ExchangeRequest.sendRequest : user="+this.mArgument.user+", url="+this.currentUrl);
+		// Add listeners to the request so we have more details on the current state
+		this.xmlReq.addEventListener("loadstart",
+			function(evt) { currentEcRequest.loadstart(evt); },
+			false);
+		this.xmlReq.addEventListener("progress",
+			function(evt) { currentEcRequest.progress(evt); },
+			false);
+		this.xmlReq.addEventListener("error",
+			function(evt) { currentEcRequest.error(evt); },
+			false);
+		this.xmlReq.addEventListener("abort",
+			function(evt) { currentEcRequest.abort(evt); },
+			false);
+		this.xmlReq.addEventListener("load",
+			function(evt) { currentEcRequest.onLoad(evt); },
+			false);
+		this.xmlReq.addEventListener("loadend",
+			function(evt) { currentEcRequest.loadend(evt); },
+			false);
 
-		this._notificationCallbacks = new ecnsIAuthPrompt2(this);
+		if (this.debug) {
+			this.logInfo(": 1 ExchangeRequest.sendRequest : user="
+				+ this.mArgument.user +", url=" + this.currentUrl);
+		}
 
+		// Open XML HTTP Request channel we'll use to coummunicate with the server
 		try {
-
-//				this.xmlReq.open("POST", this.currentUrl, true);
+			// If a password is already known, we can try basic authentication diretcly.
 			if (password) {
 				if (this.debug) this.logInfo("We have a prePassword: *******");
 				this.xmlReq.open("POST", this.currentUrl, true, openUser, password);
-
-				// If we have full credentials we are going to add a Basic auth header just for the case we support Basic.
-				var tok = openUser + ':' + password;
-				var basicAuthHash = btoa(tok);
-				this.xmlReq.setRequestHeader('Authorization', "Basic " + basicAuthHash);
-				
-				//this.xmlReq.open("POST", this.currentUrl, true, this.mArgument.user, password);
 			}
 			else {
+				// If we don't have a password, we need to reach one time the URL
+				// to get a NTML challenge
+				// TODO: check if this comment is correct
 				this.xmlReq.open("POST", this.currentUrl, true, openUser);
-				//this.xmlReq.open("POST", this.currentUrl, true, this.mArgument.user);
 			}
-
 		}
 		catch(err) {
-			dump("\n ERROR sendrequest:"+err+"\n");
-			if (this.debug) this.logInfo(": ERROR on ExchangeRequest.sendRequest to URL:"+this.currentUrl+". err:"+err); 
+			if (this.debug) {
+				this.logInfo(": ERROR on ExchangeRequest.sendRequest to URL:"
+					+ this.currentUrl + ". err:" + err);
+			}
 
+			// Try another URL if possible
 			if (this.tryNextURL()) {
 				return;
 			}
 
-			this.fail(this.ER_ERROR_OPEN_FAILED,"Could not connect to specified host:"+err);
+			this.fail(this.ER_ERROR_OPEN_FAILED, "Could not connect to specified host:" + err);
 			return;
 		}
 
+		// Update HTTP Headers
 		this.xmlReq.overrideMimeType('text/xml');
 		this.xmlReq.setRequestHeader("Content-Type", "text/xml");
-//		this.xmlReq.setRequestHeader("User-Agent", "extensions.1st-setup.nl/" + gExchangeRequestVersion+"/username="+this.mArgument.user);
 		this.xmlReq.setRequestHeader("User-Agent", this.globalFunctions.safeGetCharPref(this.prefB, "extensions.1st-setup.others.userAgent", "exchangecalendar@extensions.1st-setup.nl", true));
 
 		// This is required for NTLM authenticated sessions. Which is default for a default EWS install.
 		this.xmlReq.setRequestHeader("Connection", "keep-alive");
 
 		/* set channel notifications for password processing */
-		this.xmlReq.channel.notificationCallbacks = this._notificationCallbacks;
+		this.channelCallbackEcAuthPrompt2 = new ecnsIAuthPrompt2(this);
+		this.xmlReq.channel.notificationCallbacks = this.channelCallbackEcAuthPrompt2;
 		this.xmlReq.channel.loadGroup = null;
 
 		var httpChannel = this.xmlReq.channel.QueryInterface(Ci.nsIHttpChannel);
 
-		// XXX we want to preserve POST across 302 redirects TODO: This might go away because header params are copyied right now.
+		// XXX we want to preserve POST across 302 redirects
+		// TODO: This might go away because header params are copyied right now.
 		httpChannel.redirectionLimit = 0;
-try{
-		httpChannel.allowPipelining = false;
-}
-catch(err) {
-		this.logInfo("sendRequest: ERROR on httpChannel.allowPipelining to err:"+err); 
-}
-
-		if (this.debug) this.logInfo(": sendRequest Sending: " + this.mData+"\n", 2);
+		try{
+			httpChannel.allowPipelining = false;
+		}
+		catch(err) {
+			this.logInfo("sendRequest: ERROR on httpChannel.allowPipelining to err:"+err);
+		}
 
-		//this.exchangeStatistics.addDataSend(this.currentUrl, this.mData.length);
+		if (this.debug) {
+			this.logInfo(": sendRequest Sending: " + this.mData+"\n", 2);
+		}
 
+		// Finally, send data through the channel
 		this.xmlReq.send(this.mData);
 	},
 
+	/*
+	 * loadstart: XML HTTP Request callback
+	 */
 	loadstart: function _loadtstart(evt)
 	{
 		if (this.debug) this.logInfo(": ExchangeRequest.loadstart");
@@ -339,38 +415,65 @@
 		this.badCert = false;
 	},
 
+	/*
+	 * loadend: XML HTTP Request callback
+	 */
 	loadend: function _loadend(evt)
 	{
-		if (this.debug) this.logInfo(": ExchangeRequest.loadend");
-
-		let xmlReq = this.mXmlReq;
-
-		if (this.debug) this.logInfo(": ExchangeRequest.loadend :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status);
-		if (this.debug) this.logInfo(": ExchangeRequest.loadend :"+xmlReq.responseText,2);
-
+		if (this.debug) {
+			this.logInfo(": ExchangeRequest.loadend :"
+				+ evt.type + ", readyState:" + this.mXmlReq.readyState
+				+ ", status:" + this.mXmlReq.status);
+			this.logInfo(": ExchangeRequest.loadend :"
+				+ this.mXmlReq.responseText,2);
+		}
 	},
 
+	/*
+	 * progress: XML HTTP Request callback
+	 */
 	progress: function _progress(evt)
 	{
-		if (this.debug) this.logInfo(": ExchangeRequest.progress. loaded:"+evt.loaded+", total:"+evt.total);
+		if (this.debug) {
+			this.logInfo(": ExchangeRequest.progress. loaded:"
+				+ evt.loaded + ", total:" + evt.total);
+		}
 	},
 
+	/*
+	 * error: XML HTTP Request callback
+	 * Depending on error received we try to recover if possible
+	 */
 	error: function _error(evt)
 	{
 		let xmlReq = this.mXmlReq;
 
-		if (this.debug) this.logInfo(": ExchangeRequest.error :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status+", lastStatus:"+this._notificationCallbacks.lastStatus);
-		if (this.debug) this.logInfo(": ExchangeRequest.error :"+xmlReq.responseText,2);
-		if (this.debug) this.logInfo(': xmlReq.getResponseHeader("Location") :'+xmlReq.getResponseHeader("Location"),2);
+		if (this.debug) {
+			this.logInfo(": ExchangeRequest.error :" + evt.type
+				+ ", readyState:" + xmlReq.readyState + ", status:" + xmlReq.status
+				+ ", lastStatus:" + this.channelCallbackEcAuthPrompt2.lastStatus);
+			this.logInfo(": ExchangeRequest.error :" + xmlReq.responseText, 2);
+			this.logInfo(': xmlReq.getResponseHeader("Location") :'
+				+ xmlReq.getResponseHeader("Location"), 2);
+		}
 
-		if ((!this.shutdown) && (xmlReq.readyState == 4) && (xmlReq.status == 0)) {
+		//////////////////////////////////////////////////////////
+		// Check if error is related to TLS certification issue //
+		// Connection is terminated and HTTP status is 0 (none) //
+		//////////////////////////////////////////////////////////
+		if ((!this.shutdown)
+			&& (xmlReq.readyState === xmlReq.DONE)
+			&& (xmlReq.status === 0)) {
 			this.logInfo(": ExchangeRequest.error : badCert going to check if it is a cert problem.");
-try {
-			var result = this.exchangeBadCertListener2.checkAndSolveCertProblem(this.currentUrl);
-}
-catch(err){
-			this.logInfo(": ExchangeRequest.error : this.exchangeBadCertListener2.checkAndSolveCertProblem Error:"+err);
-}
+			var result = null;
+
+			try {
+				result = this.exchangeBadCertListener2.checkAndSolveCertProblem(this.currentUrl);
+			}
+			catch(err) {
+				this.logInfo(": ExchangeRequest.error : this.exchangeBadCertListener2.checkAndSolveCertProblem Error:" + err);
+			}
+
 			if (result.hadProblem) {
 				if (result.solved) {
 					this.logInfo(": ExchangeRequest.error : badCert problem but solved. going to retry url.");
@@ -386,160 +489,235 @@
 			}
 		}
 
-		if (this.isHTTPRedirect(evt)) return;
-
-		if (this.tryNextURL()) return;
-
-		this.observerService.notifyObservers(this._notificationCallbacks, "onExchangeConnectionError", this.currentUrl+"|"+this._notificationCallbacks.lastStatus+"|"+this._notificationCallbacks.lastStatusArg);
-
-		switch (this._notificationCallbacks.lastStatus) {
-		case 0x804b0003: 
-			this.fail(this.ER_ERROR_RESOLVING_HOST, "Error resolving hostname '"+this._notificationCallbacks.lastStatusArg+"'. Did you type the right hostname. (STATUS_RESOLVING)");
-			xmlReq.abort();
-			if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
-			return;
-		case 0x804b000b: 
-			this.fail(this.ER_ERROR_RESOLVING_HOST, "Error resolving hostname '"+this._notificationCallbacks.lastStatusArg+"'. Did you type the right hostname. (STATUS_RESOLVED)");
-			xmlReq.abort();
-			if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+		// Stop if we are able to resolve the error following redirection or trying next URL
+		if (this.isHTTPRedirect(evt) || this.tryNextURL()) {
 			return;
-		case 0x804b0007:
-			this.fail(this.ER_ERROR_CONNECTING_TO, "Error during connecting to hostname '"+this._notificationCallbacks.lastStatusArg+"'. Is the host down?. (STATUS_CONNECTING_TO)");
-			xmlReq.abort();
-			if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
-			return;
-		case 0x804b0004:
-			this.fail(this.ER_ERROR_CONNECED_TO, "Error during connection to hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_CONNECTED_TO)");
-			if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
-			break;
-		case 0x804b0005:
-			this.fail(this.ER_ERROR_SENDING_TO, "Error during sending data to hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_SENDING_TO)");
-			if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
-			break;
-		case 0x804b000a:
-			this.fail(this.ER_ERROR_WAITING_FOR, "Error during waiting for data of hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_WAITING_FOR)");
-			if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
-			break;
-		case 0x804b0006: 
-			this.fail(this.ER_ERROR_RECEIVING_FROM, "Error during receiving of data from hostname '"+this._notificationCallbacks.lastStatusArg+"'. (STATUS_RECEIVING_FROM)");
-			if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
-			break;
-		default:
-			this.fail(this.ER_ERROR_UNKNOWN_CONNECTION, "Unknown error during communication with hostname '"+this._notificationCallbacks.lastStatusArg+"'. ("+this._notificationCallbacks.lastStatus+")");
+		}
+
+		this.observerService.notifyObservers(this.channelCallbackEcAuthPrompt2,
+			"onExchangeConnectionError",
+			this.currentUrl + "|" + this.channelCallbackEcAuthPrompt2.lastStatus
+			+ "|" + this.channelCallbackEcAuthPrompt2.lastStatusArg);
+
+		switch (this.channelCallbackEcAuthPrompt2.lastStatus) {
+			// On these status, we abort current connection, reset try counter and return
+			case 0x804b0003:
+			case 0x804b000b:
+				this.fail(this.ER_ERROR_RESOLVING_HOST,
+					"Error resolving hostname '"
+					+ this.channelCallbackEcAuthPrompt2.lastStatusArg
+					+ "'. Did you type the right hostname. (STATUS_RESOLVED)");
+				xmlReq.abort();
+				if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+					exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+				}
+				return;
+			case 0x804b0007:
+				this.fail(this.ER_ERROR_CONNECTING_TO, "Error during connecting to hostname '"
+					+ this.channelCallbackEcAuthPrompt2.lastStatusArg
+					+ "'. Is the host down?. (STATUS_CONNECTING_TO)");
+				xmlReq.abort();
+				if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+					exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+				}
+				return;
+			// On these status we just reset try counter and continue
+			case 0x804b0004:
+				this.fail(this.ER_ERROR_CONNECED_TO, "Error during connection to hostname '"
+					+ this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_CONNECTED_TO)");
+				if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+					exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+				}
+				break;
+			case 0x804b0005:
+				this.fail(this.ER_ERROR_SENDING_TO, "Error during sending data to hostname '"
+					+ this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_SENDING_TO)");
+				if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+					exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+				}
+				break;
+			case 0x804b000a:
+				this.fail(this.ER_ERROR_WAITING_FOR, "Error during waiting for data of hostname '"
+					+ this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_WAITING_FOR)");
+				if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+					exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+				}
+				break;
+			case 0x804b0006:
+				this.fail(this.ER_ERROR_RECEIVING_FROM, "Error during receiving of data from hostname '"
+					+ this.channelCallbackEcAuthPrompt2.lastStatusArg + "'. (STATUS_RECEIVING_FROM)");
+				if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
+					exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
+				}
+				break;
+			// Unknown status
+			default:
+				this.fail(this.ER_ERROR_UNKNOWN_CONNECTION, "Unknown error during communication with hostname '"
+					+ this.channelCallbackEcAuthPrompt2.lastStatusArg
+					+ "'. (" + this.channelCallbackEcAuthPrompt2.lastStatus + ")");
 		}
 
 	},
 
+	/*
+	 * abort: XML HTTP Request callback
+	 */
 	abort: function _abort(evt)
 	{
-		if (this.debug) this.logInfo("ExchangeRequest.abort: type:"+evt.type);
-		if (evt.type != "abort") {
-			if (this.debug) this.logInfo("ecExchangeRequest.abort: "+evt.type);
+		if (this.debug) {
+			this.logInfo("ExchangeRequest.abort: type:" + evt.type);
 		}
-		dump("Abort!\n");
-//		this.fail(-3, "User aborted data transfer.");
 	},
 
 	onUserStop: function _onUserStop(aCode, aMsg)
 	{
-		if (this.debug) this.logInfo("ecExchangeRequest.onUserStop: aCode:"+aCode+", aMsg:"+aMsg);
+		if (this.debug) {
+			this.logInfo("ecExchangeRequest.onUserStop: aCode:"+aCode+", aMsg:"+aMsg);
+		}
+
 		this.mXmlReq.abort();
 		this.fail(aCode, aMsg);
 	},
 
+	/*
+	 * isHTTPRedirect: check if URL has bee redirected and try to go through redirection
+	 */
 	isHTTPRedirect: function(evt)
 	{
 		let xmlReq = this.mXmlReq;
-		if (this.debug) this.logInfo("exchangeRequest.isHTTPRedirect.xmlReq. xmlReq.readyState:"+xmlReq.readyState+", xmlReq.status:"+xmlReq.status);
 
-		if (xmlReq.readyState != 4)
+		if (this.debug) {
+			this.logInfo("exchangeRequest.isHTTPRedirect.xmlReq. xmlReq.readyState:"
+				+ xmlReq.readyState + ", xmlReq.status:" + xmlReq.status);
+		}
+
+		if (xmlReq.readyState != xmlReq.DONE) {
 			return false;
+		}
 
+		// Read status to find redirection
 		switch (xmlReq.status) {
-		case 301:  // Moved Permanently
-		case 302:  // Found
-		case 307:  // Temporary redirect (since HTTP/1.1)
-			if (this.debug) this.logInfo(": ExchangeRequest.redirect :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status);
-
-			let httpChannel = xmlReq.channel.QueryInterface(Ci.nsIHttpChannel);
-			let loc = httpChannel.getResponseHeader("Location");
-
-			// The location could be a relative path
-			if (loc.indexOf("http") == -1) {
-				if (this.debug) this.logInfo("new location looks to be relative.");
-				if (loc.indexOf("/") == 0) {
-					if (this.debug) this.logInfo("Relative to the root of the server.");
+			case 301:  // Moved Permanently
+			case 302:  // Found
+			case 307:  // Temporary redirect (since HTTP/1.1)
+				if (this.debug) {
+					this.logInfo(": ExchangeRequest.redirect :"
+						+ evt.type + ", readyState:" + xmlReq.readyState
+						+ ", status:" + xmlReq.status);
+				}
+
+				// Read new location from HTTP headers
+				let httpChannel = xmlReq.channel.QueryInterface(Ci.nsIHttpChannel);
+				let loc = httpChannel.getResponseHeader("Location");
+
+				// The location could be a relative path
+				if (loc.indexOf("http") === -1) {
+					if (this.debug) {
+						this.logInfo("new location looks to be relative.");
+					}
+
 					// Relative to the root of the server
-					//Find position of third slash https://xxx/
-					var slashCounter = 0;
-					var counter = 0;
-					while ((slashCounter < 3) && (counter < this.currentUrl.length)) {
-						if (this.currentUrl.substr(counter, 1) == "/") {
-							slashCounter++;
-
-							if (slashCounter == 3) {
-								var tmpUrl = this.currentUrl.substr(0, counter);
-								break;
+					if (loc.indexOf("/") === 0) {
+						if (this.debug) {
+							this.logInfo("Relative to the root of the server.");
+						}
+
+						// Retrieve current root path by looking for the third slash
+						// for the currenty requested URL (like https://xxx.yyy/)
+						// If there's not 3 slash, so the URL is already the root path
+						var rootUrlPath = null
+						var slashCounter = 0;
+						var pos = 0;
+						while ((slashCounter < 3) && (pos < this.currentUrl.length)) {
+							if (this.currentUrl.substr(pos, 1) === "/") {
+								slashCounter++;
+
+								if (slashCounter === 3) {
+									rootUrlPath = this.currentUrl.substr(0, pos);
+									break;
+								}
 							}
+							pos++;
+						}
+
+						if (rootUrlPath) {
+							loc = rootUrlPath + loc;
+						}
+						else {
+							loc = this.currentUrl + loc;
 						}
-						counter++;
-					}
-					if (tmpUrl) {
-						loc = tmpUrl + loc;
 					}
 					else {
-						loc = this.currentUrl + loc;
+						// Relative to last dir.
+						if (this.debug){
+							this.logInfo("it is relative to the last dir. Currently not able to handle this.");
+						}
 					}
 				}
-				else {
-					// Relative to last dir.
-					if (this.debug) this.logInfo("it is relative to the last dir. Currently not able to handle this. Will be available in future version.");
-				}
-			}
 
-			if (this.debug) this.logInfo(": Redirect: " + loc + "\n");
+				if (this.debug){
+					this.logInfo(": Redirect: " + loc + "\n");
+				}
 
-                        // XXX pheer loops.
-                        xmlReq.abort();
-                        this.sendRequest(this.mData, loc);
+				// XXX pheer loops.
+				xmlReq.abort();
+				this.sendRequest(this.mData, loc);
 
-			return true;
+				// This is a redirection and we are alreday trying a new URL
+				return true;
 		}
 
+		// That wasn't a redirection
 		return false;
 	},
 
-	unchunk: function _unchunk(aStr)
+	/*
+	 * Revert chunk process on data:
+	 * this function take string splitted in big pieces of data
+	 * and gather them in one big string.
+	 */
+	unchunk: function _unchunk(aChunkedString)
 	{
-		var pos = aStr.indexOf("\r\n");
+		var pos = aChunkedString.indexOf("\r\n");
 		if ((pos > -1) && (pos < 5)) {
 			var chunkCounter = 1;
-			var chunkLength = parseInt(aStr.substr(0,pos), 16);
+			var chunkLength = parseInt(aChunkedString.substr(0,pos), 16);
+
 			if (isNaN(chunkLength)) {
-				if (this.debug) this.logInfo("unchunk: 1st chunk is not a number:"+aStr.substr(0,pos));
+				if (this.debug){
+					this.logInfo("unchunk: 1st chunk is not a number:" + aChunkedString.substr(0,pos));
+				}
 				return "";
 			}
-			if (this.debug) this.logInfo("unchunk: 1st chunk has length:"+chunkLength);
-			var newStr = "";
+
+			if (this.debug) {
+				this.logInfo("unchunk: 1st chunk has length:" + chunkLength);
+			}
+
+			var gatheredString = "";
 			while (chunkLength > 0) {
 				var bytesToCopy = chunkLength;
 				pos = pos + 2;
 				var charCode;
 				while (bytesToCopy > 0) {
-					newStr = newStr + aStr.substr(pos, 1);
-					charCode = aStr.charCodeAt(pos);
+					gatheredString = gatheredString + aChunkedString.substr(pos, 1);
+					charCode = aChunkedString.charCodeAt(pos);
 					if (charCode <= 0xFF) {
 						bytesToCopy--;
 					}
 					else {
 						if (charCode <= 0xFFFF) {
-							if (this.debug) this.logInfo("unchunk: TWO bytes copied '"+aStr.substr(pos, 1)+"'="+charCode);
+							if (this.debug) {
+								this.logInfo("unchunk: TWO bytes copied '" + aChunkedString.substr(pos, 1) + "'="+charCode);
+							}
 							bytesToCopy = bytesToCopy - 2;
 
 						}
 						else {
 							if (charCode <= 0xFFFFFF) {
-								if (this.debug) this.logInfo("unchunk: THREE bytes copied '"+aStr.substr(pos, 1)+"'="+charCode);
+								if (this.debug) {
+									this.logInfo("unchunk: THREE bytes copied '" + aChunkedString.substr(pos, 1) + "'="+charCode);
+								}
 								bytesToCopy = bytesToCopy - 3;
 							}
 						}
@@ -547,55 +725,71 @@
 					pos++;
 				}
 
-				//newStr = newStr + aStr.substr(pos+2, chunkLength);
-					if (this.debug) this.logInfo("unchunk: pos:"+pos+", CunkStr:"+newStr+"|");
-				//pos = pos + chunkLength + 2;
+				if (this.debug) {
+					this.logInfo("unchunk: pos:" + pos + ", CunkStr:" + gatheredString + "|");
+				}
+
 				// Next two bytes should be \r\n
-				var check = aStr.substr(pos, 2);
+				var check = aChunkedString.substr(pos, 2);
 				if (check != "\r\n") {
-					if (this.debug) this.logInfo("unchunk: Strange. Expected 0D0A (Cr+Lf) but found:"+check+". Stopping processing of this chunked message.");
+					if (this.debug) {
+						this.logInfo("unchunk: Strange. Expected 0D0A (Cr+Lf) but found:"
+							+ check + ". Stopping processing of this chunked message.");
+					}
 					return "";
 				}
 				pos = pos + 2;
-				var tmpStr = aStr.substr(pos, 6);
+				var tmpStr = aChunkedString.substr(pos, 6);
 				var pos2 = tmpStr.indexOf("\r\n");
 				chunkCounter++;
 				if (pos2 > -1) {
-					if (this.debug) this.logInfo("unchunk: Found next chunk. Number:"+chunkCounter+", LengthStr:"+tmpStr.substr(0,pos2));
+					if (this.debug) {
+						this.logInfo("unchunk: Found next chunk. Number:"+chunkCounter+", LengthStr:"+tmpStr.substr(0,pos2));
+					}
+
 					chunkLength = parseInt(tmpStr.substr(0,pos2), 16);
 					if (isNaN(chunkLength)) {
-						if (this.debug) this.logInfo("unchunk: Chunk '"+chunkCounter+"' is not a number:"+tmpStr);
+						if (this.debug) {
+							this.logInfo("unchunk: Chunk '"+chunkCounter+"' is not a number:"+tmpStr);
+						}
 						return "";
 					}
-					if (this.debug) this.logInfo("unchunk: Chunk '"+chunkCounter+"' has length:"+chunkLength);
+					if (this.debug) {
+						this.logInfo("unchunk: Chunk '"+chunkCounter+"' has length:"+chunkLength);
+					}
 					pos = pos + pos2;
 				}
 				else {
-					if (this.debug) this.logInfo("unchunk: Trying to determine chunk '"+chunkCounter+"' length but it is more than 4 bytes big!! size:"+tmpStr);
+					if (this.debug) {
+						this.logInfo("unchunk: Trying to determine chunk '"+chunkCounter+"' length but it is more than 4 bytes big!! size:"+tmpStr);
+					}
 					return "";
 				}
 			}
-			return newStr;
+			return gatheredString;
 		}
 		else {
-			if (this.debug) this.logInfo("unchunk: Trying to determine first chunk length but it is very big...!! size:"+pos);
-			return aStr;
+			if (this.debug) {
+				this.logInfo("unchunk: Trying to determine first chunk length but it is very big...!! size:" + pos);
+			}
+			return aChunkedString;
 		}
 	},
 
 	saveToFile: function _saveToFile(aFilename, aContent)
 	{
 		var file = Cc["@mozilla.org/file/directory_service;1"]
-				.getService(Components.interfaces.nsIProperties)
-				.get("ProfD", Components.interfaces.nsIFile);
+			.getService(Components.interfaces.nsIProperties)
+			.get("ProfD", Components.interfaces.nsIFile);
+
 		file.append("exchange-data");
 		if ( !file.exists() || !file.isDirectory() ) {
-			file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8));  
+			file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8));
 		}
 
 		file.append("responses");
 		if ( !file.exists() || !file.isDirectory() ) {
-			file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8));  
+			file.create(Components.interfaces.nsIFile.DIRECTORY_TYPE, parseInt("0777", 8));
 		}
 
 		if (!this.fileCount) {
@@ -606,73 +800,65 @@
 		}
 
 		if (this.fileCount < 10) {
-			file.append(this.uuid+"-00"+this.fileCount+"."+aFilename);
+			file.append(this.uuid+"-00" + this.fileCount + "."+aFilename);
+		}
+		else if (this.fileCount < 100) {
+			file.append(this.uuid+"-0" + this.fileCount + "." + aFilename);
 		}
 		else {
-			if (this.fileCount < 100) {
-				file.append(this.uuid+"-0"+this.fileCount+"."+aFilename);
-			}
-			else {
-				file.append(this.uuid+"-"+this.fileCount+"."+aFilename);
-			}
+			file.append(this.uuid+"-" + this.fileCount + "."+aFilename);
 		}
 
 		if (file.exists()) {
 			file.remove(false);
 		}
 
-//		file.create(Components.interfaces.nsIFile.NORMAL_FILE_TYPE, 0777);  
-
-		var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].  
-				 createInstance(Components.interfaces.nsIFileOutputStream);  
-		foStream.init(file, 0x02 | 0x08 | 0x20, parseInt("0777", 8), 0);  
+		var foStream = Components.classes["@mozilla.org/network/file-output-stream;1"].
+			createInstance(Components.interfaces.nsIFileOutputStream);
+		foStream.init(file, 0x02 | 0x08 | 0x20, parseInt("0777", 8), 0);
 
 		var converter = Components.classes["@mozilla.org/intl/converter-output-stream;1"].
-				createInstance(Components.interfaces.nsIConverterOutputStream);
+			createInstance(Components.interfaces.nsIConverterOutputStream);
 		converter.init(foStream, "UTF-8", 0, 0);
 		converter.writeString(aContent);
 		converter.close(); // this closes foStream
-		  
+
 		return 0;
 	},
 
 
-	onLoad:function _onLoad(evt) 
+	onLoad:function _onLoad(evt)
 	{
 		let xmlReq = this.mXmlReq;
 
-		if (this.debug) this.logInfo(": ExchangeRequest.onLoad :"+evt.type+", readyState:"+xmlReq.readyState+", status:"+xmlReq.status);
-
-		if (this.debug) this.logInfo(": ExchangeRequest.onLoad :"+xmlReq.getAllResponseHeaders(),2);
-
-		if (this.debug) this.logInfo(": ExchangeRequest.onLoad :"+xmlReq.responseText,2);
-
-		//this.exchangeStatistics.addDataRead(this.currentUrl, xmlReq.responseText.length);
-
-		if (xmlReq.readyState != 4) {
-
-			//if (this.tryNextURL()) return;
-
-			if (this.debug) this.logInfo("readyState < 4. THIS SHOULD NEVER HAPPEN. PLEASE REPORT.");
-			this.fail(this.ER_ERROR_OPEN_FAILED,"Ready state != 4, readyState:"+xmlReq.readyState);
-			return;
+		if (this.debug) {
+			this.logInfo(": ExchangeRequest.onLoad :" + evt.type
+				+ ", readyState:" + xmlReq.readyState
+				+ ", status:" + xmlReq.status);
+			this.logInfo(": ExchangeRequest.onLoad :"
+				+ xmlReq.getAllResponseHeaders(), 2);
+			this.logInfo(": ExchangeRequest.onLoad :" + xmlReq.responseText, 2);
 		}
 
-		if (this.isHTTPRedirect(evt)) {
+		if (xmlReq.readyState != xmlReq.DONE) {
+			if (this.debug) {
+				this.logInfo("readyState is not DONE inside the onLoad internal function. THIS SHOULD NEVER HAPPEN. PLEASE REPORT.");
+			}
+			this.fail(this.ER_ERROR_OPEN_FAILED,
+				"Ready state != 4, readyState:" + xmlReq.readyState);
 			return;
 		}
 
-		if (this.isHTTPError()) {
+		// Check redirection and follow it if possible
+		// Check if this is an HTTP Error
+		if (this.isHTTPRedirect(evt) || this.isHTTPError()) {
 			return;
 		}
 
 		var xml = xmlReq.responseText; // bug 270553
-		//this.saveToFile("onload.xml", xml);
-
-// Removed following as this is no longer a problem as we are not using E4X anymore.
-//		xml = xml.replace(/&#x10;/g, ""); // BUG 61 remove hexadecimal code 0x10. It will fail in xml conversion.
-
 		var newXML;
+
+		// Initiate XML parser
 		try {
 			if (this.xml2json === true) {
 				newXML = xml2json.newJSON();
@@ -681,8 +867,13 @@
 				newXML = new mivIxml2jxon('', 0, null);
 			}
 		}
-		catch(exc) { if (this.debug) this.logInfo("createInstance error:"+exc);}
+		catch(exc) {
+			if (this.debug) {
+				this.logInfo("createInstance error:"+exc);
+			}
+		}
 
+		// Parse XML data
 		try {
 			if (this.xml2json === true) {
 				xml2json.parseXML(newXML, xml);
@@ -696,7 +887,12 @@
 				newXML.processXMLString(xml, 0, null);
 			}
 		}
-		catch(exc) { if (this.debug) this.logInfo("processXMLString error:"+exc.name+", "+exc.message+"\n"+xml);} 
+		catch(exc) {
+			if (this.debug) {
+				this.logInfo("processXMLString error:" + exc.name + ","
+					+ exc.message + "\n" + xml);
+			}
+		}
 
 		this.mAuthFail = 0;
 		this.mRunning  = false;
@@ -706,38 +902,52 @@
 			try {
 				if (this.xml2json === true) {
 					let serverVersion = xml2json.XPath(newXML,"/Envelope/Header/ServerVersionInfo");
-					if ((serverVersion.length > 0) && (xml2json.getAttribute(serverVersion[0], "Version") !== null)) {
-						this.exchangeStatistics.setServerVersion(this.currentUrl, xml2json.getAttribute(serverVersion[0], "Version"), xml2json.getAttribute(serverVersion[0], "MajorVersion"), xml2json.getAttribute(serverVersion[0], "MinorVersion"));
+					if (serverVersion.length > 0
+						&& xml2json.getAttribute(serverVersion[0], "Version") !== null) {
+						this.exchangeStatistics.setServerVersion(this.currentUrl,
+							xml2json.getAttribute(serverVersion[0], "Version"),
+							xml2json.getAttribute(serverVersion[0], "MajorVersion"),
+							xml2json.getAttribute(serverVersion[0], "MinorVersion"));
 					}
 					serverVersion = null;
 				}
 				else {
 					let serverVersion = newXML.XPath("/s:Header/ServerVersionInfo");
-					if ((serverVersion.length > 0) && (serverVersion[0].getAttribute("Version") != "")) {
-						this.exchangeStatistics.setServerVersion(this.currentUrl, serverVersion[0].getAttribute("Version"), serverVersion[0].getAttribute("MajorVersion"), serverVersion[0].getAttribute("MinorVersion"));
+					if (serverVersion.length > 0
+						&& serverVersion[0].getAttribute("Version") != "") {
+						this.exchangeStatistics.setServerVersion(this.currentUrl,
+							serverVersion[0].getAttribute("Version"),
+							serverVersion[0].getAttribute("MajorVersion"),
+							serverVersion[0].getAttribute("MinorVersion"));
 					}
 					serverVersion[0] = null;
 					serverVersion = null;
 				}
 			}
-			catch(err) { }
+			catch(err) {
+			}
 
 			this.retryCount = 0;
-
 			if (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
 				exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
 			}
 
-try {
-			this.mCbOk(this, newXML);
-}catch(err) { dump("onload: err:"+err+"\n"+this.globalFunctions.STACK()+"\n"+xml+"\n");}
+			try {
+				this.mCbOk(this, newXML);
+			}
+			catch(err)
+			{
+				if (this.debug) {
+					this.logInfo("onLoad: err:" + err);
+					this.logInfo("onLoad: stack:" + this.globalFunctions.STACK());
+					this.logInfo("onLoad: xml:" + xml);
+				}
+			}
 			this.originalReq = null;
 		}
 
-//dump(" stat: time1:"+(time2-time1)+", time2:"+(time4-time3)+"\n");
 		newXML = null;
-
-		this.observerService.notifyObservers(this._notificationCallbacks, "onExchangeConnectionOk", this.currentUrl);
+		this.observerService.notifyObservers(this.channelCallbackEcAuthPrompt2, "onExchangeConnectionOk", this.currentUrl);
 	},
 
 	retryCurrentUrl: function()
@@ -747,14 +957,18 @@
 
 	tryNextURL: function _tryNextURL()
 	{
-		if (this.debug) this.logInfo("exchangeRequest.tryNextURL");
-                let xmlReq = this.mXmlReq;
-		if (xmlReq.readyState != 4) {
+		if (this.debug) {
+			this.logInfo("exchangeRequest.tryNextURL");
+		}
+
+		let xmlReq = this.mXmlReq;
+
+		if (xmlReq.readyState != xmlReq.DONE) {
 			xmlReq.abort();
 		}
 
 		if (this.urllist.length > 0) {
-			if (this.debug) this.logInfo("exchangeRequest.tryNextURL: We have another URLto try the request on.");
+			if (this.debug) this.logInfo("exchangeRequest.tryNextURL: We have another URL to try the request on.");
 			this.sendRequest(this.mData);
 			return true;
 		}
@@ -769,161 +983,179 @@
 			// https://webmail.example.com/ews/exchange.asmx
 
 			var tmpColon = tmpURL.indexOf("://");
-			tmpURL = tmpURL.substr(0, tmpColon+3) + aUser + "@" + tmpURL.substr(tmpColon+3);
+			tmpURL = tmpURL.substr(0, tmpColon + 3) + aUser + "@" + tmpURL.substr(tmpColon+3);
 		}
-		return this._notificationCallbacks.getPrePassword(aUser, tmpURL);
+		return this.channelCallbackEcAuthPrompt2.getPrePassword(aUser, tmpURL);
 	},
 
-        isHTTPError: function()
-        {
-                let xmlReq = this.mXmlReq;
+	isHTTPError: function()
+	{
+		let xmlReq = this.mXmlReq;
 
-                if (xmlReq.status != 200) {
+		if (xmlReq.status != 200) {
 			if (xmlReq.status ==  303) {  // See Other (since HTTP/1.1) new request should be a GET instead of a POST.
- 				this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Redirection "+xmlReq.status+": See Other\n"+xmlReq.responseText.substr(0,300)+"\n\n");
-                        	return true;
+				this.fail(this.ER_ERROR_HTTP_ERROR4XX,
+					"HTTP Redirection " + xmlReq.status + ": See Other\n"
+					+ xmlReq.responseText.substr(0,300) + "\n\n");
+				return true;
 			}
 
-                        if ((xmlReq.status > 399) && (xmlReq.status < 500)) {
-
+			if ((xmlReq.status > 399) && (xmlReq.status < 500)) {
 				var errMsg = "";
 				switch (xmlReq.status) {
-				case 400: errMsg = "Bad request"; break;
-				case 401: errMsg = "Unauthorized"; break;
-				case 402: errMsg = "Payment required"; break;
-				case 403: errMsg = "Forbidden"; break;
-				case 404: errMsg = "Not found"; break;
-				case 405: errMsg = "Method not allowed"; break;
-				case 406: errMsg = "Not acceptable"; break;
-				case 407: errMsg = "Proxy athentication required"; break;
-				case 408: errMsg = "Request timeout"; break;
-				case 409: errMsg = "Conflict"; break;
-				case 410: errMsg = "Gone"; break;
-				case 411: errMsg = "Length required"; break;
-				case 412: errMsg = "Precondition failed"; break;
-				case 413: errMsg = "Request entity too large"; break;
-				case 414: errMsg = "Request-URI too long"; break;
-				case 415: errMsg = "Unsupported media type"; break;
-				case 416: errMsg = "Request range not satisfiable"; break;
-				case 417: errMsg = "Expectation failed"; break;
-				case 418: errMsg = "I'm a teapot(RFC 2324)"; break;
-				case 420: errMsg = "Enhance your calm (Twitter)"; break;
-				case 422: errMsg = "Unprocessable entity (WebDAV)(RFC 4918)"; break;
-				case 423: errMsg = "Locked (WebDAV)(RFC 4918)"; break;
-				case 424: errMsg = "Failed dependency (WebDAV)(RFC 4918)"; break;
-				case 425: errMsg = "Unordered collection (RFC 3648)"; break;
-				case 426: errMsg = "Upgrade required (RFC2817)"; break;
-				case 428: errMsg = "Precondition required"; break;
-				case 429: errMsg = "Too many requests"; break;
-				case 431: errMsg = "Request header fields too large"; break;
-				case 444: errMsg = "No response"; break;
-				case 449: errMsg = "Retry with"; break;
-				case 450: errMsg = "Blocked by Windows Parental Controls"; break;
-				case 499: errMsg = "Client closed request"; break;
+					case 400: errMsg = "Bad request"; break;
+					case 401: errMsg = "Unauthorized"; break;
+					case 402: errMsg = "Payment required"; break;
+					case 403: errMsg = "Forbidden"; break;
+					case 404: errMsg = "Not found"; break;
+					case 405: errMsg = "Method not allowed"; break;
+					case 406: errMsg = "Not acceptable"; break;
+					case 407: errMsg = "Proxy athentication required"; break;
+					case 408: errMsg = "Request timeout"; break;
+					case 409: errMsg = "Conflict"; break;
+					case 410: errMsg = "Gone"; break;
+					case 411: errMsg = "Length required"; break;
+					case 412: errMsg = "Precondition failed"; break;
+					case 413: errMsg = "Request entity too large"; break;
+					case 414: errMsg = "Request-URI too long"; break;
+					case 415: errMsg = "Unsupported media type"; break;
+					case 416: errMsg = "Request range not satisfiable"; break;
+					case 417: errMsg = "Expectation failed"; break;
+					case 418: errMsg = "I'm a teapot(RFC 2324)"; break;
+					case 420: errMsg = "Enhance your calm (Twitter)"; break;
+					case 422: errMsg = "Unprocessable entity (WebDAV)(RFC 4918)"; break;
+					case 423: errMsg = "Locked (WebDAV)(RFC 4918)"; break;
+					case 424: errMsg = "Failed dependency (WebDAV)(RFC 4918)"; break;
+					case 425: errMsg = "Unordered collection (RFC 3648)"; break;
+					case 426: errMsg = "Upgrade required (RFC2817)"; break;
+					case 428: errMsg = "Precondition required"; break;
+					case 429: errMsg = "Too many requests"; break;
+					case 431: errMsg = "Request header fields too large"; break;
+					case 444: errMsg = "No response"; break;
+					case 449: errMsg = "Retry with"; break;
+					case 450: errMsg = "Blocked by Windows Parental Controls"; break;
+					case 499: errMsg = "Client closed request"; break;
 				}
 
-                                if (this.debug) this.logInfo(": isConnError req.status="+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText, 2);
+				if (this.debug) {
+					this.logInfo(": isConnError req.status=" + xmlReq.status
+						+ ": " +errMsg + "\nURL:" + this.currentUrl + "\n"
+						+ xmlReq.responseText, 2);
+				}
 
 				var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(Ci.mivExchangeAuthPrompt2);
-				if ((this.urllist.length > 0) && (!myAuthPrompt2.getUserCanceled(this.currentUrl))) {
-					if (this.tryNextURL()) { 
+				if (this.urllist.length > 0 && !myAuthPrompt2.getUserCanceled(this.currentUrl)) {
+					if (this.tryNextURL()) {
 						return true;
 					}
-	 				this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Client error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n");
+					this.fail(this.ER_ERROR_HTTP_ERROR4XX,
+						"HTTP Client error " + xmlReq.status + ": "
+						+ errMsg + "\nURL:" + this.currentUrl + "\n"
+						+ xmlReq.responseText.substr(0,300)+"\n\n");
+				}
+				else if (myAuthPrompt2.getUserCanceled(this.currentUrl)) {
+					this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION,
+						"User canceled providing a valid password for url="
+						+ this.currentUrl + ". Aborting this request.");
 				}
 				else {
-					if (myAuthPrompt2.getUserCanceled(this.currentUrl)) {
-		 				this.fail(this.ER_ERROR_USER_ABORT_AUTHENTICATION,  "User canceled providing a valid password for url="+this.currentUrl+". Aborting this request.");
-					}
-					else {
-		 				this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Client error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n");
-					}
+					this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Client error "
+						+ xmlReq.status + ": " +errMsg +"\nURL:" + this.currentUrl
+						+ "\n" + xmlReq.responseText.substr(0,300)+"\n\n");
 				}
 
-                        	return true;
-
-                        }
-
-                        if ((xmlReq.status > 499) && (xmlReq.status < 600)) {
+				return true;
+			}
 
+			if ((xmlReq.status > 499) && (xmlReq.status < 600)) {
 				var errMsg = "";
 				switch (xmlReq.status) {
-				case 500: errMsg = "Internal server error"; 
-
+					case 500: errMsg = "Internal server error";
 						// First check if we have a version mismatch and we need a lower version. This sometimes happens.
 						if (xmlReq.responseText.indexOf("ErrorInvalidServerVersion") > -1) {
-							if (this.debug) this.logInfo(" ErrorInvalidServerVersion -> RequestServerVersion wrong:"+this.version+".", 2);
-							// We are going to retry with a different serverversion.
+							if (this.debug) {
+								this.logInfo(" ErrorInvalidServerVersion -> RequestServerVersion wrong:"+this.version+".", 2);
+							}
+
+							// We are going to retry with a different server version.
 							var tryAgain = false;
 							switch(this.version) {
-							case "Exchange2010":
-								this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2007_SP1", null, null);
-								tryAgain = true;
-								break;
-							case "Exchange2010_SP1":
-								this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null);
-								tryAgain = true;
-								break;
-							case "Exchange2010_SP2":
-								this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null);
-								tryAgain = true;
-								break;
-							case "Exchange2013":
-								this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null);
-								tryAgain = true;
-								break;
-							default:
-								tryAgain = false;
+								case "Exchange2010":
+									this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2007_SP1", null, null);
+									tryAgain = true;
+									break;
+								case "Exchange2010_SP1":
+									this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null);
+									tryAgain = true;
+									break;
+								case "Exchange2010_SP2":
+									this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null);
+									tryAgain = true;
+									break;
+								case "Exchange2013":
+									this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null);
+									tryAgain = true;
+									break;
+								default:
+									tryAgain = false;
 							}
 							if (tryAgain) {
-								if (this.debug) this.logInfo("Going to retry with lower server version", 2);
+								if (this.debug) {
+									this.logInfo("Going to retry with lower server version", 2);
+								}
 								this.sendRequest(this.makeSoapMessage(this.originalReq), this.currentUrl);
 								return true;
 							}
 						}
-
-						// First check if we have a version mismatch and we need a higher version. This sometimes happens.
-						if ((xmlReq.responseText.indexOf("ErrorIncorrectSchemaVersion") > -1) &&
-							(xmlReq.responseText.indexOf("RequestServerVersion") > -1) ) {
-							if (this.debug) this.logInfo(" ErrorIncorrectSchemaVersion -> RequestServerVersion wrong:"+this.version+".", 2);
+						// Next check if we have a version mismatch and we need a higher version. This sometimes happens.
+						if (xmlReq.responseText.indexOf("ErrorIncorrectSchemaVersion") > -1
+							&& xmlReq.responseText.indexOf("RequestServerVersion") > -1) {
+							if (this.debug){
+								this.logInfo(" ErrorIncorrectSchemaVersion -> RequestServerVersion wrong:"+this.version+".", 2);
+							}
 							// We are going to retry with a different serverversion.
 							var tryAgain = false;
 							switch(this.version) {
-							case "Exchange2007_SP1":
-								this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null);
-								tryAgain = true;
-								break;
-							case "Exchange2010":
-								this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null);
-								tryAgain = true;
-								break;
-							case "Exchange2010_SP1":
-								this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null);
-								tryAgain = true;
-								break;
-							case "Exchange2010_SP2":
-								this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2013", null, null);
-								tryAgain = true;
-								break;
-							default:
-								tryAgain = false;
+								case "Exchange2007_SP1":
+									this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010", null, null);
+									tryAgain = true;
+									break;
+								case "Exchange2010":
+									this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP1", null, null);
+									tryAgain = true;
+									break;
+								case "Exchange2010_SP1":
+									this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2010_SP2", null, null);
+									tryAgain = true;
+									break;
+								case "Exchange2010_SP2":
+									this.exchangeStatistics.setServerVersion(this.mArgument.serverUrl, "Exchange2013", null, null);
+									tryAgain = true;
+									break;
+								default:
+									tryAgain = false;
 							}
 							if (tryAgain) {
-								if (this.debug) this.logInfo("Going to retry with higher server version", 2);
+								if (this.debug) {
+									this.logInfo("Going to retry with higher server version", 2);
+								}
 								this.sendRequest(this.makeSoapMessage(this.originalReq), this.currentUrl);
 								return true;
 							}
 						}
 
 						// This might be generated because of a password not yet supplied in open function during a request so we try again
-						//if ((this.prePassword == "") && 
-						if	((!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) || (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount < 3)) {
-							if (this.debug) this.logInfo("isHTTPError: We are going to ask the user or password store for a password and try again.");
+						if	((!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl])
+							 || (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount < 3)) {
+							if (this.debug) {
+								this.logInfo("isHTTPError: We are going to ask the user or password store for a password and try again.");
+							}
 							this.prePassword = this.getPrePassword(this.currentUrl, this.mArgument.user);
 
 							if (this.prePassword) {
-
-								if (this.debug) this.logInfo("isHTTPError: We received a prePassword. Going to retry current URL");
+								if (this.debug) {
+									this.logInfo("isHTTPError: We received a prePassword. Going to retry current URL");
+								}
 
 								if (!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
 									exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl] = {};
@@ -933,17 +1165,24 @@
 								exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount++;
 
 								xmlReq.abort();
-
 								this.retryCurrentUrl();
 
 								return true;
 							}
-							if (this.debug) this.logInfo("isHTTPError: User canceled request for prePassword.");
+							if (this.debug) {
+								this.logInfo("isHTTPError: User canceled request for prePassword.");
+							}
 						}
 
-						if	((exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) && (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount > 2)) {
+						// Password were given and that's the third try we have an error
+						if	((exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl])
+							 && (exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount > 2)) {
 							// Failed three times. Remove password also from password store.
-							if (this.debug) this.logInfo("isHTTPError: Failed password "+exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount+" times. Stopping communication.");
+							if (this.debug) {
+								this.logInfo("isHTTPError: Failed password "
+									+ exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount
+									+ " times. Stopping communication.");
+							}
 							var title = "Microsoft Exchange EWS";
 							var tmpURL = this.currentUrl;
 							if (this.mArgument.user != "") {
@@ -953,63 +1192,79 @@
 								var tmpColon = tmpURL.indexOf("://");
 								tmpURL = tmpURL.substr(0, tmpColon+3) + this.mArgument.user + "@" + tmpURL.substr(tmpColon+3);
 							}
-							this._notificationCallbacks.passwordManagerRemove(this.mArgument.user, tmpURL, title);
+							this.channelCallbackEcAuthPrompt2.passwordManagerRemove(this.mArgument.user, tmpURL, title);
 						}
 
+						// Finally reset password cache
 						if (!exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl]) {
 							exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl] = {};
 						}
-						
+
 						exchWebService.prePasswords[this.mArgument.user+"@"+this.currentUrl].tryCount = 0;
 
 						this.prePassword = null;
-
 						break;
-				case 501: errMsg = "Not implemented"; break;
-				case 502: errMsg = "Bad gateway"; break;
-				case 503: errMsg = "Service unavailable"; break;
-				case 504: errMsg = "Gateway timeout"; break;
-				case 505: errMsg = "HTTP version not supported"; break;
-				case 506: errMsg = "Variant also negotiates (RFC 2295)"; break;
-				case 507: errMsg = "Insufficient Storage (WebDAV)(RFC 4918)"; break;
-				case 508: errMsg = "Loop detected (WebDAV)(RFC 4918)"; break;
-				case 509: errMsg = "Bandwith limit exceeded (Apache bw/limited extension)"; break;
-				case 510: errMsg = "Not extended (RFC 2774)"; break;
-				case 511: errMsg = "Network authentication required"; break;
-				case 598: errMsg = "Network read timeout error"; break;
-				case 599: errMsg = "Network connect timeout error"; break;
+					case 501: errMsg = "Not implemented"; break;
+					case 502: errMsg = "Bad gateway"; break;
+					case 503: errMsg = "Service unavailable"; break;
+					case 504: errMsg = "Gateway timeout"; break;
+					case 505: errMsg = "HTTP version not supported"; break;
+					case 506: errMsg = "Variant also negotiates (RFC 2295)"; break;
+					case 507: errMsg = "Insufficient Storage (WebDAV)(RFC 4918)"; break;
+					case 508: errMsg = "Loop detected (WebDAV)(RFC 4918)"; break;
+					case 509: errMsg = "Bandwith limit exceeded (Apache bw/limited extension)"; break;
+					case 510: errMsg = "Not extended (RFC 2774)"; break;
+					case 511: errMsg = "Network authentication required"; break;
+					case 598: errMsg = "Network read timeout error"; break;
+					case 599: errMsg = "Network connect timeout error"; break;
 				}
 
-                                if (this.debug) this.logInfo(": isConnError req.status="+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText, 2);
+				if (this.debug) {
+					this.logInfo(": isConnError req.status="
+						+ xmlReq.status + ": " + errMsg
+						+ "\nURL:" + this.currentUrl + "\n"
+						+ xmlReq.responseText, 2);
+				}
 
 				if (this.tryNextURL()) {
 					return true;
 				}
 
- 				this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Server error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n");
-                        	return true;
-                        }
+				this.fail(this.ER_ERROR_HTTP_ERROR4XX, "HTTP Server error "+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n");
+				return true;
+			} // End of error status 5xx
 
 			if (this.tryNextURL()) {
 				return true;
 			}
-                        // XXX parse it
- 			this.fail(this.ER_ERROR_FROM_SERVER, "Unknown error from server"+xmlReq.status+": "+errMsg+"\nURL:"+this.currentUrl+"\n"+xmlReq.responseText.substr(0,300)+"\n\n");
-                        return true;
-                }
 
-                return false;
-        },
+			// XXX parse it
+ 			this.fail(this.ER_ERROR_FROM_SERVER, "Unknown error from server"
+ 				+ xmlReq.status + ": " + errMsg + "\nURL:"+this.currentUrl
+ 				+ "\n" + xmlReq.responseText.substr(0,300) + "\n\n");
+			return true;
+		} // Received HTTP 200 OK
+
+		// That wasn't an HTTP error
+		return false;
+	},
 
 	fail: function(aCode, aMsg)
 	{
-		if (this.debug) this.logInfo("ecExchangeRequest.fail: aCode:"+aCode+", aMsg:"+aMsg);
+		if (this.debug) {
+			this.logInfo("ecExchangeRequest.fail: aCode:"+aCode+", aMsg:"+aMsg);
+		}
+
 		if (this.mCbError) {
 			this.mCbError(this, aCode, aMsg);
 		}
+
 		this.originalReq = null;
 	},
 
+	/*
+	 * Generate SOAP message by xml2json
+	 */
 	makeSoapMessage2: function erMakeSoapMessage2(aReq)
 	{
 		this.originalReq = aReq;
@@ -1021,23 +1276,23 @@
 		xml2json.setAttribute(msg, "xmlns:nsTypes", nsTypesStr);
 
 		this.version = this.exchangeStatistics.getServerVersion(this.mArgument.serverUrl);
-		
+
 		var header = xml2json.addTag(msg,"Header", "nsSoap", null);
 
 		var requestServerVersion = xml2json.addTag(header, "RequestServerVersion", "nsTypes", null);
 		xml2json.setAttribute(requestServerVersion, "Version", this.version);
-		
+
 		var exchTimeZone = this.timeZones.getExchangeTimeZoneByCalTimeZone(this.globalFunctions.ecDefaultTimeZone(), this.mArgument.serverUrl, cal.now());
 
 		if (exchTimeZone) {
-				let timeZoneContext = xml2json.addTag(header, "TimeZoneContext", "nsTypes", null);
-				let tmpTimeZone = xml2json.addTag(timeZoneContext, "TimeZoneDefinition", "nsTypes");
-				if (this.version.indexOf("2007") < 0) {
-					xml2json.setAttribute(tmpTimeZone, "Name",exchTimeZone.name);
-				}
-				xml2json.setAttribute(tmpTimeZone, "Id",exchTimeZone.id);
-				tmpTimeZone = null;
-				timeZoneContext = null;
+			let timeZoneContext = xml2json.addTag(header, "TimeZoneContext", "nsTypes", null);
+			let tmpTimeZone = xml2json.addTag(timeZoneContext, "TimeZoneDefinition", "nsTypes");
+			if (this.version.indexOf("2007") < 0) {
+				xml2json.setAttribute(tmpTimeZone, "Name",exchTimeZone.name);
+			}
+			xml2json.setAttribute(tmpTimeZone, "Id",exchTimeZone.id);
+			tmpTimeZone = null;
+			timeZoneContext = null;
 		}
 		header = null;
 
@@ -1051,6 +1306,9 @@
 		return tmpStr;
 	},
 
+	/*
+	 * Generate SOAP message by mivIxml2jxon
+	 */
 	makeSoapMessage: function erMakeSoapMessage(aReq)
 	{
 		this.originalReq = aReq;
@@ -1058,41 +1316,29 @@
 		var msg = new mivIxml2jxon('<nsSoap:Envelope xmlns:nsSoap="'+nsSoapStr+'" xmlns:nsMessages="'+nsMessagesStr+'" xmlns:nsTypes="'+nsTypesStr+'"/>', 0, null);
 
 		this.version = this.exchangeStatistics.getServerVersion(this.mArgument.serverUrl);
-		
+
 		var header = msg.addChildTag("Header", "nsSoap", null);
+		header.addChildTag("RequestServerVersion", "nsTypes", null).setAttribute("Version", this.version);
 
-/*		if (this.mArgument.ServerVersion) {
-			header.addChildTag("RequestServerVersion", "nsTypes", null).setAttribute("Version", this.mArgument.ServerVersion);
-		}
-		else {*/
-			header.addChildTag("RequestServerVersion", "nsTypes", null).setAttribute("Version", this.version);
-//		}
-		
 		var exchTimeZone = this.timeZones.getExchangeTimeZoneByCalTimeZone(this.globalFunctions.ecDefaultTimeZone(), this.mArgument.serverUrl, cal.now());
 
 		if (exchTimeZone) {
-				//exchTimeZone.timeZone.tagName = "TimeZoneDefinition";
-				//header.addChildTag("TimeZoneContext", "nsTypes", null).addChildTagObject(exchTimeZone.timeZone);
-
-				if (this.version.indexOf("2007") > -1) {
-					var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null);
-					tmpTimeZone.setAttribute("Id",exchTimeZone.id); 
-				}
-				else {
-					var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null);
-					tmpTimeZone.setAttribute("Name",exchTimeZone.name); 
-					tmpTimeZone.setAttribute("Id",exchTimeZone.id); 
-				}
-				header.addChildTag("TimeZoneContext", "nsTypes", null).addChildTagObject(tmpTimeZone);
-				tmpTimeZone = null;
+			if (this.version.indexOf("2007") > -1) {
+				var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null);
+				tmpTimeZone.setAttribute("Id",exchTimeZone.id);
+			}
+			else {
+				var tmpTimeZone = new mivIxml2jxon('<t:TimeZoneDefinition xmlns:m="'+nsMessagesStr+'" xmlns:t="'+nsTypesStr+'"/>',0,null);
+				tmpTimeZone.setAttribute("Name",exchTimeZone.name);
+				tmpTimeZone.setAttribute("Id",exchTimeZone.id);
+			}
+			header.addChildTag("TimeZoneContext", "nsTypes", null).addChildTagObject(tmpTimeZone);
+			tmpTimeZone = null;
 		}
 		header = null;
 
 		msg.addChildTag("Body", "nsSoap", null).addChildTagObject(aReq);
 
-//dump("Going to send1:"+msg.toString().length+", xml:"+msg.getSize()+"\n");
-//dump("Going to send2:"+msg.toString()+"\n");
-
 		var tmpStr = xml_tag + msg.toString();
 		msg = null;
 		return tmpStr;
@@ -1129,9 +1375,7 @@
 	{
 		this.fail(this.ERR_PASSWORD_ERROR, aMsg);
 	},
-
-
-};
+}; // End of ExchangeRequest prototype
 
 var ecPasswordErrorList = {};
 
@@ -1140,7 +1384,7 @@
 	this.exchangeRequest = aExchangeRequest;
 
 	this.globalFunctions = Cc["@1st-setup.nl/global/functions;1"]
-				.getService(Ci.mivFunctions);
+		.getService(Ci.mivFunctions);
 	this.uuid = this.globalFunctions.getUUID();
 
 	this.callback = null;
@@ -1154,13 +1398,12 @@
 	this.password = null;
 	this.URL = null;
 	this.lastStatus = 0;  // set by nsIProgressEventSink onStatus.
-	
+
 	this.timer = Cc["@mozilla.org/timer;1"]
-					.createInstance(Ci.nsITimer);
+		.createInstance(Ci.nsITimer);
 }
 
 ecnsIAuthPrompt2.prototype = {
-
 	QueryInterface: XPCOMUtils.generateQI([Ci.nsIAuthPrompt2, Ci.nsIBadCertListener2, Ci.nsIProgressEventSink, 
 						Ci.nsISecureBrowserUI, Ci.nsIDocShellTreeItem, Ci.nsIAuthPromptProvider,
 						Ci.nsIChannelEventSink, Ci.nsIRedirectResultListener]),
@@ -1174,23 +1417,23 @@
 
 		if ((Ci.nsIBadCertListener2) && (iid.equals(Ci.nsIBadCertListener2))) {
 			this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIBadCertListener2");
-        		return Cc["@1st-setup.nl/exchange/badcertlistener2;1"].getService(Ci.mivExchangeBadCertListener2);
+			return Cc["@1st-setup.nl/exchange/badcertlistener2;1"].getService(Ci.mivExchangeBadCertListener2);
 		} 
 
 		if ((Ci.nsIProgressEventSink) && (iid.equals(Ci.nsIProgressEventSink))) {   // iid == d974c99e-4148-4df9-8d98-de834a2f6462
 			this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIProgressEventSink");
-        		return this;
-		} 
+			return this;
+		}
 
 		if ((Ci.nsISecureBrowserUI) && (iid.equals(Ci.nsISecureBrowserUI))) {   // iid == 081e31e0-a144-11d3-8c7c-00609792278c
 			this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsISecureBrowserUI");
-        		return this;
+			return this;
 		} 
 
 		if ((Ci.nsIDocShellTreeItem) && (iid.equals(Ci.nsIDocShellTreeItem))) {   // iid == 09b54ec1-d98a-49a9-bc95-3219e8b55089
 			this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIDocShellTreeItem");
-        		return Cr.NS_NOINTERFACE;
-		} 
+			return Cr.NS_NOINTERFACE;
+		}
 
 		if ((Ci.nsIAuthPromptProvider) && (iid.equals(Ci.nsIAuthPromptProvider))) {   // iid == bd9dc0fa-68ce-47d0-8859-6418c2ae8576
 			this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIAuthPromptProvider");
@@ -1199,12 +1442,12 @@
 
 		if ((Ci.nsIChannelEventSink) && (iid.equals(Ci.nsIChannelEventSink))) {   // iid == a430d870-df77-4502-9570-d46a8de33154
 			this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIChannelEventSink");
-        		return this;
+			return this;
 		} 
 
 		if ((Ci.nsIRedirectResultListener) && (iid.equals(Ci.nsIRedirectResultListener))) {   // iid == 85cd2640-e91e-41ac-bdca-1dbf10dc131e
 			this.logInfo("ecnsIAuthPrompt2.getInterface: Ci.nsIRedirectResultListener");
-        		return this;
+			return this;
 		} 
 
 		// The next iid is available sine TB 13.
@@ -1219,7 +1462,6 @@
 			return Cr.NS_NOINTERFACE;  // We do not support this.
 		}
 
-		this.globalFunctions.LOG("  >>>>>>>>>>> SUBMIT THIS LINE TO https://github.com/Ericsson/exchangecalendar/issues: ecnsIAuthPrompt2.getInterface("+iid+")");
 		throw Cr.NS_NOINTERFACE;
 	},
 
@@ -1238,15 +1480,15 @@
 		this.lastStatus = aStatus;
 		this.lastStatusArg = aStatusArg;
 		switch (aStatus) {
-		case 0x804b0003: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVING of "+aStatusArg); break;
-		case 0x804b000b: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVED of "+aStatusArg); break;
-		case 0x804b0007: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTING_TO of "+aStatusArg); break;
-		case 0x804b0004: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTED_TO of "+aStatusArg); break;
-		case 0x804b0005: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_SENDING_TO of "+aStatusArg); break;
-		case 0x804b000a: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_WAITING_FOR of "+aStatusArg); break;
-		case 0x804b0006: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_RECEIVING_FROM of "+aStatusArg); break;
-		default:
-			this.logInfo("  --- ecnsIAuthPrompt2.onStatus:"+aStatus+" of "+aStatusArg);
+			case 0x804b0003: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVING of "+aStatusArg); break;
+			case 0x804b000b: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_RESOLVED of "+aStatusArg); break;
+			case 0x804b0007: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTING_TO of "+aStatusArg); break;
+			case 0x804b0004: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_CONNECTED_TO of "+aStatusArg); break;
+			case 0x804b0005: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_SENDING_TO of "+aStatusArg); break;
+			case 0x804b000a: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_WAITING_FOR of "+aStatusArg); break;
+			case 0x804b0006: this.logInfo("  --- ecnsIAuthPrompt2.onStatus: STATUS_RECEIVING_FROM of "+aStatusArg); break;
+			default:
+				this.logInfo("  --- ecnsIAuthPrompt2.onStatus:"+aStatus+" of "+aStatusArg);
 		}
 	},
 
@@ -1272,22 +1514,27 @@
 		this.logInfo("  --- ecnsIAuthPrompt2.tooltipText (nsISecureBrowserUI):");
 		return "ecnsIAuthPrompt2.tooltipText";
 	},
-	
+
 	// nsIChannelEventSink
 	//void asyncOnChannelRedirect(in nsIChannel oldChannel, 
-        //                        in nsIChannel newChannel,
-        //                        in unsigned long flags,
-        //                        in nsIAsyncVerifyRedirectCallback callback);
+	//	in nsIChannel newChannel,
+	//	in unsigned long flags,
+	//	in nsIAsyncVerifyRedirectCallback callback);
 	asyncOnChannelRedirect: function _nsIChannelEventSink_asyncOnChannelRedirect(oldChannel, newChannel, flags, callback)
 	{
 		var tmpStr = "";
-		if (flags & 1) tmpStr += "REDIRECT_TEMPORARY";
-		if (flags & 2) tmpStr += " REDIRECT_PERMANENT";
-		if (flags & 4) tmpStr += " REDIRECT_INTERNAL";
+		if (flags & 1) {
+			tmpStr += "REDIRECT_TEMPORARY";
+		}
+		if (flags & 2) {
+			tmpStr += " REDIRECT_PERMANENT";
+		}
+		if (flags & 4) {
+			tmpStr += " REDIRECT_INTERNAL";
+		}
 
 		this.logInfo("  --- nsIChannelEventSink.asyncOnChannelRedirect :flags:"+flags+"="+tmpStr);
 
-		
 		var url1 = "";
 		var url2 = "";
 
@@ -1296,8 +1543,8 @@
 
 		this.logInfo("We are going to allow the redirect from '"+url1+"' to '"+url2+"'.");
 
-	        newChannel.notificationCallbacks = this;
-	        callback.onRedirectVerifyCallback(Cr.NS_OK);
+		newChannel.notificationCallbacks = this;
+		callback.onRedirectVerifyCallback(Cr.NS_OK);
 	},
 
 	// nsIRedirectResultListener
@@ -1312,7 +1559,7 @@
 		this.logInfo("getPrePassword for user:"+aUsername+", server url:"+aURL);
 		this.username = aUsername;
 		this.URL = aURL;
- 		
+
 		var password;
 		var myAuthPrompt2 = Cc["@1st-setup.nl/exchange/authprompt2;1"].getService(Ci.mivExchangeAuthPrompt2);
 		if (myAuthPrompt2.getUserCanceled(aURL)) {
@@ -1339,6 +1586,4 @@
 			this.globalFunctions.LOG(this.uuid+": "+aMsg);
 		}
 	},
-
-
-}
+} // End of ecnsIAuthPrompt2 prototype
diff -Nru calendar-exchange-provider-3.9.0/debian/changelog calendar-exchange-provider-4.0.0~beta4/debian/changelog
--- calendar-exchange-provider-3.9.0/debian/changelog	2017-04-08 14:45:28.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/changelog	2017-08-25 19:14:23.000000000 +0200
@@ -1,3 +1,30 @@
+calendar-exchange-provider (4.0.0~beta4-1) unstable; urgency=medium
+
+  * New upstream release 
+  * Bump Standard-Version to 4.0.0, no changes needed
+  * Change patching into rules
+  * Correct typos in changelog
+
+ -- Mechtilde Stehmann <mechtilde@debian.org>  Fri, 25 Aug 2017 19:14:23 +0200
+
+calendar-exchange-provider (4.0.0~beta2-1) unstable; urgency=medium
+
+  * New upstream release 
+    + Changing history_en_US.txt to CHANGELOG.md
+  * Changing dependency and build dependency in control (>= 52)
+  * Adapt description to thunderbird transition
+  * Analog to thunderbird bump to sid  
+
+ -- Mechtilde Stehmann <mechtilde@debian.org>  Sun, 18 Jun 2017 20:20:56 +0200
+
+calendar-exchange-provider (4.0.0~beta1-1) experimental; urgency=low
+
+  * New upstream release for using with thunderbird 52.x
+    + (Closes: #864484)
+  * Changed upstream URL in control and watch
+ 
+ -- Mechtilde Stehmann <mechtilde@debian.org>  Fri, 09 Jun 2017 18:04:59 +0200
+ 
 calendar-exchange-provider (3.9.0-4) unstable; urgency=low
 
   * debian/patches/bugfix-854025.patch:
diff -Nru calendar-exchange-provider-3.9.0/debian/control calendar-exchange-provider-4.0.0~beta4/debian/control
--- calendar-exchange-provider-3.9.0/debian/control	2017-04-08 14:41:26.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/control	2017-08-25 19:13:23.000000000 +0200
@@ -2,27 +2,27 @@
 Section: mail
 Priority: optional
 Maintainer: Mechtilde Stehmann <mechtilde@debian.org>
-Build-Depends: debhelper (>= 9), mozilla-devscripts, icedove-dev (>= 45) | thunderbird-dev, python-ply
+Build-Depends: debhelper (>= 9), mozilla-devscripts, thunderbird-dev (>= 52), python-ply
 Standards-Version: 3.9.8
 Vcs-Git: https://anonscm.debian.org/cgit/collab-maint/calendar-exchange-provider.git/
 Vcs-Browser: https://anonscm.debian.org/cgit/collab-maint/calendar-exchange-provider.git/
-Homepage: https://github.com/Ericsson/exchangecalendar
+Homepage: https://github.com/ExchangeCalendar/exchangecalendar
 
 Package: calendar-exchange-provider
 Architecture: all
-Depends: ${misc:Depends}, ${xpi:Depends}, iceowl-extension | lightning
+Depends: ${misc:Depends}, ${xpi:Depends}, thunderbird (>= 52), lightning
 Recommends: ${xpi:Recommends}
 Provides: ${xpi:Provides}
 Enhances: ${xpi:Enhances}
 Breaks: ${xpi:Breaks}
-Description: MS Exchange support for iceowl-extension
+Description: MS Exchange support for Thunderbird/Lightning
  This plugin allows one to communicate with an Exchange 2007 or 2010 server
  using the Exchange Web Service (EWS) interface.
  .
  Plugin works with the Exchange Webservice Server of Exchange 2007 or 2010 or
  that from Microsoft Office 365.
  .
- With this plugin, you can perform these tasks from within Icedove/Thunderbird:
+ With this plugin, you can perform these tasks from within Thunderbird:
  .
   * Sync Calendar and Task/Todo items from an EWS (Exchange) server. Syncing is
     done on a user settable poll interval. It will track changes on the server
diff -Nru calendar-exchange-provider-3.9.0/debian/patches/bugfix-854025.patch calendar-exchange-provider-4.0.0~beta4/debian/patches/bugfix-854025.patch
--- calendar-exchange-provider-3.9.0/debian/patches/bugfix-854025.patch	2017-04-08 14:43:22.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/patches/bugfix-854025.patch	1970-01-01 01:00:00.000000000 +0100
@@ -1,21 +0,0 @@
-bugfix for Bug #854025
-
---- a/interfaces/exchangeCalendar/mivExchangeCalendar.js
-+++ b/interfaces/exchangeCalendar/mivExchangeCalendar.js
-@@ -5569,10 +5569,14 @@
- 		var proposeStart = this.tryToSetDateValue(input.proposeStart,"");
- 		var proposeEnd   = this.tryToSetDateValue(input.proposeEnd,""); 
- 	 	var proposeNewTime = false;
--		
-+
-+		if ( proposeStart ) {
- 		input.proposeStart = cal.toRFC3339(proposeStart.getInTimezone(this.globalFunctions.ecUTC()));
-+		}
-+		if ( proposeEnd ) {
- 		input.proposeEnd   = cal.toRFC3339(proposeEnd.getInTimezone(  this.globalFunctions.ecUTC())); 
--		
-+		}
-+
- 		if( input.proposeStart && input.proposeEnd ){
- 			proposeNewTime = true;
- 		}
diff -Nru calendar-exchange-provider-3.9.0/debian/patches/remove-update-notification.patch calendar-exchange-provider-4.0.0~beta4/debian/patches/remove-update-notification.patch
--- calendar-exchange-provider-3.9.0/debian/patches/remove-update-notification.patch	2017-04-08 14:11:48.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/patches/remove-update-notification.patch	1970-01-01 01:00:00.000000000 +0100
@@ -1,9 +0,0 @@
-remove update notification
-
---- a/defaults/preferences/update.js
-+++ b/defaults/preferences/update.js
-@@ -1 +1,3 @@
--user_pref("extensions.1st-setup.others.updateRequired", true); 
-+user_pref("extensions.1st-setup.others.updateRequired", false);
-+user_pref("extensions.1st-setup.others.warnAboutNewAddOnVersion", false);
-+user_pref("extensions.1st-setup.others.checkForNewAddOnVersion", false); 
diff -Nru calendar-exchange-provider-3.9.0/debian/patches/series calendar-exchange-provider-4.0.0~beta4/debian/patches/series
--- calendar-exchange-provider-3.9.0/debian/patches/series	2017-04-08 13:13:34.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/patches/series	1970-01-01 01:00:00.000000000 +0100
@@ -1,2 +0,0 @@
-remove-update-notification.patch
-bugfix-854025.patch
diff -Nru calendar-exchange-provider-3.9.0/debian/rules calendar-exchange-provider-4.0.0~beta4/debian/rules
--- calendar-exchange-provider-3.9.0/debian/rules	2017-04-08 14:41:26.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/rules	2017-08-25 19:13:23.000000000 +0200
@@ -22,15 +22,19 @@
 override_dh_auto_install:
 	install-xpi -x 'chrome/skins/fugue/Fugue Icons README.txt' \
 		$$(find $(TOPDIRS) -name *.idl -printf '-x %p ') \
-		-x history.en_US.txt \
+		-x CHANGELOG.md \
 		-x license.txt \
 		-x defaults/preferences/debug.js \
 		calendar-exchange-provider.xpi
 
 override_dh_installdocs:
-	cp history.en_US.txt Changelog
+	cp CHANGELOG.md Changelog
 	dh_installdocs
 
+	mkdir -p $(CURDIR)/debian/calendar-exchange-provider/usr/share/xul-ext/calendar-exchange-provider/defaults/preferences/
+	cd $(CURDIR)/debian/calendar-exchange-provider/usr/share/xul-ext/calendar-exchange-provider/defaults/preferences/ && \
+		cp update_disable.txt update.js
+
 override_dh_auto_clean:
 	dh_auto_clean
 	find -type f -name *.xpt -delete
diff -Nru calendar-exchange-provider-3.9.0/debian/watch calendar-exchange-provider-4.0.0~beta4/debian/watch
--- calendar-exchange-provider-3.9.0/debian/watch	2017-04-08 14:41:26.000000000 +0200
+++ calendar-exchange-provider-4.0.0~beta4/debian/watch	2017-08-25 19:13:23.000000000 +0200
@@ -1,3 +1,3 @@
 version=3
 opts="uversionmangle=s/-Beta/~beta/;s/-rc/~rc/,filenamemangle=s/.*\/v?(\d+\.\d+\.\d+(?:-(Beta|rc)\d+)?)\.tar\.gz/exchangecalendar-$1.tar.gz/" \
-https://github.com/Ericsson/exchangecalendar/releases/ .*/v?(\d+\.\d+\.\d+(?:-rc\d+)?)\.tar\.gz
+https://github.com/ExchangeCalendar/exchangecalendar/releases/ .*/v?(\d+\.\d+\.\d+(?:-rc\d+)?)\.tar\.gz
diff -Nru calendar-exchange-provider-3.9.0/history.en_US.txt calendar-exchange-provider-4.0.0~beta4/history.en_US.txt
--- calendar-exchange-provider-3.9.0/history.en_US.txt	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/history.en_US.txt	1970-01-01 01:00:00.000000000 +0100
@@ -1,625 +0,0 @@
-Version 3.7.0:
-- d1b2860 (origin/master, origin/HEAD, master) revert calendar-event-dialog
-- df713f4 Merge pull request #458 from enozkan/patch-5
-- 180e91a Update preferences.dtd for Turkish locale
-
-Version 3.6.0:
-- a2a50be strict mode error fix
-- 5db3c8d task sync and strict mode error fix
-- 16d56bf translation for preference password fix
-- 22850a8 preference password fix
-- 1fcaf4c Merge pull request #423 from Dominique-2202/patch-2
-- 6b16cad French translation calendar-summary-dialog.dtd
-- ae091d5 Merge pull request #422 from Mechtilde/Translation
-- d716986 German translation for calendar-summary-dialog.dtd
-- 65c222a Merge pull request #415 from enozkan/patch-4
-- 1fd65b1 Merge pull request #416 from Trim/erFindContactsOffset
-- 23ca0b3 Merge pull request #417 from Trim/erFindCalendarItems
-- e537089 Update calendar-summary-dialog.dtd for tr
-- 7b4b9fb erFindContacts: give a copy of arrays to callback
-- 2235634 erFindContacts: Use server offset instead of own computation
-- b7dd3aa erFindContacts: remove trailing blanks and use contact logs instead of main logs
-- 9a5b78d erFindContacts: Requests all contacts of address books
-- 4681316 erFindCalendarItems: use slice method to clone javascript arrays
-- 91ac17f erFindCalendarItems: don't cal too many times possibly big array
-- b45a6f4 erFindCalendarItems: use LOG instead of dump
-- 3f9de40 string not translatable #409
-- 9a82408 its good to have xpi filename with 'v' preceeding the version
-
-Version 3.5.0:
-- Fix Thunderbird hangs on startup
-- Fix Be more defensive about terminating the loop: under some circumstances startYearDay (and I presume startYear) can be greater than endYear[Day] on entry to the loop.
-- Fix Reword log, Bug #373 "Incorrect exhortationto MAIL THIS LINE TO ..."
-- Fix Bug #371 "Cannot add custom reminder (alarm) to an event ..."
-- Fix Lightning 4.0.2.1
-
-Version 3.4.0:
-- New Support Extended to Lightning 4.0.0.1
-- New Support Extended to Thunderbird 38.*
-- New EWS Tagger - Feature
-- New Task Email Follow Up - Feature
-- New Language Support For exchange address Book
-- New Mail folder Delegation - Feature
-- New Automatically set lightning time zone
-- New Plug in Builder for deb package
-
-- Fix Reminder Problem 
-- Fix #190 - Can not add manually add exchange address book
-- Fix Calendar not refreshing during suspend/resume
-- Fix Busy/Free information wasn’t available
-- Fix Ignore domain request for email user names.
-- Fix freezing on start up
-- Fix Restoring cache
-- Fix rtews.dtd typo fixed
-- Fix Cant not add Google calendar
-- Fix Avoid JS exception in auto completion.
-- Fix Also fill out primary email address if local ID is present
-- Fix Treat public DLs the same way as private ones in auto completion
-- Fix Exchange Icon Update in preference
-- Fix Missing Translation English language
-- Fix Israel Timezone fix for Daylight savings time
-- Fix Password Looping fix
-- New Updated French,German Translation
-- New Preference for mail properties syncing
-- New Preference for Email Follow up
-
-- Change Update suggestions only for stable release
-- Change Minimum Refresh time is set to 60
-- Change Enabled Cache by default or No disable option for cache
-- Change Removed all calendar Refresh time
-- Change Optimized syncing method
-- Change Enable NTLM by default in Thunderbird
-- Change Remove  old saved password if user doesn’t choose
-- Change Block adding domain entry in autodiscovery window when email used
-- Change Platform based CSS thanks to git-hub user  "@mariolorenz"
-- Change Clear Logging.
-
-Version 3.3.2:
-- Bug fix release
-
-Version 3.3.1:
-- New     New Column for invite mail in message list pane
-- New     Support for Thunderbird Nightly Aurora 38.0+
-- New     Locale improved
-- New     Delegating Calendar feature
-- New     Auto-update from Git-hub releases
-- New     High priority mails with auto tagging - important
-
-- Changed Meetings that are canceled are  removed
-- Changed New Event usability issue in lightning
-- Changed Priority column with updated icons,startup preference
-- Changed Cache Clear on Add on Update
-
-- Fixed  Dismissing  reminder
-- Fixed  Accept/Tentative/Reject button appearance
-- Fixed  Fix Address Book freeze when attempting to view "Properties"
-- Fixed  Tentative status does not get saved
-- Fixed  Unable to forward event  in Thunderbird
-- Fixed  Breaking other add on columns in message list pane
-- Fixed  UX error when saving Out of Office 
-
-Version 3.2.0:
-- changed add-on name to "Exchange EWS Provider" as it is shorter than including all the exchange versions it can connect to.
-- Fixes bug where sometimes the date/time is shifted on Free/busy info in calendar of someone else.
-- Added preference userAgent. User can now specify their own userAgent string to use in communication.
-- Fixes Bug 277 - Cannot extend the time on a calendar event (Exchange2007)
-- Improved Out Of Office text editor so it is fully HTML aware again.
-- Improved memory usage. It shoud use less memory now. Please read bug 279 on https://www.1st-setup.nl/bugzilla
-- Fixed Bug 287 - no folder details anymore in the ews settings of calendar
-- Fixed a bug where it was not possible to create an exception.
-- Update on French locale.
-- Fixed Bug 291 - Modify instance of recurring meeting fails silently
-- Added Access Control List functionality of Lightning to follow user rights and permissions.
-- Russian translation is added.
-- Fixed problem with new exchange versions of Office365 and Exchange2013.
-- User can mark calendar as readonly. This state is preserved between restarts.
-- Rich text editing of description (body) part for calendar items and task items.
-- Fixed problem where offline cache became out of sync.
-- You can click on links in the description text of invitation and read-only events/tasks
-
-Version 3.2.0-Beta20:
-- Fixed Bug 276 - Duplicate entries, wrong hours and sometimes missing entries when viewving other calendars
-
-Version 3.2.0-Beta16:
-- Fixed Bug 273 - Tmezone in US or Canada triggers XML error and results in HTTP 400 Bad Request.
-
-Version 3.2.0-Beta14:
-- Received new German translation from Björn Töpper.
-- Fixed some small outstanding bugs which will get mentioned when I release the final version.
-
-Version 3.2.0-Beta11:
-- Bug 267 - Problem with upgrade from 3.1.2-bug175-3 to 3.2.0-Beta10
-
-Version 3.2.0-Beta10:
-- Fixed problem where the add-on would not show events and task against an Exchange2013 server.
-- Changed the title of the add-on to "Exchange 2007/2010/2013 Calendar, Tasks, Contacts and GAL Provider"
-- Started work on improving the progress tooltip info.
-- Fixes bug 162 Changing recurring meeting to Wednesdays, moved it to Thursday
-
-Version 3.2.0-Beta9:
-- Introduced loading/showing image when one is available for a contact (addressbook). Only works starting from Exchange server 2010_SP2
-- Fixes a bug where creation of new tasks and Event was not possible since Beta8.
-- Finalized autocompletion. Depending on the connetion speed with the exchange server it can take some time to fill the autocomplete list.
-
-Version 3.2.0-Beta8:
-- Introduced an icon which shows connection status to the exchange server.
-- Introduced autocompletion. It works but could use some refinement.
-- Improved CPU load when the add-on has problems connecting to the exchange server .
-
-Version 3.2.0-Beta6:
-- Improved copying between exchange calendars and non exchange calendars.
-- Fixed snooze/dismiss reminder problems for events and tasks.
-- Improved UI scripts used in XUL.
-- Fixes Bug 264 - Schema failure when dismissing a reminder
-- Fixes Bug 261 - Number of jobs in Status Bar increasing
-- Fixes Bug 255 - Complete state of tasks not working in today pane
-- Fixes Bug 254 - NewEventInterfaces lists calendars twice
-- Fixes Bug 253 - Import Calendar into Exchange Calendar / copy calendar items from one to another
-- Fixes Bug 252 - Internal server error on reminder dismissal
-
-Version 3.2.0-Beta5:
-- Fixed working with attachments lists in the different views/dialogs/panes
-- Customized settings reminders on events and tasks according to what is possible in Exchange.
-- Fixes Bug 255 - Complete state of tasks not working in today pane
-- Fixes Bug 256 - Set custom reminder on task created in outlook without due or entry date not possible
-
-Version 3.2.0-Beta4:
-- Split mivExchangeEvent object into mivExchangeEvent and mivExchangeBaseItem. As preparation for mivExchangeTodo.
-- Improved the conversion from Exchange Timezone to Lightning timezone and from Lightning timezone to Exchange timezone.
-- Added the Exchange task/todo detail fields. Lightning does not known about the by default.
-- Fixes Bug 63 - Repeating tasks posted to Exchange Server have incorrect due date/time
-- Fixes Bug 107 - Snooze state of tasks gets lost after restart
-- Fixes Bug 194 - Tasks appear at wrong date
-- Fixes Bug 215 - Snoozed task reminders continually pop up, dismissing task reminders takes 2 clicks of Dismiss
-- Fixes Bug 235 - Try to set a task due date aways sets the current date time
-- Fixes Bug 250 - No tasks with current 3.2.0 beta
-
-Version 3.2.0-Beta3:
-- Fixes Bug 150 - Dismissing reminders asks to send update for meeting
-- Fixes Bug 180 - NTLM and Kerberos fail
-- Fixes bug 229 - Creating a custom repeating event - creates event on following day
-- Fixes bug 238 - "All day Event" created for day prior to selected date 
-- Fixes bug 241 - Autodiscover RedirectAddr not followed 
-- Fixes bug 246 - Modifying recurring meeting resulted in "modification failed" errors 
-- Moved exchangecalendar object into it's own interface.
-- Create our own recurrenceInfo object/interface.
-
-Version 3.2.0-Beta2:
-- Fixes bug 241 -  Autodiscover RedirectAddr not followed
-
-Version 3.2.0-Beta1:
-- Added own ExchangeEvent Interface. With this creation of items from cache or exchange server should be faster.
-- Converted handling of timezones to own interface. 
-- Timezone of Lightning events are set to those of Exchange. As close as possible because the timezone databases between Exchange and Lighting are not the same.
-- Added new SOAP Autodiscovery functionality which is supported since Exchange2010. It will use this when available.
-
-Version 3.1.102:
-- Fixes bug 226: No more than 20 contacts are shown.
-
-Version 3.1.99:
-- Fixes Bug 212 - version >= 3.x leaks memory
-- Fixes Bug 211 - 3.1.2 breaks login (3.1.1 working)
-- Fixes Bug 188 - Adding a new Exchange 2010 EWS Calendar via add-on goes into an infinite password prompt loop
-- Fixes Bug 173 - Exchange 2007/2010 Calendar and Tasks Provider deletes Outlook Calendar entries
-- Fixes Bug 164 - Can not Connect to server
-- Fixes Bug 159 - Thunderbird freezes
-- Fixes Bug 157 - Infinity Loope for Password/Username
-- Fixes Bug 143 - The adding uses wrong folder and does not fetch contacts
-
-Version 3.1.2:
-- Fixed bug 175: After 10 calendars the jobs will hang up
-- Fixed bug 201: Number of Jobs displayed in status bar is negative
-- Added new loadbalancer for request to Exchange servers. You can now control the simultaneous request to the exchange server.
-- Created new interface for the global functions.
-- Added extra info to progress indicator. It now also uses the new loadbalancer for the statistics.
-
-Version 3.1.1:
-- Fixed bug 205 Extension overwrites URI for non-exchange calendars
-
-Version 3.1.0:
-- Fixed part of bug51. When emailaddress of attendee is empty do not throw an error.
-- Fixed: Bug where removal of last attachment was not possible.
-- Enhancement: Startup of Thunderbird has been improved.
-- Fixed problem when turning off and on offlineCache.
-
-Version 3.0.2:
-- Minor bug fix.
-
-Version 3.0.1:
-- Fixed bug 196: Version 3.0.0-rc3 seems to interfere with address autocompletion
-- Fixed bug 204: Thunderbird hangs when creating a new item with attachment
-- Added automatic update functionality. This will check the developer website for new versions and give the change to autmoatically install it. 
-
-Version 3.0.0:
-- Removed all references to e4x
-- Removed some bugs and stabilized the code.
-
-Version 3.0.0-rc4:
-- Add Japanese translation.
-- Added fix for new chunked message responses from Exchange server.
-
-Version 3.0.0-rc3:
-- Optimized the code to improve speed.
-
-Version 3.0.0-rc2:
-- Optimized the xml handling code so startup and other communications are faster.
-
-Version 3.0.0-rc1:
-- Converted last part, editing of tasks, from e4x to xml2jxon.
-
-Version 3.0.0-beta4:
-- Fixed problem where a reminder change (dismiss or new time) was not saved to exchange.
-
-Version 3.0.0-beta3:
-- Fixed bug 182: Reoccuring Events keep popping up in reminder.
-
-Version 3.0.0-beta2:
-- Fixed two parts which were not yet converted. Editing of tasks still to do.
-
-Version 3.0.0-beta:
-- Complete rewrite of all xml handling stuff from using e4x to the new xmlToJxon object.
-
-Version 2.2.3:
-- Fixed: bug 176 - Calendars whose names contains a slash can't be opened
-
-Version 2.2.2:
-- Fixed: bug 160 - Meeting invitation received does not get added after accepting
-
-Version 2.2.1:
-- Fixed bug when closing TB the offline cache would be emptyed.
-- Fixed: Bug 161 - pb accessing calendars
-
-Version 2.2.0:
-- Fixed complaint of ad-on checker.
-- Fixed bug of cloning a calendar showed empty fields.
-
-Version 2.1.4:
-- Fixed: "Unresponsive script" bug.
-
-Version 2.1.3:
-- Fixed: Bug 52 - Incorrect sync: random calendar events missing, others duplicated
-
-Version 2.1.2:
--Fixed: Bug 118 - Kerberos authentication broken in 1.8.11
-
-Version 2.1.1:
-- Fixed: Bug 151 - Email id property of exchange calendar becomes None on updating thunderbird to 13.0
-- Fixed: Bug 153 - "allday" event -> invite someone -> password request -> communication stopped
-- Improved: Disabled calendars are not started on TB startup.
-- Fixed: The way a calendar startup after is has been created newly.
-
-Version 2.1.0:
-- Fixed filtering of events
-- Fixed saving of the EWS settings.
-- Fixed calendarReset.
-- Improved getItems function.
-
-Version 2.0.5:
-- Added: Processing of getItemsFromOfflineCache into a seperate thread.
-- Fixed: Problem when turning on offline cache this would only start after restarting TB. 
-
-Version 2.0.4:
-- Fixed: bug with reminders in offline cache.
-- Added: Extra dialog when answering an invitation.
-
-Version 2.0.2:
-- Improved: Further improved Offline cache items retrieval.
-- Fixed: Bug when receiving a HTTP 302 relative redirect. Because of a typo in the code it threw an exception. Possibly bug 51.
-
-Version 2.0.1:
-- Improved: Offline cache items retrieval.
-
-Version 2.0.0:
-- Added: Offline cache functionality. (When not connected or offline it goes into Read-Only mode)
-- Added: Invitation forwarding functionality.
-
-Version 1.8.19:
-- Fixes: problem where Out Of Office stopped working int TB12. Fix replaces the WYSIWYG editor into a flat text editor.
-- Fixes: Several small bugs.
-
-Version 1.8.18:
-- Addedd access to exchange contacts folders. (Currently READ-ONLY)
-- Fixed: Problem with dismissing and snoozing alarms.
-- Fixed: Problem on autodiscovery where sometimes a EWS URL select list was shown with duplicate entries.
-- Fixed: Other small problems.
-- Fixed: Bug 116 - Authentication fails after Thunderbird-restart
-- Fixed: Bug 24 - Accepting or rejecting of invitations changes owner
-
-Version 1.8.16:
-- Fixed: Bug 122 - New: I get "Event Invitation" email for my own meetings when I import them
-- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future
-- Fixed a lot of smaller bugs.
-
-Version 1.8.13:
-- Fixed: Bug 120 - All my calendar appointments are not visible in Thunderbird
-- Fixed: Bug 94 - Credentials (Username, Password) for calendars are not stored
-
-Version 1.8.12:
-- Fixed: Bug 117 - tasks calendar shows calendar items
-- Fixed: Problem where only Free/Busy information would be shown for defalt personal calendar.
-
-Version 1.8.6:
-- Fixed: Bug 111 - No events are visible when user only has calendar permission to see Free/Busy info
-
-Version 1.8.5:
-- Fixed: Bug 91 - Recurring appointment causes immediate reminders for all future occurrences
-- Fixed: Bug 107 - Snooze state of tasks gets lost after restart
-- Updated: Code for setting of alarms and snooze parameters changed completely.
-
-Version 1.8.4:
-- Fixed: Bug 103 - aListener not defined in calExchangeCalendar
-- Added: Global minimal memory cache size preferences.
-
-Version 1.8.3:
-- fixed: Bug 102 - Extension continually asks for password
-
-Version 1.8.1:
-- Fixed: Bug 99 - Tasks do not show up in the tasks pane/tab
-
-Version 1.8.0:
-- Added: Full attachment functionality. 
-- Fixed: Bug 97 - Last month's events are missing
-
-Version 1.7.18:
-- Fixed: Bug it is not possible to accept or decline a meeting invitation
-
-Version 1.7.17:
-- Fixed: Bug where a HTTP 302 redirect which was called as an error was not handled correctly.
-- Fixed: Bug 31 - Unable to invite attendees
-- Fixed: Bug 45 - Cannot display users own calendar
-- Fixed: Bug 68 - MenuItems for creating new items are disabled
-- Fixed: Bug 77 - Lightening fails to save Microsoft Live Meeting style events to the Exchange calendar
-- Fixed: Bug 80 - request response HTTP 302 redirect is NOT redirected and communication stops
-- Fixed: Bug 82 - Copying of events from google calendar does not work
-- Fixed: Bug 83 - Can't add a calendar -> HTTP-ERROR 500
-- Fixed: Bug 84 - checks performed on disabled calendars
-- Fixed: Bug 85 - Can't open or save file attachments in a calendar meeting
-- Fixed: Bug 86 - Invalid log path on Windows
-- Added: When you try to access another person's calendar but do not have full read permissions it will switch and only tries to get Free/Busy/Tentative/OOF information.
-- Added: The domainname is no longer a required field
-- Added: German localization
-- Added: Setting logging preferences can now be done from the TB preferences.
-- Added: Exporting to ICS. Currently it only export what is has requested from the Exchange server. Default a period of one month ahead and one month back from currentdate.
-- Changed: Changed default CalendarPollInterval to once every 60 seconds and InboxPollInterval to once every 180 seconds.
-
-Version 1.7.15:
-- Fixed: Bug 59 - Exchange sends extra invitations when first one is accepted
-- Fixed: Bug 32 - Unable to add event to calendar using iTIP buttons 
-- Fixed: Bug 33 - Accept multiple-day appointment request via iTIP creates single-day event
-- Fixed: Bug 61 - Error: reference to invalid character number when trying to pull in calendar
-- Fixed: Bug 62 - Moving calendar item from one calendar to another fails
-- Added: Functionality to clone an Exchange Calendar.
-- Fixed: Bug 19 - Event stays shown after deletion
-- Fixed: Bug 66 - No workflow (accept, reject, ...) buttons are shown in invitations
-- Fixed: Bug 65 - read only of calendar
-- Added: New debugging preferences and possibility to create a log/debug file.
-- Added: Finer info/error control in communication object.
-
-Version 1.7.13:
-- Added: Folder properties visible in EWS Settings dialog.
-- Added: Mouse cursor wait indication when browsing folders.
-- Added: Add a new calendar base on the information in a share calendar invitation from someone.
-- Fixed: BUG 54 Shared Calendar w/notification: error when closing
-- Fixed: BUG 55 Can't set reminder for a task
-- Added: Opening and saving of attachments. (ReadOnly)
-- Added: Check if lightning is installed and active. When not it will show a warning.
-- Added: Functionality to migrate an Exchange Provider add-on calendar to this add-on.
-- Added: User can change poll interval for calendar through EWS Settings.
-- Fixed: Bug 56 - Not possible to acknowledge repeating meeting
-- Fixed: Small bug when importing an invitation send from a Google Calendar. It does not contain timezone information.
-- Fixed: Bug 38 - Invalid security certificate
-- Added: Mouse cursor wait indicatie when checking server and username on creating an calendar or changing the server settings.
-
-
-Version 1.7.12:
-- Added: Support for Seamonkey.
-- Added: Access to public/shared folders without a mailbox. Only windows username, domain & password required.
-- Added: You can use now a username consisting of a username part followed by ampersand (@) and full domainname and empty domain field or a username and domain field value.
-- Fixed: BUG37. Alarm info on a master calendar item is not show correctly.
-- Fixed: BUG41. Synching meetings with empty titles fails
-- Added: French localization.
-- Fixed: Bug 44 - Synchronizaton fails when a calendar item has no start date
-- Fixed: Bug 39 - Accepting a meeting does not get updated in Lightning
-- Added: Importing ICS file.
-- Change: Changed namespacing on request of Mozilla.
-
-
-Version 1.7.11:
-- Modified: Debug log lines show more usefull information.
-- Fixed: BUG 30: Accept via iTIP button fails for requests sent to distribution lists
-- Improved: The processing of meeting invitations is complete. Even the iTIP buttons work.
-
-Version 1.7.10a3:
-- Fixed an Exchange server version problem in function GetMeetingRequestByUID. It did not work correctly on Exchange 2007
-
-Version 1.7.10a1:
-- Fixed: BUG 28 "NL -> EN translation string" EN != "Settings voor calendar"
-- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner". Meeting invitations are not yet working as wanted when using iTIP buttons.
-
-Version 1.7.9:
-- Fixed: Meeting requests and updates to these requests were not processed in the right way.
-
-Version 1.7.8:
-- Fixed: BUG 25 Recuring event with reminder prevents calendar refresh
-- Fixed: BUG 26 Deleting a single occurrence in a sequence has no effect
-- Fixed: BUG 27 Today Pane Tasks fails to show newly created tasks
-
-Version 1.7.7:
-- Fixed: BUG 24 "Accepting or rejecting of invitations changes owner"
-- Fixed: Stabilized meeting invitations in global. Now works with distribution lists, other alias name, etc...
-
-Version 1.7.7a3:
-- Fixed: BUG 23 "Request sent instead of Confirmation; wrong Timezone"
-- Fixed: Trying to mark a task as completed gives an update error: "CompleteDate cannot be set to a date in the future."
-- Fixed: Removing the completed task status through the checkbox in the task view produces an error.
-
-Version 1.7.7a2:
-- Fixed: Could not respond to aa meeting invitation where the mailbox name was different in character Upper/Lowercase than the emailaddress in the invitation.
-
-Version 1.7.7a1:
-- Fixed: Chagning/updating of an existing item where you are the organiser but also on the attendee list, created by outlook, gave an error.
-- Added: The add-on now modifies the Exchange nextreminderdate on the Exchange server as the old Exchange provider add-on did. This is part of the merge of the add-ons.
-
-Version 1.7.6:
-- Added: Progres indicator with tooltip. (closes BUG report 14)
-- Solved: BUG 16 Cannot create event due to Time Zone error (reported by Sven)
-- solved: BUG 17 Out of office retrieval of incorrect values (reported by Sven)
-- Solved: When you are editing Out Of Office settings and had the externel reply window open and did a save the text for the external reply was changed by the internal reply message.
-- Added: It is not possible anymore to add tasks to a calendar folder and calendaritems in a tasks folder. This would produce an error.
-- Fixed: BUG 18 Changing the end or start date of an allday event produces an error. (reported by Sven)
-
-Version 1.7.5:
-- Minor changes to keep the add-on working in version 10.0a2.
-- Fixed: Problem where timezone information downloading did not work for exchange 2007.
-
-Version 1.7.4:
-- Added: The snooze and dismiss states are saved on the exchange server so they survive a restart of TB. Was a problem when "show missed alarms" was on. (BUG 12 reported by pazz)
-- Solved: Shut-down is faster.
-
-Version 1.7.3:
-- Solved: BUG 11/ During creation of an allday event with a reminder or turning on the reminder on an existing allday event triggers an error and change is not saved.  (reported by gislair)
-
-Version 1.7.2:
-- Solved: When the windows account got locked the password manager kept asking for a password. Now after tree failed attempts it will stop asking until a restart.
-- Solved: Respong to a meeting request through the iTIP buttons generated an error and did not work.
-
-Version 1.7.1:
-- Solved: When an organiser removed a meeting which was confirmed the update in your calendar was performed every 3 seconds.
-
-Version 1.7.0:
-- Changed: Folder browser shows different icons for different folderclass property.
-- Solved: Removing a meeting in a public folder did not work an give error.
-- Solved: Buttons Save and cancel in the EWS settings dialog would drop of dialog window.
-- Major version changed into 1 because the add-on is feature complete.
-
-Version 0.7.47:
-- New: Selecting the right folder below the folderbase can now be done through a folder browser.
-
-Version 0.7.46
-- Improved: Creation, modification and deletion of repeating events.
-
-Version 0.7.45
-- Solved: Removing a repeating event did not allways work.
-
-Version 0.7.44
-- Solved: Creating an all day event did not work anymore.
-
-Version 0.7.42
-- Solved: Some alarms could not be removed.
-- Solved: For repeating meetings multiple alarms were shown, with same titel and date, when option show missed alarms was on in Lightning settings.
-- Added: Option to automatically remove responses to meetingrequest from your inbox when you are not the organiser.
-- Solved: BUG10 reported by P.Palai.
-
-Version 0.7.41
-- Solved: Checking/searching for certain folderpath locations did not work.
-- Solved: Manipulating occurrences in a repeating meeting did not always work.
-- Solved: Changing the EWS settings did not refresh the calendar and therefore the changes were not visible.
-
-Version 0.7.40
-- Some small changed to make shared funcitonality available to the Exchange Contacts add-on
-- Meetingrequest in a non personal folder we show als invitation request to the use. Now they are not shown anymore as invitation request.
-- Added different job queues for synchronization and modify actions to the EWS server. During startup changes are show earlier.
-
-Version 0.7.39
-- User must choose to whom invitation updates are send.
-- Added a new calender folder poller which will sync by default every 10 seconds.
-
-Version 0.7.38
-- Changes in meetings in personal calendars will be send always to all involved persons. 
-- In a later version the extension will ask the user to specify what he wants (send updates or not)
-
-Version 0.7.37
-- Fixed problem where after an autodiscovery and server and mailbox check did not work.
-- Removing a calendar will remove all settings and running processes.
-
-Version 0.7.36
-- Fixed a warning in the Mozilla tests.
-
-Version 0.7.35
-- Fixed bug (reported by Tudor Timisescu). Check for server and mailbox did not work anymore.
-
-Version 0.7.34
-- Added management of Out of Office settings.
-
-Version 0.7.33
-- Added three new options to the EWS preferences for each calendar.
-- Completed list of "base folder" options.
-
-Version 0.7.32
-- EWS Timezome information added for Exchange2007(_SP1) servers
-- Problems with allday event solved (see version 0.7.30)
-- Tasks date and times are working now for different timezones.
-- Version is stable for production use.
-
-Version 0.7.31
-- Fixed upgrade problem between versions 0.7.29 and 0.7.30
-
-Version 0.7.30
-- Timezone is added correctly. There is even a difference between a 2010 or 2007 version of Exchange.
-- Starting mechanism is optimized.
-- A calendar reset is done completely now.
-- Known problem: If you add a alldayevent EWS will add an extra day infront of it. So 1 allday becomes two.
-
-Version 0.7.29
-- Added the posibility to change your reaction to an invitation request in the meetingresponse screen.
-
-Version 0.7.28
-- Addedd extra options to the EWS Settings.
-
-Version 0.7.27
-- Fixed bug 6. TB becomes unresponsive on paging back in week view.
-
-Version 0.7.26
-- Extra settings for each calendar (poll inbox)
-- Inbox poller results are better processed.
-- Settings are now saved in the right location within preferences..
-
-Version 0.7.22
-- Deleting of an occurrence from a string does work now.
-- Alarms can be dismissed or gesnoozed. 
-	This status is not saved between TB restarts.
-	This is an in memory status maintained by TB.
-
-Version 0.7.21
-- iTIP processing improved.
-
-Version 0.7.20
-- Settings and alarm on recurring appointments is better handled.
-
-Version 0.7.19
-- Fixed BUG 4.
-- Fixed BUG 5.
-- So called observers are broken down in the right way.
-
-Version 0.7.18
-- Fixed BUG 3.
-- Alarm changing improved.
-
-Version 0.7.17
-- Fixed BUG 2.
-
-Version 0.7.16
-- Task alarms are being set in the right way.
-- Dismiss or snooze the alarm of a task is working now.
-
-Version 0.7.15
-- Removed all storage of passwords in Memory. All password are only stored by the default Thunderbird Password Manager.
-
-Version 0.7.14
-- Imporved iTIP processing.
-
-Version 0.7.13
-- Source code cleanup.
-- Exception "nsIAuthPrompt2.asyncPromptAuth" solved.
-- Failures during creating connections to server are better handled.
-
-Version 0.7.12
-- Changed text on buttons for MessageRespons screen.
-- Fixed where it was not possible to create an alldayevent.
-- Dismissing an alarm will work.
-
-Version 0.7.11
-- Improved iTIP processing.
-
-Version 0.7.10
-- Fixed problem for date/time conversions. Through this problem some appointments were show on the wrong date or time.
diff -Nru calendar-exchange-provider-3.9.0/install.rdf calendar-exchange-provider-4.0.0~beta4/install.rdf
--- calendar-exchange-provider-3.9.0/install.rdf	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/install.rdf	2017-07-03 22:10:10.000000000 +0200
@@ -5,13 +5,13 @@
 
   <Description about="urn:mozilla:install-manifest">
     <em:id>exchangecalendar@extensions.1st-setup.nl</em:id>
-    <em:version>3.9.0</em:version>
+    <em:version>4.0.0-beta4</em:version>
     <em:targetApplication>
       <Description>
       	<!-- Thunderbird -->
         <em:id>{3550f703-e582-4d05-9a08-453d09bdfdc6}</em:id>
         <em:minVersion>12.0</em:minVersion>
-        <em:maxVersion>50.*</em:maxVersion>
+        <em:maxVersion>52.*</em:maxVersion>
       </Description>
     </em:targetApplication>
 
@@ -20,7 +20,7 @@
           <!-- Seamonkey -->
         <em:id>{92650c4d-4b8e-4d2a-b7eb-24ecf4f6b63a}</em:id>
         <em:minVersion>2.6</em:minVersion>
-        <em:maxVersion>2.26.*</em:maxVersion>
+        <em:maxVersion>2.46.*</em:maxVersion>
       </Description>
     </em:targetApplication>
 
@@ -30,7 +30,7 @@
 
 You can view, delete, create and update calendar and task/todo items. And manage "Out of Office" settings.
 
-Dutch, French, English, German, Swedish and Japanese localizations.
+Dutch, French, English, German, Swedish, Japanese, Russian, Italian and Turkish localizations.
 
 Some of the icons and images used are from the Fugue Icons Collection made by Yusuke Kamiyamane (http://p.yusukekamiyamane.com/)</em:description>
     <em:creator>Ericsson (exchangecalendar@ericsson.com)</em:creator>
@@ -42,6 +42,8 @@
     <em:translator>Björn Töpper (de)</em:translator>
     <em:translator>Hiroshi Miura (ja-JP)</em:translator>
     <em:translator>Alexey Sinitsyn (ru)</em:translator>
+    <em:translator>Alessandro Menti (it-IT)</em:translator>
+    <em:translator>Engin Özkan (tr)</em:translator>
     <em:homepageURL>http://www.1st-setup.nl/wordpress/?page_id=133</em:homepageURL>
     <em:iconURL>chrome://exchangecalendar-common/skin/images/lightningexchangecalendar.png</em:iconURL>
     <em:type>2</em:type> <!-- type: extension -->
@@ -56,7 +58,7 @@
 You can view, delete, create and update calendar and task/todo items. And manage "Out of Office" settings.
 You can read and use contacts and global addres list contacts for address autcompletion.
 
-Dutch, French, English, German, Swedish and Japanese localizations.
+Dutch, French, English, German, Swedish, Japanese, Russian, Italian and Turkish localizations.
 
 Some of the icons and images used are from the Fugue Icons Collection made by Yusuke Kamiyamane (http://p.yusukekamiyamane.com/)</em:description>
 		</Description>
@@ -71,7 +73,7 @@
 Sie können diese Kalender- und Aufgabeneinträge betrachten, löschen, erstellen und aktualisieren. Sie können die "Out of Office"-Einstellungen verwalten.
 Sie können Kontakte und globale Adresslisten lesen und für die Autovervollständigung der Adressen nutzen.
 
-Übersetzungen in Niederländisch, Französisch, Deutsch Schwedisch und Japanisch.
+Übersetzungen in Niederländisch, Französisch, Deutsch, Schwedisch, Japanisch, Russisch, Italienisch und Türkisch.
 
 Einige der Icons und die Bilder werden aus der Fugue Icons Collection erstellt von Yusuke Kamiyamane (http://p.yusukekamiyamane.com/) genutzt.
                </em:description>
@@ -123,5 +125,34 @@
 		</Description>
 	</em:localized>
 
+	<em:localized>
+		<Description>
+			<em:locale>it-IT</em:locale>
+			<em:name>Provider Exchange EWS</em:name>
+			<em:description>Consente di sincronizzare i propri Calendario, Attività e Contatti con un server Microsoft Exchange 2007/2010/2013 EWS da Lightning.
+
+È possibile visualizzare, eliminare, creare e aggiornare elementi del Calendario e Attività/Da fare e gestire le opzioni Fuori sede.
+È possibile leggere e utilizzare i propri contatti e i contatti della Global Address List per l'autocompletamento degli indirizzi.
+
+Localizzato in olandese, francese, inglese, tedesco, svedese, giapponese e italiano.
+
+Alcune delle icone e immagini utilizzate sono state tratte dalla Fugue Icons Collection di Yusuke Kamiyamane (http://p.yusukekamiyamane.com/)</em:description>
+		</Description>
+	</em:localized>
+	  	  
+	<em:localized>
+		<Description>
+			<em:locale>tr</em:locale>
+			<em:name>Exchange EWS Sağlayıcısı</em:name>
+			<em:description>Lightning içinde, Takvim, Görevler ve Kişileri Microsoft Exchange 2007/2010/2013 EWS sunucunuzla eşitlemenizi sağlar.
+
+Takvim ve Görev-Yapılacaklarınızdaki maddeleri görebilir ve silebilir, yeni maddeler yaratabilir ya da maddeleri güncelleyebilirsiniz. "İşyeri Dışında" ayarlarınızı da denetleyebilirsiniz.
+Kişilerinizdeki ve Genel Adres Listesindeki kişileri görebilir ve automatik adres tamamlamada kullanabilirsiniz.
+				
+Almanca, Flemenkçe, Fransızca, İngilizce, İsveççe, İtalyanca, Japonca, Rusça, ve Türkçe yerelleştirmeleri vardır.
+
+Bazı ikon ve imgeler, Yusuke Kamiyamane tarafından yapılmış olan Fugue Icons Collection'dan alınıp kullanılmıştır. (http://p.yusukekamiyamane.com/)</em:description>
+		</Description>
+	</em:localized>
 	</Description>
 </RDF>
diff -Nru calendar-exchange-provider-3.9.0/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js
--- calendar-exchange-provider-3.9.0/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeAuthPrompt2/mivExchangeAuthPrompt2.js	2017-07-03 22:10:10.000000000 +0200
@@ -109,8 +109,6 @@
 //		var realm = aRealm;
 		var realm = "Exchange Web Service";
 
-		//this.logInfo("getPassword: useCached:"+useCached);
-
 		if (!realm) {
 			this.logInfo("getPassword: No realm specified. Trying to get it from the URL.");
 			var ioService = Cc["@mozilla.org/network/io-service;1"].getService(Ci.nsIIOService);
@@ -129,7 +127,7 @@
 	if we have password from cache or manager, and we have a password in the channel. We are going to match them.
 	Because when they are equal then the cached and stored password were wrong. Otherwise we did not get here.
 
-	When no password at al always ask. */
+	When no password at all always ask. */
 
 		var password;
 		if (this.passwordCache[username+"|"+aURL+"|"+realm]) {
@@ -166,17 +164,18 @@
 			this.logInfo("getPassword: password(2)=********");
 		}
 
-		if ((password) && (aChannel) && (aChannel.URI.password) && (decodeURIComponent(aChannel.URI.password) != "")) {
+		if ((password) && (aChannel) && (aChannel.URI.password)
+			&& (decodeURIComponent(aChannel.URI.password) != "")) {
 			this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. Going to see if they are the same.");
-			if ((password == decodeURIComponent(aChannel.URI.password)) && (!useCached)) {
+			if ((password === decodeURIComponent(aChannel.URI.password)) && (!useCached)) {
 				this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. And they are the same. Going to ask user to provide a new password.");
-				if ((this.details[aURL]) && (this.details[aURL].ntlmCount == 1)) {
+				if ((this.details[aURL]) && (this.details[aURL].ntlmCount === 1)) {
 					this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. And they are the same. But it is a first pass on an NTLM authentication. Using stored password and going to see if it can be used.");
 				}
 				else { 
 					this.logInfo("getPassword: There was a password in cache or passwordManager and one on the channel. And they are the same. Going to ask user to provide a new password.");
 					var channel = aChannel.QueryInterface(Ci.nsIHttpChannel); 
-					 if( channel.responseStatus == 401 ){
+					 if( channel.responseStatus === 401 ){
 						 password=null;
 						 this.logInfo("getPassword: Login Failed, Going to ask user to provide a new password.");
 					 } 
@@ -261,17 +260,23 @@
 	asyncPromptAuthNotifyCallback: function _asyncPromptAuthNotifyCallback(aURL)
 	{
 		if (!this.details[aURL]) {
-			this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have this URL '"+aURL+"' in queue");
+			this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have this URL '"
+				+ aURL + "' in queue");
 			return;
 		}
 
 		if (this.details[aURL].showing) {
-			this.logInfo("asyncPromptAuthNotifyCallback: Allready showing a prompt or trying to get the password for URL '"+aURL+"'. Not going to try again until the active one has finished.");
+			this.logInfo("asyncPromptAuthNotifyCallback: Already showing a prompt or trying to get the password for URL '"
+				+ aURL + "'. Not going to try again until the active one has finished.");
 			return;
 		}
+		else {
+			this.details[aURL].showing = true;
+		}
 
-		if (this.details[aURL].queue.length == 0) {
-			this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have a request in queue for URL '"+aURL+"'.");
+		if (this.details[aURL].queue.length === 0) {
+			this.logInfo("asyncPromptAuthNotifyCallback: This is strange, We do not have a request in queue for URL '"
+				+ aURL +"'.");
 			return;
 		}
 
@@ -279,7 +284,9 @@
 
 			// We grab the first one from the queue.
 			var request = this.details[aURL].queue.shift();
-			this.logInfo("asyncPromptAuthNotifyCallback: Removed request from queue["+aURL+"]. There are now '"+this.details[aURL].queue.length+"' requests in queue left.");
+			this.logInfo("asyncPromptAuthNotifyCallback: Removed request from queue["
+				+ aURL + "]. There are now '"
+				+ this.details[aURL].queue.length + "' requests in queue left.");
 			var aChannel = request.channel;
 			var aCallback = request.callback;
 			var aContext = request.context;
@@ -288,7 +295,9 @@
 			var canUseBasicAuth = false;
 
 			if (this.details[aURL].previousFailedCount > 4) { // Maybe make this a user preference
-				this.logInfo("asyncPromptAuthNotifyCallback: We have more than '"+this.details[aURL].previousFailedCount+"' previous failed for '"+aURL+"'.");
+				this.logInfo("asyncPromptAuthNotifyCallback: We have more than '"
+					+ this.details[aURL].previousFailedCount + "' previous failed for '"
+					+ aURL +"'.");
 				aCallback.onAuthCancelled(aContext, false);
 				return;
 			}
@@ -309,7 +318,7 @@
 					username = this.globalFunctions.trim(decodeURIComponent(aChannel.URI.username));
 				}
 
-				if (username == "") {
+				if (username === "") {
 					// We do not have a username. We need to prompt for one.
 					// This should always be filled in. So for now we error.
 					this.logInfo("asyncPromptAuthNotifyCallback: username is empty. This is not allowed.");
@@ -319,25 +328,25 @@
 				this.logInfo("asyncPromptAuthNotifyCallback: username="+username);
 
 				if (!error) {
-					// Trying to get realm from response header. This is used when basic authentication is available.
+					// Trying to get realm from response header.
+					// This is used when basic authentication is available.
 					var realm = "exchange.server";
 					try {
 						var acceptedAuthentications = aChannel.getResponseHeader("WWW-Authenticate");
 						acceptedAuthentications = acceptedAuthentications.split("\n");
-						for each (var index in acceptedAuthentications) {
-							this.logInfo("asyncPromptAuthNotifyCallback: WWW-Authenticate:"+index);
-							if (index.indexOf("realm=") > -1) {
-								realm = index.substr(index.indexOf("realm=")+6);
-								while (realm.indexOf('"') > -1) {
-									realm = realm.replace('"', "");
-								}
-								this.logInfo("asyncPromptAuthNotifyCallback: Found a realm going to use it. realm="+realm);
+
+						for (let acceptAuth of acceptedAuthentications) {
+							this.logInfo("asyncPromptAuthNotifyCallback: WWW-Authenticate:" + acceptAuth);
+							if (acceptAuth.indexOf("realm=") > -1) {
+								realm = acceptAuth.substr(index.indexOf("realm=") + 6);
+								realm = realm.replace(/"/g, "");
+								this.logInfo("asyncPromptAuthNotifyCallback: Found a realm going to use it. realm=" + realm);
 								canUseBasicAuth = true;
 							}
 						}
 					}
 					catch(err) {
-							this.logInfo("asyncPromptAuthNotifyCallback: NO WWW-Authenticate in response header!?");
+							this.logInfo("asyncPromptAuthNotifyCallback: WWW-Authenticate HTTP response header not found !");
 					}
 
 					// try to get password.
@@ -350,7 +359,7 @@
 						error = true;
 					}
 
-					if ((!password) || (password == null)) {
+					if ((!password)) {
 						error = true;
 					}
 					else {
@@ -359,8 +368,8 @@
 				}
 			}
 
+			// Return credentials we have obtained
 			if (!error) {
-				// Return credentials we have obtained
 				if (!(authInfo.flags & Ci.nsIAuthInformation.ONLY_PASSWORD)) {
 					this.logInfo("asyncPromptAuthNotifyCallback: authInfo wants username and password and possibly domainname.");
 					if (authInfo.flags & Ci.nsIAuthInformation.NEED_DOMAIN) {
@@ -379,7 +388,7 @@
 						else {
 								this.logInfo("asyncPromptAuthNotifyCallback: We do not have a domainname part in the username. Specifying empty one.");
 								authInfo.username = username;
-						}						
+						}
 					}
 					else {
 						authInfo.username = username;
@@ -416,9 +425,7 @@
 				}
 			}
 		}
-
-		//this.details[aURL].showing = false;
-
+		this.details[aURL].showing = false;
 	},
 
 	asyncPromptAuthCancelCallback: function _asyncPromptAuthCallBack(aReason, aURL, aUUID)
@@ -564,11 +571,11 @@
 			try {
 				var acceptedAuthentications = aChannel.getResponseHeader("WWW-Authenticate");
 				acceptedAuthentications = acceptedAuthentications.split("\n");
-				for each (var index in acceptedAuthentications) {
-					this.logInfo("promptAuth: WWW-Authenticate:"+index);
-					if (index.indexOf("realm=") > -1) {
-						realm = index.substr(index.indexOf("realm=")+6);
-						this.logInfo("promptAuth: Found a realm going to use it. realm="+realm);
+				for (let authenticateHeader of acceptedAuthentications) {
+					this.logInfo("promptAuth: WWW-Authenticate:" + authenticateHeader);
+					if (authenticateHeader.indexOf("realm=") > -1) {
+						realm = index.substr(authenticateHeader.indexOf("realm=")+6);
+						this.logInfo("promptAuth: Found a realm going to use it. realm=" + realm);
 					}
 				}
 			}
@@ -625,7 +632,7 @@
 						.getService(Ci.nsILoginManager);
 
 			var logins = loginManager.findLogins({}, aURL, null, aRealm);
-			for each (var loginInfo in logins) {
+			for (let loginInfo of logins) {
 				if (loginInfo.username == aUsername) {
 					this.logInfo("passwordManagerGet found password for: username="+aUsername+", aURL="+aURL+", aRealm="+aRealm);
 					return { result: true, password: loginInfo.password};
@@ -654,12 +661,12 @@
 
 			if (logins.length > 0) {
 				var modified = false;
-				for each (let loginInfo in logins) {
-					if (loginInfo.username == aUsername) {
+				for (let loginInfo of logins) {
+					if (loginInfo.username === aUsername) {
 						this.logInfo("Login credentials updated:username="+aUsername+", aURL="+aURL+", aRealm="+aRealm);
 						loginManager.removeLogin(loginInfo);
 						modified = true;
-				    		break;
+				    break;
 					}
 				}
 				if (!modified) {
@@ -699,7 +706,7 @@
 
 			if (logins.length > 0) {
 				var modified = false;
-				for each (let loginInfo in logins) {
+				for (let loginInfo of logins) {
 					if (loginInfo.username == aUsername) {
 						this.logInfo("Login credentials updated:username="+aUsername+", aURL="+aURL+", aRealm="+aRealm);
 						loginManager.modifyLogin(loginInfo, newLoginInfo);
diff -Nru calendar-exchange-provider-3.9.0/interfaces/exchangeCalendar/mivExchangeCalendar.js calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeCalendar/mivExchangeCalendar.js
--- calendar-exchange-provider-3.9.0/interfaces/exchangeCalendar/mivExchangeCalendar.js	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/interfaces/exchangeCalendar/mivExchangeCalendar.js	2017-07-03 22:10:10.000000000 +0200
@@ -5570,8 +5570,10 @@
 		var proposeEnd   = this.tryToSetDateValue(input.proposeEnd,""); 
 	 	var proposeNewTime = false;
 		
-		input.proposeStart = cal.toRFC3339(proposeStart.getInTimezone(this.globalFunctions.ecUTC()));
-		input.proposeEnd   = cal.toRFC3339(proposeEnd.getInTimezone(  this.globalFunctions.ecUTC())); 
+		if (proposeStart) 
+                        input.proposeStart = cal.toRFC3339(proposeStart.getInTimezone(this.globalFunctions.ecUTC()));
+		if (proposeEnd)
+                        input.proposeEnd   = cal.toRFC3339(proposeEnd.getInTimezone(  this.globalFunctions.ecUTC())); 
 		
 		if( input.proposeStart && input.proposeEnd ){
 			proposeNewTime = true;
diff -Nru calendar-exchange-provider-3.9.0/interfaces/global/mivFunctions.js calendar-exchange-provider-4.0.0~beta4/interfaces/global/mivFunctions.js
--- calendar-exchange-provider-3.9.0/interfaces/global/mivFunctions.js	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/interfaces/global/mivFunctions.js	2017-07-03 22:10:10.000000000 +0200
@@ -35,7 +35,11 @@
 
 function mivFunctions()
 {
-	//dump("\n ++ mivFunctions.init\n");
+	// Mozilla helpers
+	this.domParser = Cc["@mozilla.org/xmlextras/domparser;1"]
+		.getService(Ci.nsIDOMParser);
+	this.xmlSerializer = Cc["@mozilla.org/xmlextras/xmlserializer;1"]
+		.createInstance(Ci.nsIDOMSerializer);
 }
 
 mivFunctions.prototype = {
@@ -875,16 +879,16 @@
 
 	fromText2HTML: function _fromText2HTML(aString)
 	{
-		var html = convertSpecialCharatersToXML(aString);
-		if (html) {
-			html = html.replace(/\n/g, '<br>');
-		}
-		else {
-			html = "";
+		let parsedHtml = null;
+
+		if (!aString) {
+			aString = "";
 		}
-		return '<HTML><HEAD><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></HEAD><BODY>'+html+'</BODY></HTML>';
-	},
 
+		parsedHtml = this.domParser.parseFromString(aString, 'text/html');
+
+		return this.xmlSerializer.serializeToString(parsedHtml);
+	},
 
 }
 
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/calendar-event-dialog.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/calendar-event-dialog.dtd	1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Besitzer:">
-<!ENTITY exchWebService.totalWork.label "Gesamtaufwand:">
-<!ENTITY exchWebService.actualWork.label "Ist-Aufwand:">
-<!ENTITY exchWebService.mileage.label "Reisekilometer:">
-<!ENTITY exchWebService.billingInformation.label "Abrechnungsinfo:">
-<!ENTITY exchWebService.companies.label "Firma:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/de/lightning-item-iframe.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/de/lightning-item-iframe.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Besitzer:">
+<!ENTITY exchWebService.totalWork.label "Gesamtaufwand:">
+<!ENTITY exchWebService.actualWork.label "Ist-Aufwand:">
+<!ENTITY exchWebService.mileage.label "Reisekilometer:">
+<!ENTITY exchWebService.billingInformation.label "Abrechnungsinfo:">
+<!ENTITY exchWebService.companies.label "Firma:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/calendar-event-dialog.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/calendar-event-dialog.dtd	1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Owner:">
-<!ENTITY exchWebService.totalWork.label "Total work:">
-<!ENTITY exchWebService.actualWork.label "Actual work:">
-<!ENTITY exchWebService.mileage.label "Mileage:">
-<!ENTITY exchWebService.billingInformation.label "Billing information:">
-<!ENTITY exchWebService.companies.label "Company:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/en-US/lightning-item-iframe.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/en-US/lightning-item-iframe.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Owner:">
+<!ENTITY exchWebService.totalWork.label "Total work:">
+<!ENTITY exchWebService.actualWork.label "Actual work:">
+<!ENTITY exchWebService.mileage.label "Mileage:">
+<!ENTITY exchWebService.billingInformation.label "Billing information:">
+<!ENTITY exchWebService.companies.label "Company:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/attachments-view.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/attachments-view.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/attachments-view.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/attachments-view.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -1,2 +1,2 @@
-<!ENTITY exchWebServie.add.attachment.button.label "Attachements">
+<!ENTITY exchWebServie.add.attachment.button.label "Pièces jointes">
 
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/calendar-event-dialog.dtd	1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Responsable:">
-<!ENTITY exchWebService.totalWork.label "Temps total:">
-<!ENTITY exchWebService.actualWork.label "Temps réalisé:">
-<!ENTITY exchWebService.mileage.label "Durée:">
-<!ENTITY exchWebService.billingInformation.label "Information de facturation:">
-<!ENTITY exchWebService.companies.label "Compagnie:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/exchangeSettingsOverlay.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -50,7 +50,7 @@
 <!ENTITY exchWebServices.UserAvailability.label "Seul le status de disponibilité de l'utilsateur du calendrier de cette BAL sera visible.">
 
 
-<!ENTITY exchWebServices.exchtype.label "Exchange Type">
-<!ENTITY exchWebServices.hostexch.label "Hosted Exchange">
+<!ENTITY exchWebServices.exchtype.label "Infrastructure Exchange">
+<!ENTITY exchWebServices.hostexch.label "Infrastructure Exchange dédiée">
 <!ENTITY exchWebServices.365exch.label "Microsoft Office365">
-<!ENTITY exchWebServices.detail.label "Details">
+<!ENTITY exchWebServices.detail.label "Détails">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/fr-FR/lightning-item-iframe.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Responsable:">
+<!ENTITY exchWebService.totalWork.label "Temps total:">
+<!ENTITY exchWebService.actualWork.label "Temps réalisé:">
+<!ENTITY exchWebService.mileage.label "Durée:">
+<!ENTITY exchWebService.billingInformation.label "Information de facturation:">
+<!ENTITY exchWebService.companies.label "Compagnie:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/attachments-view.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/attachments-view.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/attachments-view.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/attachments-view.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,2 @@
+<!ENTITY exchWebServie.add.attachment.button.label "Allegati">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/browseFolder.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/browseFolder.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/browseFolder.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/browseFolder.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,12 @@
+<!ENTITY label.acceptbutton "Seleziona">
+<!ENTITY label.cancelbutton "Annulla">
+
+<!ENTITY browsefolder.title "Sfoglia cartelle">
+
+<!ENTITY treecol.label.foldername "Nome cartella">
+<!ENTITY treecol.label.folderclass "Classe cartella">
+
+
+
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-calendars-list.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,5 @@
+<!ENTITY calendar.context.exchange.convert.label "Converti a componente aggiuntivo Calendario e Attività Exchange 2007/2010">
+<!ENTITY calendar.context.exchange.properties.label "Proprietà Exchange (EWS)">
+<!ENTITY calendar.context.exchange.oof.settings.label "Opzioni Fuori sede">
+<!ENTITY calendar.context.exchange.clone.settings.label "Clona opzioni in un nuovo calendario">
+<!ENTITY calendar.context.exchange.delegate.calendar.settings.label "Delega calendario">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calendar-summary-dialog.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,3 @@
+<!ENTITY forward.invite.label "Inoltra invito">
+<!ENTITY required.attendee.label "Partecipante richiesto">
+<!ENTITY optional.attendee.label "Partecipante facoltativo">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calExchangeCalendar.properties calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calExchangeCalendar.properties
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/calExchangeCalendar.properties	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/calExchangeCalendar.properties	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,49 @@
+displayName=Provider Calendario e Attività per Exchange 2007/2010
+
+resetEventMessage=Il calendario "%1$S" è stato reimpostato.
+addTaskEventMessage=Aggiunta attività "%1$S" (%2$S).
+addCalendarEventMessage=Aggiunto appuntamento "%1$S" (%2$S).
+ewsErrorEventMessage=Errore durante la comunicazione con il server EWS per "%1$S". Errore: %2$S, codice: %3$S.
+updateCalendarEventMessage=L'appuntamento "%1$S" è stato modificato (%2$S).
+updateTaskEventMessage=L'attività "%1$S" è stata modificata (%2$S).
+deleteCalendarEventMessage=L'appuntamento "%1$S" è stato rimosso (%2$S).
+deleteTaskEventMessage=L'attività "%1$S" è stata rimossa (%2$S).
+syncFolderEventMessage="%4$S": ricevuti aggiornamenti dal server EWS (nuovi: %1$S, modificati: %2$S, eliminati: %3$S).
+syncInboxRequests="%4$S": ricevuti aggiornamenti inviti a riunione dal server EWS nella Posta in arrivo (nuovi: %1$S, modificati: %2$S, eliminati: %3$S).
+syncInboxCancelations="%4$S": ricevuti annullamenti inviti a riunione dal server EWS nella Posta in arrivo (nuovi: %1$S, modificati: %2$S, eliminati: %3$S).
+syncInboxResponses="%4$S": ricevuti aggiornamenti risposte riunione dal server EWS nella Posta in arrivo (nuovi: %1$S, modificati: %2$S, eliminati: %3$S).
+ewsMeetingResponsEventMessage=Risposta "%2$S" ricevuta per la richiesta riunione "%1$S" (%3$S). Messaggio:
+
+ecErrorServerCheck=Errore durante il controllo sul server: %1$S (%2$S)
+ecErrorAutodiscovery=Errore durante la ricerca automatica: %1$S (%2$S)
+ecErrorAutodiscoveryURLInvalid=Non è stato possibile determinare le impostazioni tramite la ricerca automatica utilizzando la parte nome di dominio della casella di posta (%1$S).\nSolitamente ciò significa che non esiste un server ricerca automatica definito con la parte di dominio come nome host.
+ecErrorServerCheckURLInvalid=Il server "%1$S" non esiste.
+ecErrorServerAndMailboxCheck=Errore durante il controllo del server e della casella di posta: %1$S (codice: %2$S)
+
+updateUserPrefs1=Opzioni utente aggiornate per la nuova versione (dalla 0.7.26)
+
+autoRemoveConfirmedInvitationOnCancellation=L'appuntamento confermato "%1$S" è stato annullato ed è stato rimosso automaticamente come specificato dalle opzioni utente (%2$S).
+
+sendAutoRespondMeetingRequestMessage=È stata automaticamente inviata una risposta alla richiesta di riunione "%1$S" come specificato dalle opzioni utente (%2$S).
+
+ecLoadingOofSettings=(Recupero dati in corso)
+ecLoadedOofSettings=(Dati recuperati)
+ecErrorLoadingOofSettings=Errore durante il caricamento delle opzioni Fuori sede. Codice: %2$S, messaggio: %1$S.
+ecSavingOofSettings=(Salvataggio dati in corso)
+ecSavedOofSettings=(Dati salvati)
+ecErrorSavingOofSettings=Errore durante il salvataggio delle opzioni Fuori sede. Codice: %2$S, messaggio: %1$S.
+
+
+exchWebService.PidLidTaskHistory.duedate.changed=La data di scadenza è stata modificata
+exchWebService.PidLidTaskHistory.some.property.changed=È stata modificata una proprietà
+exchWebService.PidLidTaskHistory.accepted=Attività accettata da %1$S
+exchWebService.PidLidTaskHistory.rejected=Attività rifiutata da %1$S
+exchWebService.PidLidTaskHistory.assigned=Attività assegnata a %1$S
+exchWebService.PidLidTaskHistory.no.changes=Nessuna modifica
+
+ecErrorServerAndMailboxCheckFolderNotFound=Non si dispone delle autorizzazioni di lettura sulla casella di posta selezionata o la casella di posta non è corretta.\n\nDopo che la casella di posta sarà stata corretta si potrebbe disporre delle autorizzazioni di visualizzazione dello stato di disponibilità utente (occupato/provvisorio/fuori sede) per il suo calendario.\n\n(%2$S: %1$S)
+
+tooltipCalendarDisconnected=Il calendario %1$S non è connesso al server Exchange\n(Motivo: %2$S).
+tooltipCalendarDisconnectedReadOnly=Il calendario %1$S non è connesso al server Exchange ed è in sola lettura\n(Motivo: %2$S).
+tooltipCalendarConnected=Il calendario %1$S è connesso al server Exchange.
+tooltipCalendarConnectedReadOnly=Il calendario %1$S è connesso al server Exchange ed è in sola lettura.
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-calendar-dialog.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,25 @@
+
+<!ENTITY  label.delegateCalendar.cancelbutton "Annulla">
+<!ENTITY  label.delegateCalendar.userEmail "Indirizzo di posta elettronica">
+<!ENTITY  label.delegateCalendar.deliveryMeetingRerquestControl "Recapita richieste riunione">
+
+<!ENTITY  menuitem.delegateCalendar.deliverMeetingRequestslist.delegateOnly "Solo ai delegati">
+<!ENTITY  menuitem.delegateCalendar.deliverMeetingRequestslist.delegateAndMe "Ai delegati e a me">
+<!ENTITY  menuitem.delegateCalendar.deliverMeetingRequestslist.delegateAndInfo "Ai delegati e inviami le notifiche">
+
+<!ENTITY  label.delegateCalendar.permission "Autorizzazioni">
+<!ENTITY  menuitem.delegateCalendar.permission.author "Autore">
+<!ENTITY  menuitem.delegateCalendar.permission.editor "Editor">
+<!ENTITY  menuitem.delegateCalendar.permission.reviewer "Revisore">
+<!ENTITY  menuitem.delegateCalendar.permission.none "Nessuno">
+
+<!ENTITY  label.delegateCalendar.permission.receiveInvitationCopy "Ricevi copie dei messaggi riunione" >
+<!ENTITY  label.delegateCalendar.permission.viewPrivateItems "Visualizza elementi privati" >
+
+
+<!ENTITY  delegateCalendar.permission.description.author "Leggi e crea elementi nella cartella Calendario." >
+<!ENTITY  delegateCalendar.permission.description.editor "Leggi, crea e modifica elementi nella cartella Calendario." >
+<!ENTITY  delegateCalendar.permission.description.reviewer "Leggi elementi nella cartella Calendario." >
+<!ENTITY  delegateCalendar.permission.description.none "Nessuna autorizzazione di accesso alla cartella Calendario." >
+
+<!ENTITY  delegateCalendar.permission.details.label "Dettagli autorizzazioni: " >
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-folder.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-folder.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/delegate-folder.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/delegate-folder.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,45 @@
+
+<!ENTITY  label.delegatefolder.cancelbutton "Annulla">
+<!ENTITY  label.delegatefolder.userEmail "Indirizzo di posta elettronica">
+
+<!ENTITY  label.delegatefolder.permissionLevel "Livello autorizzazioni">
+<!ENTITY  label.delegatefolder.userboxcolumn1 "Utente">
+<!ENTITY  label.delegatefolder.userboxcolumn2 "Permessi">
+
+<!ENTITY  menuitem.delegatefolder.permission.author "Autore">
+<!ENTITY  menuitem.delegatefolder.permission.editor "Editor">
+<!ENTITY  menuitem.delegatefolder.permission.reviewer "Revisore">
+<!ENTITY  menuitem.delegatefolder.permission.none "Nessuno">
+<!ENTITY  menuitem.delegatefolder.permission.owner "Proprietario" >
+<!ENTITY  menuitem.delegatefolder.permission.publishingEditor "Supervisore pubblicazione" >
+<!ENTITY  menuitem.delegatefolder.permission.publishingAuthor "Autore pubblicazione" >
+<!ENTITY  menuitem.delegatefolder.permission.noneditingAuthor "Autore nonediting" >
+<!ENTITY  menuitem.delegatefolder.permission.contributor "Collaboratore" >
+<!ENTITY  menuitem.delegatefolder.permission.custom "Personalizzato" >
+
+<!ENTITY  delegatefolder.permission.description.author "Leggi e crea elementi nella cartella." >
+<!ENTITY  delegatefolder.permission.description.editor "Leggi, crea e modifica elementi nella cartella." >
+<!ENTITY  delegatefolder.permission.description.reviewer "Leggi elementi nella cartella." >
+<!ENTITY  delegatefolder.permission.description.none "Nessuna autorizzazione di accesso alla cartella." >
+
+<!ENTITY  delegatefolder.permission.details.caption "Autorizzazioni ">
+
+<!ENTITY  delegatefolder.tab.msg.label  "Calendario e Attività non trovati per questo account di posta.">
+<!ENTITY  delegatefolder.tab.name  "Condivisione cartelle Exchange">
+
+<!ENTITY  delegatefolder.permissions.none  "Nessuno">
+<!ENTITY  delegatefolder.permissions.own  "Propri elementi">
+<!ENTITY  delegatefolder.permissions.all  "Tutti gli elementi">
+<!ENTITY  delegatefolder.permissions.full  "Dettagli completi">
+
+<!ENTITY  delegatefolder.permissions.cancreateitems  "Creazione elementi">
+<!ENTITY  delegatefolder.permissions.cancreatesubfolders  "Creazione sottocartelle">
+<!ENTITY  delegatefolder.permissions.isfolderowner  "Proprietario cartella">
+<!ENTITY  delegatefolder.permissions.isfoldervisible  "Cartella visibile">
+<!ENTITY  delegatefolder.permissions.isfoldercontact  "Cartella contatti">
+<!ENTITY  delegatefolder.permissions.edititems  "Modifica elementi">
+<!ENTITY  delegatefolder.permissions.deleteitems  "Eliminazione elementi">
+<!ENTITY  delegatefolder.permissions.readitems  "Lettura elementi">
+
+<!ENTITY  delegatefolder.permissions.true  "Vero">
+<!ENTITY  delegatefolder.permissions.false  "Falso">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/ecCalendarCreation.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,5 @@
+<!ENTITY exchange1.description "Opzioni Exchange/Windows Active Directory">
+<!ENTITY exchange.cache.label "Utilizza cache offline">
+
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeCloneSettings.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,6 @@
+<!ENTITY label.acceptbutton "Salva">
+<!ENTITY label.cancelbutton "Annulla">
+
+<!ENTITY label.ecExchangeSettings.title "Nuova descrizione:">
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeReminderDialog.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,4 @@
+<!ENTITY exchWebService.reminder.relation.origin.label "prima dell'inizio dell'evento">
+
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettings.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettings.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettings.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettings.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,54 @@
+<!ENTITY label.acceptbutton "Salva e reimposta">
+<!ENTITY label.cancelbutton "Annulla">
+<!ENTITY ecsettings.title "Opzioni Calendario e Posta EWS">
+<!ENTITY ecsettings.tab.adsettings "Exchange/AD Windows">
+<!ENTITY ecsettings.tab.meetingrequestsettings "Richieste riunione">
+<!ENTITY ecsettings.tab.calendarfolderproperties "Proprietà cartella">
+
+<!ENTITY label.ecExchangeSettings.title "Opzioni per il calendario:">
+
+<!ENTITY label.poll.inbox "Esegui il polling della Posta in arrivo per gestire richieste, modifiche e annullamenti.">
+<!ENTITY label.poll.inbox.interval "Frequenza di polling Posta in arrivo (in secondi):">
+<!ENTITY label.poll.calendar.interval "Frequenza di polling Calendario (in secondi):">
+
+<!ENTITY label.nomeetingrequestsettings "Impossibile impostare la richiesta riunione perché non si è selezionato il calendario principale per la casella di posta">
+
+<!ENTITY label.autorespond.meetingrequest "Rispondi automaticamente a un nuovo invito con ">
+
+<!ENTITY menuitem.label.ec-autorespond-answer.tentative "Forse parteciperò">
+<!ENTITY menuitem.label.ec-autorespond-answer.accepted "Parteciperò">
+<!ENTITY menuitem.label.ec-autorespond-answer.declined "Non parteciperò">
+
+<!ENTITY label.autoremove.invitation_cancellation1 "Rimuovi automaticamente l'invito e il messaggio di annullamento abbinato se non si è ancora risposto all'invito.">
+<!ENTITY label.autoremove.invitation_cancellation2 "Rimuovi automaticamente un invito confermato quando si riceve un messaggio di annullamento.">
+
+<!ENTITY label.autoremove.invitation_response1 "Rimuovi automaticamente una risposta di terzi a un invito di cui non si è l'organizzatore.">
+
+<!ENTITY label.doautorespond.meetingrequest.message "Invia il seguente messaggio con le risposte anziché richiedere un messaggio.">
+<!ENTITY label.autorespond.meetingrequest.message "Messaggio:">
+
+<!ENTITY treecol.label.userid "Nome utente">
+<!ENTITY treecol.label.email "Indirizzo di posta elettronica">
+
+
+<!ENTITY ecsettings.tab.offlineCachingproperties "Cache non in linea">
+
+<!ENTITY label.offlineCacheproperties.cachingStartDate "Data di inizio cache:">
+<!ENTITY label.offlineCacheproperties.cachingEndDate "Data di fine cache:">
+<!ENTITY label.offlineCacheproperties.totalEvents "Numero totale di eventi in cache:">
+<!ENTITY label.offlineCacheproperties.totalTasks "Numero totale di attività in cache:">
+
+<!ENTITY label.offlineCacheproperties.monthsBeforeStartDate "Numero di mesi prima di oggi per cui mantenere gli elementi in cache:">
+<!ENTITY label.offlineCacheproperties.monthsBeforeEndDate "Numero di mesi dopo di oggi per cui mantenere gli elementi in cache:">
+
+<!ENTITY button.offlineCacheproperties.clearCache "Elimina dati nella cache non in linea">
+<!ENTITY ecsettings.tab.autoprocessingproperties "Elaborazione automatica">
+<!ENTITY ecsettings.tab.mailitemsProperties "Opzioni EWS (Posta)">
+
+<!ENTITY label.syncmailitems.interval "Ritarda sincronizzazione elementi di posta (tag, ecc.)">
+<!ENTITY label.autoprocessingproperties.deletecancelleditems "Rimuovi automaticamente eventi annullati">
+<!ENTITY label.autoprocessingproperties.markeventtentative "Contrassegna automaticamente gli eventi come provvisori e invia la risposta all'organizzatore">
+<!ENTITY label.syncmailitems.active "Mantieni attiva la sincronizzazione degli elementi di posta (tag, ecc.)">
+
+<!ENTITY label.syncfollowup.deactivtate "Disabilita Contrassegna attività per il completamento">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/exchangeSettingsOverlay.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,56 @@
+<!ENTITY ecautodiscover "Utilizza funzionalità ricerca automatica di Exchange.">
+<!ENTITY ecfolderbase.label "Cartella base:">
+<!ENTITY ecfolderpath.label "Percorso entro la cartella base:">
+<!ENTITY ecfolderidofshare.label "ID cartella condivisa:">
+<!ENTITY exchWebServices.SharedFolderID.label "Nome visualizzato cartella condivisa:">
+
+<!ENTITY menuitem.label.ecfolderbase.calendar "Cartella Calendario">
+<!ENTITY menuitem.label.ecfolderbase.publicfoldersroot "Cartelle pubbliche">
+<!ENTITY menuitem.label.ecfolderbase.inbox "Cartella Posta in arrivo">
+<!ENTITY menuitem.label.ecfolderbase.voicemail "Cartella Segreteria telefonica">
+<!ENTITY menuitem.label.ecfolderbase.msgfolderroot "Radice cartella messaggi">
+<!ENTITY menuitem.label.ecfolderbase.root "Radice casella di posta">
+<!ENTITY menuitem.label.ecfolderbase.tasks "Cartella Attività">
+
+<!ENTITY menuitem.label.ecfolderbase.contacts "Cartella Contatti">
+<!ENTITY menuitem.label.ecfolderbase.deleteditems "Cartella Elementi eliminati">
+<!ENTITY menuitem.label.ecfolderbase.drafts "Cartella Bozze">
+<!ENTITY menuitem.label.ecfolderbase.journal "Cartella Diario">
+<!ENTITY menuitem.label.ecfolderbase.notes "Cartella Note">
+<!ENTITY menuitem.label.ecfolderbase.outbox "Cartella Posta in uscita">
+<!ENTITY menuitem.label.ecfolderbase.sentitems "Cartella Posta inviata">
+<!ENTITY menuitem.label.ecfolderbase.junkemail "Cartella Posta indesiderata">
+<!ENTITY menuitem.label.ecfolderbase.searchfolders "Cartella Ricerca cartelle">
+<!ENTITY menuitem.label.ecfolderbase.version2010 "-- Le opzioni sottostanti sono valide solo per Exchange 2010 --">
+<!ENTITY menuitem.label.ecfolderbase.recoverableitemsroot "Cartella radice Elementi ripristinabili">
+<!ENTITY menuitem.label.ecfolderbase.recoverableitemsdeletions "Cartella Eliminazioni in Elementi ripristinabili">
+<!ENTITY menuitem.label.ecfolderbase.recoverableitemsversion "Cartella Versioni in Elementi ripristinabili">
+<!ENTITY menuitem.label.ecfolderbase.recoverableitemspurges "Cartella Elimina in Elementi ripristinabili">
+<!ENTITY menuitem.label.ecfolderbase.archiveroot "Cartella radice Archivio">
+<!ENTITY menuitem.label.ecfolderbase.archivemsgfolderroot "Cartella radice messaggi Archivio">
+<!ENTITY menuitem.label.ecfolderbase.archivedeleteditems "Cartella Elementi eliminati Archivio">
+<!ENTITY menuitem.label.ecfolderbase.archiverecoverableitemsroot "Cartella radice Elementi ripristinabili - Archivio">
+<!ENTITY menuitem.label.ecfolderbase.Archiverecoverableitemsdeletions "Cartella Eliminazioni in Elementi ripristinabili - Archivio">
+<!ENTITY menuitem.label.ecfolderbase.Archiverecoverableitemsversions "Cartella Versioni in Elementi ripristinabili - Archivio">
+<!ENTITY menuitem.label.ecfolderbase.Archiverecoverableitemspurges "Cartella Elimina in Elementi ripristinabili - Archivio">
+
+<!ENTITY button.label.autodiscovercheck "Esegui ricerca automatica">
+<!ENTITY button.label.serverandmailboxcheck "Controlla server e casella di posta">
+<!ENTITY button.label.servercheck "Controlla server e account">
+
+<!ENTITY ecmailbox.label "Indirizzo di posta elettronica principale:">
+<!ENTITY ecmailbox.tooltip "Non specificando una casella di posta si sarà in grado di accedere solamente alle cartelle pubbliche.">
+<!ENTITY ecwindowsuser.label "Nome utente:">
+<!ENTITY ecwindowsdomain.label "Nome dominio:">
+<!ENTITY ecwindowspassword.label "Password:">
+
+<!ENTITY button.label.folderpathcheck "Controlla">
+<!ENTITY button.label.folderbrowse "Sfoglia">
+
+<!ENTITY exchWebServices.UserAvailability.label "Per il calendario della casella di posta sarà visibile unicamente lo stato di disponibilità utente.">
+
+<!ENTITY exchWebServices.exchtype.label "Tipo Exchange">
+<!ENTITY exchWebServices.hostexch.label "Exchange hosted">
+<!ENTITY exchWebServices.365exch.label "Microsoft Office 365">
+<!ENTITY exchWebServices.detail.label "Dettagli">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/extra-priority.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/extra-priority.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/extra-priority.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/extra-priority.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,18 @@
+<!ENTITY prefwindow.title "Opzioni aggiuntive">
+<!ENTITY general.label  "Generale">
+<!ENTITY about.label "Informazioni su">
+
+<!ENTITY about.description.label "Funzionalità avanzate per Thunderbird e SeaMonkey">
+<!ENTITY iconify.label "Visualizza solo icone priorità">
+<!ENTITY shadeHigh.label "Aggiungi un colore di sfondo ai messaggi con priorità alta">
+<!ENTITY shadeLow.label "Aggiungi un colore di sfondo ai messaggi con priorità bassa">
+<!ENTITY tagImportant.label "Contrassegna automaticamente i messaggi con priorità alta come Importante">
+
+<!ENTITY highestColor.label "Massima">
+
+<!ENTITY highColor.label "Alta">
+<!ENTITY lowColor.label "Bassa">
+<!ENTITY lowestColor.label "Minima">
+
+<!ENTITY prioritycolor  "Colore personalizzato">
+<!ENTITY pref.color "Opzioni colore:">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/invitationResponse.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/invitationResponse.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/invitationResponse.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/invitationResponse.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,20 @@
+<!ENTITY label.acceptbutton "Conferma modifica">
+<!ENTITY label.cancelbutton "Annulla modifica">
+
+<!ENTITY description.invitationResponse "Conferma la modifica della risposta per la riunione.">
+
+<!ENTITY label.calendarName "Calendario:">
+<!ENTITY label.itemTitle "Oggetto:">
+<!ENTITY label.itemStart "Ora di inizio:">
+<!ENTITY label.itemResponse "Risposta:">
+<!ENTITY label.meetingOrganiser "Organizzatore:">
+
+<!ENTITY label.messageReponseBody "Messaggio risposta:">
+
+<!ENTITY menuitem.label.ec-autorespond-answer.tentative "Forse parteciperò">
+<!ENTITY menuitem.label.ec-autorespond-answer.accepted "Parteciperò">
+<!ENTITY menuitem.label.ec-autorespond-answer.declined "Non parteciperò">
+
+<!ENTITY label.proposenewtime.title "Proponi nuovo orario (Exchange 2013 o successivo)">
+<!ENTITY label.proposenewtime.start "Ora di inizio">
+<!ENTITY label.proposenewtime.end "Ora di fine">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/inviteStyle.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/inviteStyle.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/inviteStyle.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/inviteStyle.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,2 @@
+<!ENTITY label.inviteCol "Invito a calendario">
+<!ENTITY tooltip.inviteCol "Ordina per invito">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/lightning-item-iframe.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Proprietario:">
+<!ENTITY exchWebService.totalWork.label "Lavoro totale:">
+<!ENTITY exchWebService.actualWork.label "Lavoro effettivo:">
+<!ENTITY exchWebService.mileage.label "Chilometraggio:">
+<!ENTITY exchWebService.billingInformation.label "Informazioni di fatturazione:">
+<!ENTITY exchWebService.companies.label "Azienda:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/manageEWSAccounts.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,16 @@
+<!ENTITY label.acceptbutton "Chiudi">
+
+<!ENTITY exchWebService.manageEWSAccounts.newAccount.button "Aggiungi account">
+<!ENTITY exchWebService.manageEWSAccounts.removeAccount.button "Rimuovi account">
+<!ENTITY exchWebService.manageEWSAccounts.saveAccount.button "Salva impostazioni">
+
+<!ENTITY exchWebService.manageEWSAccounts.autodiscover.label "Utilizza la funzionalità di ricerca automatica di Exchange.">
+<!ENTITY exchWebService.manageEWSAccounts.mailbox.label "Nome casella di posta:">
+<!ENTITY exchWebService.manageEWSAccounts.windowsuser.label "Nome utente:">
+<!ENTITY exchWebService.manageEWSAccounts.windowsdomain.label "Nome dominio:">
+<!ENTITY exchWebService.manageEWSAccounts.autodiscover.button "Esegui ricerca automatica">
+<!ENTITY exchWebService.manageEWSAccounts.servercheck.button "Controlla server e account">
+<!ENTITY exchWebService.manageEWSAccounts.name.label "Nome:">
+
+<!ENTITY exchWebService.manageEWSAccounts.menuitem "Account Exchange Web Services">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/messenger_task_delegation.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,6 @@
+<!ENTITY exchWebService.task.delegation.owner.name "Proprietario attività">
+<!ENTITY exchWebService.task.delegation.delegator.name "Delegato attività">
+<!ENTITY exchWebService.task.delegation.accept.button "Accetta">
+<!ENTITY exchWebService.task.delegation.decline.button "Rifiuta">
+<!ENTITY exchWebService.task.delegation.lastUpdateDate "Ultima modifica">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/oofSettings.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/oofSettings.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/oofSettings.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/oofSettings.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,26 @@
+<!ENTITY title.oofsettings "Opzioni Fuori sede">
+<!ENTITY label.acceptbutton "Salva">
+<!ENTITY label.cancelbutton "Chiudi">
+<!ENTITY label.oofsettings.title "Opzioni Fuori sede per:">
+
+<!ENTITY label.oofstatus "Stato Fuori sede:">
+
+<!ENTITY label.externalaudience "Persone esterne a cui inviare messaggi Fuori sede: ">
+<!ENTITY menuitem.label.exchWebService-oof-externalaudience.none "Nessuno">
+<!ENTITY menuitem.label.exchWebService-oof-externalaudience.known "Solo persone nel mio elenco contatti">
+<!ENTITY menuitem.label.exchWebService-oof-externalaudience.all "Tutti">
+
+<!ENTITY button.label.internal "Messaggio interno">
+<!ENTITY button.label.external "Messaggio esterno">
+<!ENTITY label.internalreply "Messaggio che sarà inviato alle persone nella propria impresa:">
+<!ENTITY label.externalreply "Messaggio che sarà inviato alle persone al di fuori della propria impresa:">
+
+<!ENTITY menuitem.label.exchWebService-oof-status.disabled "Disabilitato">
+<!ENTITY menuitem.label.exchWebService-oof-status.enabled "Abilitato">
+
+<!ENTITY checkbox.label.exchWebService-oof-scheduled "Abilitato solo nell'intervallo temporale specificato:">
+<!ENTITY label.hbox-oof-scheduled-startTime "Ora di inizio:">
+<!ENTITY label.hbox-oof-scheduled-endTime "Ora di fine:">
+
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preferences.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preferences.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preferences.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preferences.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,48 @@
+<!ENTITY exchangeWebService.paneAccounts.title "Exchange (EWS)">
+<!ENTITY exchangeWebService.paneDebug.title "Registrazione eventi">
+
+<!ENTITY exchangeWebService.preferences.tab.accounts "Account">
+<!ENTITY exchangeWebService.preferences.tab.debug "Registrazione eventi">
+<!ENTITY exchangeWebService.preference.debug.file "Percorso file di log:">
+<!ENTITY exchangeWebService.preference.network.debug.caption "Comunicazioni con il server Exchange:">
+<!ENTITY exchangeWebService.preference.debug.log.label "Registra informazioni sulla console e/o su un file">
+<!ENTITY exchangeWebService.preference.debug.file.button "Sfoglia">
+<!ENTITY exchangeWebService.preference.network.debug.label "Registra comunicazioni con il server Exchange">
+<!ENTITY exchangeWebService.preference.network.debuglevel.label1 "Livello di log">
+<!ENTITY exchangeWebService.preference.network.debuglevel.label2 "1 = informazioni di base, 2 = comunicazioni integrali">
+<!ENTITY exchangeWebService.preference.authentication.debug.label "Registra informazioni sull'avanzamento delle comunicazioni (ad es. autenticazione)">
+<!ENTITY exchangeWebService.preference.authentication.showpassword.label "Visualizza la password come testo in chiaro nel file di log.">
+
+<!ENTITY exchangeWebService.preference.contacts.debug.caption "Rubrica/Contatti:">
+<!ENTITY exchangeWebService.preference.contacts.debuglevel.label1 "Livello di log">
+<!ENTITY exchangeWebService.preference.contacts.debuglevel.label2 "1 = informazioni di base, 2 = comunicazioni integrali">
+<!ENTITY exchangeWebService.preference.contacts.debug.label "Registra informazioni relative alla Rubrica/Contatti">
+
+<!ENTITY exchangeWebService.preferences.titleWin "Opzioni Exchange (EWS)">
+
+<!ENTITY exchangeWebService.preference.core.debug.caption "Oggetto core provider:">
+<!ENTITY exchangeWebService.preference.core.debuglevel.label2 "0 = nessuna informazione, 1 = informazioni di base, 2 = comunicazioni integrali">
+
+<!ENTITY exchangeWebService.preferences.tab.cache "Caching">
+<!ENTITY exchangeWebService.preference.cache.memory.label "Cache minimale temporanea in memoria">
+<!ENTITY exchangeWebService.preference.cache.memory.startupBefore.label "Numero di giorni di cui scaricare i dati prima della data di avvio del programma:">
+<!ENTITY exchangeWebService.preference.cache.memory.startupAfter.label "Numero di giorni di cui scaricare i dati dopo la data di avvio del programma:">
+
+<!ENTITY exchangeWebService.preferences.tab.others "Altro">
+<!ENTITY exchangeWebService.preference.others.prefs.label "Opzioni comunicazioni:">
+<!ENTITY exchangeWebService.preference.others.prefs.retryCount.label "Numero massimo di tentativi per le comunicazioni con Exchange:">
+
+<!ENTITY exchangeWebService.preference.updateFunction.label "Funzionalità aggiornamento componente aggiuntivo:">
+<!ENTITY exchangeWebService.preference.checkForUpdates.label "Controlla automaticamente la disponibilità di una nuova versione del componente aggiuntivo su Internet all'avvio di Thunderbird.">
+<!ENTITY exchangeWebService.preference.warnForUpdates.label "Visualizza un avviso se una nuova versione è disponibile per consentirne un'installazione facile.">
+<!ENTITY exchangeWebService.preference.warnForPrereleaseUpdates.label "Visualizza un avviso se una nuova versione non definitiva (beta, RC, ecc.) è disponibile.">
+
+<!ENTITY exchangeWebService.preference.loadbalancer.debug.caption "Bilanciamento del carico:">
+<!ENTITY exchangeWebService.preference.loadbalancer.prefs.label "Bilanciamento del carico:">
+<!ENTITY exchangeWebService.preference.loadbalancer.prefs.maxJobs.label "Numero massimo di richieste contemporanee al server Exchange:">
+<!ENTITY exchangeWebService.preference.loadbalancer.prefs.sleepBetweenJobs.label "Tempo minimo di attesa fra richieste al server Exchange:">
+<!ENTITY exchangeWebService.preference.userAgent.label "Agente utente HTTP:">
+
+<!ENTITY exchangeWebService.preference.ntlmv1.label "Opzioni NTLM-v1:">
+<!ENTITY exchangeWebService.preference.ntlmv1.true.label "Abilita">
+<!ENTITY exchangeWebService.preference.ntlmv1.false.label "Disabilita">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preInvitationResponse.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preInvitationResponse.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/preInvitationResponse.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/preInvitationResponse.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,14 @@
+<!ENTITY dialog.exchWebService.preInvitationResponse.title "Come si desidera rispondere?">
+<!ENTITY label.acceptbutton "OK">
+<!ENTITY label.cancelbutton "Annulla">
+
+<!ENTITY label.calendarName "Calendario:">
+<!ENTITY label.itemTitle "Oggetto:">
+<!ENTITY label.itemStart "Ora di inizio:">
+<!ENTITY label.itemResponse "Risposta:">
+<!ENTITY label.meetingOrganiser "Organizzatore:">
+
+<!ENTITY radio.label.exchWebService.preInvitationResponse.edit "Modifica la risposta prima di inviarla.">
+<!ENTITY radio.label.exchWebService.preInvitationResponse.sendnow "Invia la risposta ora.">
+<!ENTITY radio.label.exchWebService.preInvitationResponse.donotsend "Non inviare una risposta.">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,15 @@
+ <!ENTITY rtews.selectaccountdesc "Selezionare l'account di posta elettronica da configurare. L'account deve essere basato su Microsoft Exchange">
+ <!ENTITY rtews.accconfigured "Account già configurato">
+ <!ENTITY rtews.dicoverdesc "È possibile scegliere di ricercare automaticamente l'URL del server Microsoft Exchange (EWS) URL o configurarlo manualmente">
+ <!ENTITY rtews.dicoverdesc2 "Per configurarlo manualmente, immettere l'URL nel campo sottostante.">
+ <!ENTITY rtews.autodiscover "Ricerca automatica">
+ <!ENTITY rtews.doautodicover "Esegui ricerca automatica">
+ <!ENTITY rtews.manual "Manuale">
+ <!ENTITY rtews.test "Fare clic qui per verificare l'URL EWS">
+ <!ENTITY rtews.msexchewsurl "URL EWS Microsoft Exchange EWS verificato. Cliccare Fine per completare la configurazione">
+ <!ENTITY rtews.selectaccount "Seleziona account">
+ <!ENTITY rtews.configure.label "Configura...">
+ <!ENTITY rtews.rtforexch "Contrassegni remoti per Microsoft Exchange">
+ <!ENTITY rtews.confirmAccDetail "Confermare i seguenti dettagli dell'account">
+ <!ENTITY rtews.username "Nome utente">
+ <!ENTITY rtews.domain "Dominio">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.properties calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.properties
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/rtews.properties	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/rtews.properties	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,2 @@
+rtews.title=EWStagger
+rtews.tagAddError=Si è verificato un errore durante la creazione del tag per la categoria
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/selectEWSUrl.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/selectEWSUrl.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/selectEWSUrl.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/selectEWSUrl.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,9 @@
+<!ENTITY label.acceptbutton "Seleziona">
+<!ENTITY label.cancelbutton "Annulla">
+
+<!ENTITY description.selectews "Selezionare dall'elenco un server EWS adatto alla posizione corrente.">
+<!ENTITY label.selectews "Elenco server EWS:">
+
+
+
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sendUpdateTo.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sendUpdateTo.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sendUpdateTo.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sendUpdateTo.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,9 @@
+<!ENTITY title.sendupdateto "A chi dev'essere inviato quest'aggiornamento?">
+<!ENTITY label.acceptbutton "Esegui">
+<!ENTITY label.cancelbutton "Annulla">
+<!ENTITY label.calendaritem.title "Invia aggiornamento per la riunione:">
+
+<!ENTITY radio.label.sendtonone "Non inviare l'aggiornamento a nessuno.">
+<!ENTITY radio.label.sendtoall "Invia l'aggiornamento a tutti gli invitati.">
+<!ENTITY radio.label.sendtochanged "Invia l'aggiornamento solo alle persone aggiunte o rimosse.">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/sharedCalendarParser.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,3 @@
+<!ENTITY exchWebService_vbox_label "Rilevato invito condivisione Exchange">
+<!ENTITY exchWebService_button_label_add_calendar "Aggiungi calendario">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/timezonePreference.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/timezonePreference.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/it-IT/timezonePreference.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/it-IT/timezonePreference.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1 @@
+<!ENTITY calendar.timezone.local.auto.label  "Modifica fuso orario automaticamente">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/calendar-event-dialog.dtd	1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Owner:">
-<!ENTITY exchWebService.totalWork.label "Total work:">
-<!ENTITY exchWebService.actualWork.label "Actual work:">
-<!ENTITY exchWebService.mileage.label "Mileage:">
-<!ENTITY exchWebService.billingInformation.label "Billing information:">
-<!ENTITY exchWebService.companies.label "Company:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ja-JP/lightning-item-iframe.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Owner:">
+<!ENTITY exchWebService.totalWork.label "Total work:">
+<!ENTITY exchWebService.actualWork.label "Actual work:">
+<!ENTITY exchWebService.mileage.label "Mileage:">
+<!ENTITY exchWebService.billingInformation.label "Billing information:">
+<!ENTITY exchWebService.companies.label "Company:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/calendar-event-dialog.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/calendar-event-dialog.dtd	1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +0,0 @@
-<!ENTITY exchWebService.owner.label "Eigenaar:">
-<!ENTITY exchWebService.totalWork.label "Werk totaal:">
-<!ENTITY exchWebService.actualWork.label "Werk echt:">
-<!ENTITY exchWebService.mileage.label "Rendement:">
-<!ENTITY exchWebService.billingInformation.label "Factuurinfo:">
-<!ENTITY exchWebService.companies.label "Bedrijf:">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/nl/lightning-item-iframe.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/nl/lightning-item-iframe.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,6 @@
+<!ENTITY exchWebService.owner.label "Eigenaar:">
+<!ENTITY exchWebService.totalWork.label "Werk totaal:">
+<!ENTITY exchWebService.actualWork.label "Werk echt:">
+<!ENTITY exchWebService.mileage.label "Rendement:">
+<!ENTITY exchWebService.billingInformation.label "Factuurinfo:">
+<!ENTITY exchWebService.companies.label "Bedrijf:">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/calendar-event-dialog.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/calendar-event-dialog.dtd	1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Владелец:">
-<!ENTITY exchWebService.totalWork.label "Всего работ:">
-<!ENTITY exchWebService.actualWork.label "Фактическая работа:">
-<!ENTITY exchWebService.mileage.label "Пробег:">
-<!ENTITY exchWebService.billingInformation.label "Платежная информация:">
-<!ENTITY exchWebService.companies.label "Компания:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/ru/lightning-item-iframe.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/ru/lightning-item-iframe.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Владелец:">
+<!ENTITY exchWebService.totalWork.label "Всего работ:">
+<!ENTITY exchWebService.actualWork.label "Фактическая работа:">
+<!ENTITY exchWebService.mileage.label "Пробег:">
+<!ENTITY exchWebService.billingInformation.label "Платежная информация:">
+<!ENTITY exchWebService.companies.label "Компания:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/calendar-event-dialog.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/calendar-event-dialog.dtd	1970-01-01 01:00:00.000000000 +0100
@@ -1,7 +0,0 @@
-<!ENTITY exchWebService.owner.label "Ägare:">
-<!ENTITY exchWebService.totalWork.label "Total arbetstid:">
-<!ENTITY exchWebService.actualWork.label "Faktisk arbetstid:">
-<!ENTITY exchWebService.mileage.label "Körsträcka:">
-<!ENTITY exchWebService.billingInformation.label "Faktureringsinformation:">
-<!ENTITY exchWebService.companies.label "Företag:">
-
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/sv/lightning-item-iframe.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/sv/lightning-item-iframe.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,7 @@
+<!ENTITY exchWebService.owner.label "Ägare:">
+<!ENTITY exchWebService.totalWork.label "Total arbetstid:">
+<!ENTITY exchWebService.actualWork.label "Faktisk arbetstid:">
+<!ENTITY exchWebService.mileage.label "Körsträcka:">
+<!ENTITY exchWebService.billingInformation.label "Faktureringsinformation:">
+<!ENTITY exchWebService.companies.label "Företag:">
+
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/calendar-event-dialog.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/calendar-event-dialog.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/calendar-event-dialog.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/calendar-event-dialog.dtd	1970-01-01 01:00:00.000000000 +0100
@@ -1,6 +0,0 @@
-<!ENTITY exchWebService.owner.label “Sahip:”>
-<!ENTITY exchWebService.totalWork.label "Toplam iş:”>
-<!ENTITY exchWebService.actualWork.label “Gerçekleşen iş:”>
-<!ENTITY exchWebService.mileage.label "Mil olarka uzaklık:”>
-<!ENTITY exchWebService.billingInformation.label “Faturalama bilgileri:”>
-<!ENTITY exchWebService.companies.label “Şirket:”>
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/delegate-folder.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/delegate-folder.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/delegate-folder.dtd	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/delegate-folder.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -1,45 +1,45 @@
  
-<!ENTITY  label.delegatefolder.cancelbutton "Cancel">
-<!ENTITY  label.delegatefolder.userEmail "Email">
+<!ENTITY  label.delegatefolder.cancelbutton "İptal Et">
+<!ENTITY  label.delegatefolder.userEmail "E-posta">
  
-<!ENTITY  label.delegatefolder.permissionLevel "Permission Level">
-<!ENTITY  label.delegatefolder.userboxcolumn1 "User"> 
-<!ENTITY  label.delegatefolder.userboxcolumn2 "Permissions"> 
+<!ENTITY  label.delegatefolder.permissionLevel "İzin Seviyesi">
+<!ENTITY  label.delegatefolder.userboxcolumn1 "Kullanıcı"> 
+<!ENTITY  label.delegatefolder.userboxcolumn2 "İzinler"> 
 
-<!ENTITY  menuitem.delegatefolder.permission.author "Author">
-<!ENTITY  menuitem.delegatefolder.permission.editor "Editor">
-<!ENTITY  menuitem.delegatefolder.permission.reviewer "Reviewer">
-<!ENTITY  menuitem.delegatefolder.permission.none "None">
-<!ENTITY  menuitem.delegatefolder.permission.owner "Owner" > 
-<!ENTITY  menuitem.delegatefolder.permission.publishingEditor "PublishingEditor" >
-<!ENTITY  menuitem.delegatefolder.permission.publishingAuthor "PublishingAuthor" >
-<!ENTITY  menuitem.delegatefolder.permission.noneditingAuthor "NoneditingAuthor" >
-<!ENTITY  menuitem.delegatefolder.permission.contributor "Contributor" >
-<!ENTITY  menuitem.delegatefolder.permission.custom "Custom" >
+<!ENTITY  menuitem.delegatefolder.permission.author "Yazıcı">
+<!ENTITY  menuitem.delegatefolder.permission.editor "Düzenleyici">
+<!ENTITY  menuitem.delegatefolder.permission.reviewer "Okuyucu">
+<!ENTITY  menuitem.delegatefolder.permission.none "Yok">
+<!ENTITY  menuitem.delegatefolder.permission.owner "Sahip" > 
+<!ENTITY  menuitem.delegatefolder.permission.publishingEditor "YayınlayanDüzenleyici" >
+<!ENTITY  menuitem.delegatefolder.permission.publishingAuthor "YayınlayanYazıcı" >
+<!ENTITY  menuitem.delegatefolder.permission.noneditingAuthor "DüzenleyemeyenYazıcı" >
+<!ENTITY  menuitem.delegatefolder.permission.contributor "Yardımcı" >
+<!ENTITY  menuitem.delegatefolder.permission.custom "Özel" >
                             
-<!ENTITY  delegatefolder.permission.description.author "Read and create items in the folder." >
-<!ENTITY  delegatefolder.permission.description.editor "Read, create, and modify items in the folder." >
-<!ENTITY  delegatefolder.permission.description.reviewer "Read items in the folder." >
-<!ENTITY  delegatefolder.permission.description.none "No access permissions to the folder." >
+<!ENTITY  delegatefolder.permission.description.author "Dizindeki maddeleri okuyabilir ve yaratabilir." >
+<!ENTITY  delegatefolder.permission.description.editor "Dizindeki maddeleri okuyabilir, yaratabilir ve değiştirebilir." >
+<!ENTITY  delegatefolder.permission.description.reviewer "Dizindeki maddeleri okuyabilir." >
+<!ENTITY  delegatefolder.permission.description.none "Bu dizine erişim izni yok." >
 
- <!ENTITY  delegatefolder.permission.details.caption "Permission "> 
+ <!ENTITY  delegatefolder.permission.details.caption "İzin "> 
 
-<!ENTITY  delegatefolder.tab.msg.label  "No Calendar or Task found for this mail account.">
-<!ENTITY  delegatefolder.tab.name  "Exchange Folder Sharing">
+<!ENTITY  delegatefolder.tab.msg.label  "Bu posta hesabı için bir Takvim ya da Görev Listesi bulunamadı.">
+<!ENTITY  delegatefolder.tab.name  "Exchange Dizin Paylaşımı">
 
-<!ENTITY  delegatefolder.permissions.none  "None">
-<!ENTITY  delegatefolder.permissions.own  "Own items">
-<!ENTITY  delegatefolder.permissions.all  "All items">
-<!ENTITY  delegatefolder.permissions.full  "Full details">
+<!ENTITY  delegatefolder.permissions.none  "Yok">
+<!ENTITY  delegatefolder.permissions.own  "Kendi maddeleri">
+<!ENTITY  delegatefolder.permissions.all  "Bütün maddeler">
+<!ENTITY  delegatefolder.permissions.full  "Tüm detaylar">
 
-<!ENTITY  delegatefolder.permissions.cancreateitems  "Create Items">
-<!ENTITY  delegatefolder.permissions.cancreatesubfolders  "Create SubFolders">
-<!ENTITY  delegatefolder.permissions.isfolderowner  "Folder Owner">
-<!ENTITY  delegatefolder.permissions.isfoldervisible  "Folder Visible">
-<!ENTITY  delegatefolder.permissions.isfoldercontact  "Folder Contact">
-<!ENTITY  delegatefolder.permissions.edititems  "Edit Items">
-<!ENTITY  delegatefolder.permissions.deleteitems  "Delete Items">
-<!ENTITY  delegatefolder.permissions.readitems  "Read Items">  
+<!ENTITY  delegatefolder.permissions.cancreateitems  "Madde Yarat">
+<!ENTITY  delegatefolder.permissions.cancreatesubfolders  "Altdizinler Yarat">
+<!ENTITY  delegatefolder.permissions.isfolderowner  "Dizin Sahibi">
+<!ENTITY  delegatefolder.permissions.isfoldervisible  "Dizin Görülebiliyor">
+<!ENTITY  delegatefolder.permissions.isfoldercontact  "Dizinle İlişkili Kişi">
+<!ENTITY  delegatefolder.permissions.edititems  "Maddeleri Düzenleyebilir">
+<!ENTITY  delegatefolder.permissions.deleteitems  "Maddeleri Silebilir">
+<!ENTITY  delegatefolder.permissions.readitems  "Maddeleri Okuyabilir">  
  
-<!ENTITY  delegatefolder.permissions.true  "True">
-<!ENTITY  delegatefolder.permissions.false  "False">
+<!ENTITY  delegatefolder.permissions.true  "Doğru">
+<!ENTITY  delegatefolder.permissions.false  "Yanlış">
diff -Nru calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/lightning-item-iframe.dtd calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/lightning-item-iframe.dtd
--- calendar-exchange-provider-3.9.0/locale/exchangecalendar/tr/lightning-item-iframe.dtd	1970-01-01 01:00:00.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/locale/exchangecalendar/tr/lightning-item-iframe.dtd	2017-07-03 22:10:10.000000000 +0200
@@ -0,0 +1,6 @@
+<!ENTITY exchWebService.owner.label “Sahip:”>
+<!ENTITY exchWebService.totalWork.label "Toplam iş:”>
+<!ENTITY exchWebService.actualWork.label “Gerçekleşen iş:”>
+<!ENTITY exchWebService.mileage.label "Mil olarka uzaklık:”>
+<!ENTITY exchWebService.billingInformation.label “Faturalama bilgileri:”>
+<!ENTITY exchWebService.companies.label “Şirket:”>
diff -Nru calendar-exchange-provider-3.9.0/README.md calendar-exchange-provider-4.0.0~beta4/README.md
--- calendar-exchange-provider-3.9.0/README.md	2017-01-12 07:45:54.000000000 +0100
+++ calendar-exchange-provider-4.0.0~beta4/README.md	2017-07-03 22:10:10.000000000 +0200
@@ -1,50 +1,7 @@
-##Exchange EWS Provider
-=====================
-Thank you for checking out Ericsson's Exchange EWS Provider. Ericsson and the Ericsson QA team are grateful for the help and hard work of many [contributors][contributors] like yourself.
+Exchange Calendar is an **add-on for Thunderbird and Lightning** that provides **Exchange calendar support**.
 
-Current Release Vs. Download trend is something like [this](https://rawgit.com/muthusuba/github-tools/master/downloads-trend.html?user=Ericsson&repo=exchangecalendar)
-
-
-Getting involved as a contributor
-------------------------------------------
-We love working with contributors for Exchange EWS Provider, but it does require a few skills. You will need to know some Javascript, XUL, some CSS and a basic familiarity with GitHub.
-
-If you know some Javascript, it's worth having a look at the Object Oriented Programming to understand the basic concepts of class based coding and especially for xul window objects. 
-
-If you need to brush-up on programming, but are eager to start contributing immediately, please consider helping us find bugs in Github [Exchange EWS Provider][Exchange EWS Provider] or find bugs in the Issues tested by the [EricssonQA][EricssonQA] team. To brush up on Javascript skills before engaging with us, Dive Into Javascript [mozilla][mozilla] is an excellent resource. W3schools also has [notes on Javascript][w3schools] available through their website.  The programming concepts you will need to know include functions, working with classes, and some object-oriented programming basics. To brush up on XUL, Mozilla [XUL][XUL] is an easy and simple place to learn XUL, More of XUL are dynamically configured and cross-plateform.
-
-Special thanks to all our [contributors][contributors]
-
-[w3schools]:  http://www.w3schools.com/js/
-[mozilla]:  https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide
-[EricssonQA]:  https://github.com/Ericsson/exchangecalendar/
-[Exchange EWS Provider]:  https://github.com/Ericsson/exchangecalendar/issues
-[XUL]:  https://developer.mozilla.org/en-US/Add-ons/Overlay_Extensions/XUL_School
-[contributors]: https://github.com/Ericsson/exchangecalendar/contributors
-
-Questions are always welcome
-----------------------------
-While we take pains to keep our documentation updated, the best source of information is those of us who work on the project. We also have the [wiki][wiki] pages to answer your general questions about contributing to Exchange EWS Provider.
-
-[wiki]:   https://github.com/Ericsson/exchangecalendar/wiki
- 
-Getting set up
--------------
-It's easy to get set up: just 2 pieces of software to install and in few command lines you'll be running the addon!
-
-### Install Thunderbird
-If you don't already have it installed, please install latest version
-https://support.mozilla.org/en-US/kb/installing-thunderbird
-
-### Install Lightning
-If you don't already have it installed, please install latest version
-https://support.mozilla.org/en-US/kb/installing-lightning-thunderbird
-
-### Cloning the test repository with Git
-After you have installed [Git] you will need to clone the project to your hard drive. From your workspace directory run this command which will copy (clone) the project to your hard drive
-
-    git clone --recursive git://github.com/Ericsson/exchangecalendar.git
-[Git]: http://en.wikipedia.org/wiki/Git_%28software%29
+## Contributing
+This add-on is open-source and based on the work of many [contributors](https://github.com/ExchangeCalendar/exchangecalendar/graphs/contributors).
 
 ### Installing developement tools
 You will need to install Dom Inspector, Javascript Debugger and some other development tools. Fortunately `Thunderbird addons` makes it easy to install all of these: 
@@ -53,21 +10,6 @@
 
     cd ./exchangecalendar_master; chmod +x ./build.sh; ./build.sh;
 
-Now you can install the Exchange EWS Provider addon
-
-Writing Code
--------------
-If you want to get involved and add more code, then there's just a few things
-we'd like to ask you to do:
-
-1. Use the similar code format for all new developement and window objects 
-2. Follow mozilla's simple [Coding Style Guide][Coding Style Guide] recommendations
-3. Fork this project with your own GitHub account
-4. Make sure all tests are passing and submit a pull request with your changes
-
-[Coding Style Guide]: https://developer.mozilla.org/en-US/docs/Mozilla/Developer_guide/Coding_Style
- 
-License
--------
+## License
 This software is licensed under the [GNU GPL] Version 3 
 [GNU GPL]: http://www.gnu.org/licenses/gpl.html

Attachment: signature.asc
Description: OpenPGP digital signature


Reply to: