diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000000000000000000000000000000000000..863373360ff2a33d132bb699af6b9cc8215cccbf
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,17 @@
+# Copying and distribution of this file, with or without modification,
+# are permitted in any medium without royalty provided this notice is
+# preserved.  This file is offered as-is, without any warranty.
+# Names of contributors must not be used to endorse or promote products
+# derived from this file without specific prior written permission.
+
+# EditorConfig
+# http://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+# LF end-of-line, insert an empty new line and UTF-8
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..70ca726e96b4e9d05b9d2a3c89ea5c56fba67c20
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,25 @@
+# Temp files
+*~
+*.bak
+*.backup
+\#*
+.\#*
+*\#
+*.swp
+*.swap
+*.sav
+*.save
+*.autosav
+*.autosave
+
+*.iml
+.gradle
+/local.properties
+/gradle.properties
+/.idea/
+.DS_Store
+/build
+/captures
+debug.keystore
+release.keystore
+signing.properties
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000000000000000000000000000000000000..7bf8274bc65b4a1a96c4da88ffc0251b77e2b292
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,762 @@
+Changelog
+==========
+
+Version 4.0.3 *(2018-05-15)*
+----------------------------
+
+ * Fixing some widget related crashes
+
+Version 4.0.2 *(2018-05-14)*
+----------------------------
+
+ * Make sure we store the proper calendar ID at events
+
+Version 4.0.1 *(2018-05-14)*
+----------------------------
+
+ * Fix app not opening at clicking widgets
+ * Couple stability improvements
+
+Version 4.0.0 *(2018-05-10)*
+----------------------------
+
+ * Allow changing the app launcher color
+ * Allow setting reminder looping till dismissed
+ * Added a button in Settings for changing widget colors without recreating them
+ * Added optional dimming of past events
+ * Make Event List view an endless scrollview
+ * Added some more advanced yearly repetition rules
+ * Improved some country holidays
+ * Many CalDAV related improvements
+ * Many other smaller bugfixes and performance/UX improvements
+
+Version 3.4.2 *(2018-04-13)*
+----------------------------
+
+ * Hide public notification content if desired so (by fraang)
+ * Added optional grid on the monthly view
+ * Allow exporting events on SD cards
+ * Allow selecting No Sound as a reminder sound
+ * Set default event status for CalDAV events as Confirmed
+
+Version 3.4.1 *(2018-03-30)*
+----------------------------
+
+ * Reworked custom notification sound, should be more reliable
+ * Fixed some glitches related to the monthly view
+ * Misc smaller bugfixes and stability improvements
+
+Version 3.4.0 *(2018-02-28)*
+----------------------------
+
+ * Rewrote the monthly view
+ * Improved the performance at importing events from ics files
+ * Added many new country holidays
+ * Handle some new third party intents
+
+Version 3.3.2 *(2018-02-21)*
+----------------------------
+
+ * Try fixing the off-by-one issue at CalDAV syncing all-day events
+ * Couple stability improvements
+
+Version 3.3.1 *(2018-02-19)*
+----------------------------
+
+ * Improved CalDAV all-day event importing (by angelsl)
+ * Added a FAQ section with a couple initial items
+ * Once again fixed some cases of blank or duplicate views
+
+Version 3.3.0 *(2018-02-10)*
+----------------------------
+
+ * Fixed blank or duplicate views in some cases (yes, again)
+ * Fixed off-by-one day error at syncing all-day events via Nextcloud
+ * Make default filenames at export more user-friendly
+ * Improved the performance by removing some unnecessary redraws
+ * Added a toggle for switching between default snooze interval or always showing an interval picker
+
+Version 3.2.4 *(2018-02-05)*
+----------------------------
+
+ * Fixed blank screens in some cases
+ * Misc smaller improvements
+
+Version 3.2.3 *(2018-02-01)*
+----------------------------
+
+ * Fixed blank screens in some cases
+ * Make sure the Add New Event button works when opening the app from a widget
+ * Removed the "Default event reminder" from settings, remember last used values
+ * Allow selecting Snooze interval at pressing Snooze
+ * Allow disabling displaying of What's New
+ * Add a Back button at the actionmenu when opening a subview
+ * Allow deleting all events at once without reseting event types and other settings
+
+Version 3.2.2 *(2018-01-27)*
+----------------------------
+
+ * Fixed some cases of reminders not triggering
+ * Properly handle importing events with multiple lines long description
+ * Properly show the New Event button whenever appropriate
+
+Version 3.2.1 *(2018-01-22)*
+----------------------------
+
+ * Misc minor fixes
+
+Version 3.2.0 *(2018-01-22)*
+----------------------------
+
+ * Added an initial implementation of Search
+ * Fixed an off-by-one issue at syncing all-day CalDAV events
+ * Added a Daily View
+ * Allow importing events from .ics files directly in a CalDAV account
+ * Try parsing latitude and longitude coordinates from the Location field
+
+Version 3.1.0 *(2018-01-11)*
+----------------------------
+
+ * Made some CalDAV sync improvements, especially related to repeatable event exceptions
+ * Added a Map button to event location, to display the location in a third party map
+ * Handle INSERT and EDIT intent
+ * Made Dark theme the default
+ * Updated both event list and monthly widget, hopelly making them more reliable
+ * Added holidays in Australia
+ * Hopefully fixed the off-by-one error at importing/syncing all-day events/holidays
+
+Version 3.0.1 *(2017-12-06)*
+----------------------------
+
+ * Fixed missing launcher icons on some devices
+ * Properly name the Holidays event type on non-english devices
+
+Version 3.0.0 *(2017-12-04)*
+----------------------------
+
+ * Improved primary color customization
+ * Fixed notifications on Android 8
+ * Fixed a couple issues with importing events
+ * Properly export/import custom event type colors
+
+Version 2.12.0 *(2017-11-26)*
+----------------------------
+
+ * Allow setting repetition on every for example 4th sunday, even if a month has only 4
+ * Some rewrites to the list views
+
+Version 2.11.0 *(2017-11-13)*
+----------------------------
+
+ * Adding a toggle for using English language on non-english devices
+ * Adding an Adaptive launcher icon
+ * Really fixing CalDAV sync
+ * Many other smaller improvements under the hood
+
+Version 2.10.1 *(2017-11-08)*
+----------------------------
+
+ * Fixed CalDAV syncing
+
+Version 2.10.0 *(2017-11-07)*
+----------------------------
+
+ * Allow adding contact anniversaries
+ * Couple monthly view improvements
+ * Remove the wrongly added Fingerprint permission
+
+Version 2.9.2 *(2017-10-30)*
+----------------------------
+
+ * Add PRODID and VERSION to the exported ICS file
+ * Handle parsing more formats of contact birthdays
+ * Increase the opacity of event titles at weekly and monthly view
+
+Version 2.9.1 *(2017-10-25)*
+----------------------------
+
+ * Fix a glitch at automatically reseting regular event type color
+ * Use contrast color at weekly view for event labels
+ * Properly handle birthdays without a year specified
+
+Version 2.9.0 *(2017-10-21)*
+----------------------------
+
+ * Added a Location field
+ * Allow adding Contact birthdays
+ * Rewrote the widgets, making them more reliable
+ * After opening the app from widget and pressing Back, go to the main screen
+ * Many other performance and stability improvements
+
+Version 2.8.2 *(2017-10-14)*
+----------------------------
+
+ * Increasing the monthly widget font size
+ * Couple smaller improvements to monthly widget
+
+Version 2.8.1 *(2017-10-09)*
+----------------------------
+
+ * Adding a crashfix
+
+Version 2.8.0 *(2017-10-08)*
+----------------------------
+
+ * Reworked the monthly view layout
+ * Misc performance/ux improvements
+
+Version 2.7.6 *(2017-09-24)*
+----------------------------
+
+ * Add support for events repeating every 30 days
+ * Fix event type color at the Event list widget
+ * Fix a glitch at wrongly displayed events lasting through midnight
+ * Update events imported via .ics files, check last-modified field
+
+Version 2.7.5 *(2017-09-10)*
+----------------------------
+
+ * Fixed some CalDAV sync issues
+ * Use the next full hour as the default event time, not 13:00 the next day
+ * Color the days in yearly view based on event types
+ * Allow displaying past events in the event list widget
+ * Make sure the Save and Delete buttons have the highest priority at the actionmenu
+
+Version 2.7.4 *(2017-09-02)*
+----------------------------
+
+ * Fixed importing .ics files
+ * Made errors at importing events more verbose
+
+Version 2.7.3 *(2017-08-29)*
+----------------------------
+
+ * Adding some crashfixes
+
+Version 2.7.2 *(2017-08-28)*
+----------------------------
+
+ * Misc minor improvements and crashfixes
+
+Version 2.7.1 *(2017-08-28)*
+----------------------------
+
+ * Adding minor crashfixes
+
+Version 2.7.0 *(2017-08-27)*
+----------------------------
+
+ * Replaced Google Sync with CalDAV sync, please check Settings for enabling it
+ * Improved Tablet support
+ * Added colored dots marking event types at multiple views
+
+Version 2.6.1 *(2017-07-30)*
+----------------------------
+
+ * Properly display events repeating weekly on some views
+ * Adding a crashfix
+
+Version 2.6.0 *(2017-07-29)*
+----------------------------
+
+ * Added an initial implementation of Google sync
+
+Version 2.5.8 *(2017-07-12)*
+----------------------------
+
+ * Hotfixing an issue causing crashes at upgrading the app for some people
+ * Build was created from b544749 by cherry-picking 521eeb6 for playstore only
+
+Version 2.5.7 *(2017-07-06)*
+----------------------------
+
+ * Added a setting for changing widget font size
+ * Added Austrian holidays
+
+Version 2.5.6 *(2017-06-24)*
+----------------------------
+
+ * Properly display all-day events on list views
+
+Version 2.5.4 *(2017-06-23)*
+----------------------------
+
+ * Added rounded launcher icons for Android Nougat
+
+Version 2.5.3 *(2017-06-14)*
+----------------------------
+
+ * Allow editing specific instances of repeating events
+ * Show proper date and time at opening a repeatable event instance
+
+Version 2.5.2 *(2017-06-05)*
+----------------------------
+
+ * Store timezone and daylight saving info at events
+ * Misc smaller crashfixes and improvements
+
+Version 2.5.1 *(2017-05-26)*
+----------------------------
+
+ * Adding a crashfix at monthly widget
+
+Version 2.5.0 *(2017-05-24)*
+----------------------------
+
+ * Allow displaying some events from the past in the Simple Event List view
+ * Make sure the event duration stays the same at changing the event Start value
+
+Version 2.4.3 *(2017-05-18)*
+----------------------------
+
+ * Added an easy way to import Holidays in some countries
+ * Allow filtering events to export by event type
+ * Added Snooze
+ * Fixed misc issues with triggering reminders
+ * Allow renaming the file used for exporting events to
+ * Added Turkish translation by Burhan 2010
+
+Version 2.4.2 *(2017-05-09)*
+----------------------------
+
+ * Add more advanced monthly repetition options, like "Last day of the month" or "Every second Tuesday"
+ * Fix events repeating by multiple weeks or months
+ * Allow exporting events on SD cards
+ * Properly display non repeating events
+
+Version 2.4.1 *(2017-05-09)*
+----------------------------
+
+ * Add more advanced monthly repetition options, like "Last day of the month" or "Every second Tuesday"
+ * Fix events repeating by multiple weeks or months
+ * Allow exporting events on SD cards
+ * Properly display non repeating events
+
+Version 2.4.0 *(2017-05-08)*
+----------------------------
+
+ * Add more advanced monthly repetition options, like "Last day of the month" or "Every second Tuesday"
+ * Fix events repeating by multiple weeks or months
+ * Allow exporting events on SD cards
+
+Version 2.3.5 *(2017-05-05)*
+----------------------------
+
+ * Make urls, phone numbers, map coords and emails in event description clickable
+ * Fixed a couple issues mostly related to repeating events
+ * Minor crashfixes
+
+Version 2.3.4 *(2017-04-23)*
+----------------------------
+
+ * Add a new event repetition type "Repeat x times"
+ * Color the dot at the monthly view based on the event types
+ * Fix a couple event importing issues
+
+Version 2.3.3 *(2017-04-17)*
+----------------------------
+
+ * Fixing a crash at getting the sd card path
+
+Version 2.3.2 *(2017-04-17)*
+----------------------------
+
+ * Added more advanced weekly repetition by week days
+ * Added sharing individual events by creating temporary .ics files
+ * Properly start the week at datepicker by Sunday if selected so
+ * Handle opening .ics files from email clients
+ * Some bugfixes related to exporting/importing events
+ * Misc other bugfixes and UX improvements
+
+Version 2.3.1 *(2017-04-09)*
+----------------------------
+
+ * Fix some crashing to people who upgraded 2 database versions at once
+ * Add repeatable event if UNTIL is the time of last occurences start
+
+Version 2.3.0 *(2017-04-07)*
+----------------------------
+
+ * Replaced raw database exporting with proper .ics file exporting
+ * Added color themes
+
+Version 2.2.7 *(2017-04-02)*
+----------------------------
+
+ * Misc smaller bugfixes and improvements
+
+Version 2.2.6 *(2017-03-12)*
+----------------------------
+
+ * Fix some rare crash at some time of some timezone
+
+Version 2.2.5 *(2017-03-12)*
+----------------------------
+
+ * Fix some rare crash at some time of some timezone
+
+Version 2.2.4 *(2017-03-06)*
+----------------------------
+
+ * Some crashfixes
+
+Version 2.2.3 *(2017-03-05)*
+----------------------------
+
+ * Allow deleting individual occurrences of repeatable events
+ * Many smaller improvements and bugfixes
+
+Version 2.2.2 *(2017-02-28)*
+----------------------------
+
+ * Added the ability to export raw database of events
+
+Version 2.2.1 *(2017-02-21)*
+----------------------------
+
+ * Added a setting for toggling 24-hour format
+ * Added buttons for easy event creation to widgets
+ * Some .ics file parsing fixes
+ * Couple smaller improvements
+
+Version 2.2.0 *(2017-02-19)*
+----------------------------
+
+ * Implement customizable repeat intervals
+ * Use a lot more fields when importing events from .ics files
+ * Add a "Go to today" button in some views
+ * Many other smaller improvements and bugfixes
+
+Version 2.1.10 *(2017-02-16)*
+----------------------------
+
+ * Fix some issues with importing some .ics files
+ * Use the es Spanish translation for ca and gl Spanish too
+
+Version 2.1.9 *(2017-02-12)*
+----------------------------
+
+ * Added event types with customizable colors
+ * Some crashfixes
+
+Version 2.1.8 *(2017-02-07)*
+----------------------------
+
+ * Added a current time indicator at weekly view
+ * Removed the Undo function after deleting events
+ * Added Slovak translation
+
+Version 2.1.7 *(2017-02-07)*
+----------------------------
+
+ * Fix reminders of non repeating events
+
+Version 2.1.6 *(2017-02-06)*
+----------------------------
+
+ * Allow setting up to 3 reminders per event
+
+Version 2.1.5 *(2017-02-06)*
+----------------------------
+
+ * Adding a crashfix
+
+Version 2.1.4 *(2017-02-05)*
+----------------------------
+
+ * Added support for all-day long events
+ * Improved support for importing .ics files
+ * Many UI changes here and there
+
+Version 2.1.3 *(2017-01-26)*
+----------------------------
+
+ * Allow importing events from .ics files
+ * Display proper week number at widgets
+ * Smaller bugfixes and improvements
+
+Version 2.1.2 *(2017-01-24)*
+----------------------------
+
+ * Some smaller bugfixes
+
+Version 2.1.1 *(2017-01-23)*
+----------------------------
+
+ * Allow selecting colors by hex codes
+ * Added a button for restoring default colors
+
+Version 2.1.0 *(2017-01-22)*
+----------------------------
+
+ * Adding an initial implementation of a weekly view
+
+Version 2.0.3 *(2017-01-10)*
+----------------------------
+
+ * Use the new version of the colorpicker dialog
+ * Some crashfixes
+
+Version 2.0.2 *(2017-01-07)*
+----------------------------
+
+ * Allow setting empty notification sound
+ * Notification reminders have been tweaked, please update them
+
+Version 2.0.1 *(2017-01-06)*
+----------------------------
+
+ * Use a brighter white for the default background
+ * Misc smaller changes
+
+Version 2.0.0 *(2017-01-04)*
+----------------------------
+
+ * Added more color customization
+ * Added a Whats new dialog
+ * Mark current day with a circle, underline days with events
+ * Many smaller improvements and bugfixes
+
+Version 1.43 *(2016-12-18)*
+----------------------------
+
+ * Use 12 or 24 hours time format as appropriate
+ * Fixing a crash at going to Settings on some devices
+
+Version 1.42 *(2016-12-10)*
+----------------------------
+
+ * Allow changing the reminder notification sound
+
+Version 1.41 *(2016-12-09)*
+----------------------------
+
+ * Some smaller bugfixes and updated translations
+
+Version 1.40 *(2016-11-30)*
+----------------------------
+
+ * Add a new widget for a list of events
+ * Make the reminder alarm more aggressive, waking up sleeping devices
+ * Misc bug and crashfixes
+
+Version 1.39 *(2016-11-26)*
+----------------------------
+
+ * Activate the notification light at reminders
+ * Add an optional vibration to reminders, disabled by default
+ * Misc smaller improvements
+
+Version 1.38 *(2016-11-23)*
+----------------------------
+
+ * Always show the "Change view" button on the actionbar
+ * Add a confirmation dialog before deleting events
+ * Reduce the size of todays date on big screens
+
+Version 1.37 *(2016-11-22)*
+----------------------------
+
+ * Remove the "Add new event" button from yearly view
+ * Misc other smaller improvements
+
+Version 1.36 *(2016-11-19)*
+----------------------------
+
+ * Make sure events are sorted properly in the Day view
+
+Version 1.35 *(2016-11-19)*
+----------------------------
+
+ * Some crashfixes
+
+Version 1.34 *(2016-11-17)*
+----------------------------
+
+ * Misc small fixes
+
+Version 1.33 *(2016-11-07)*
+----------------------------
+
+ * Display the day of the week in some views
+ * Added Spanish translation
+
+Version 1.32 *(2016-11-03)*
+----------------------------
+
+ * Properly highlight events lasting multiple days
+
+Version 1.31 *(2016-11-03)*
+----------------------------
+
+ * Couple minor UI improvements
+
+Version 1.30 *(2016-11-02)*
+----------------------------
+
+ * Added Hindi translation
+ * Some default reminder corrections
+
+Version 1.29 *(2016-11-02)*
+----------------------------
+
+ * Allow setting event reminder in other units too, not just minutes
+ * Allow setting a default reminder used by new events
+
+Version 1.28 *(2016-10-24)*
+----------------------------
+
+ * Misc bugfixes and improvements
+
+Version 1.27 *(2016-10-23)*
+----------------------------
+
+ * Added a new view with listing all events one year ahead
+
+Version 1.26 *(2016-10-22)*
+----------------------------
+
+ * Added a yearly view
+ * Misc bugfixes and performance improvements
+
+Version 1.25 *(2016-10-15)*
+----------------------------
+
+ * Add biweekly repetition
+ * Remember the last value used at "Custom reminder minutes"
+
+Version 1.24 *(2016-10-05)*
+----------------------------
+
+ * Fix notifications of non-repeatable events
+ * Add an option to display week numbers, disabled by default
+
+Version 1.23 *(2016-09-24)*
+----------------------------
+
+ * Reduce the side padding of the widget
+
+Version 1.22 *(2016-09-20)*
+----------------------------
+
+ * Allow swiping between months and days
+ * Update the widget when appropriate
+ * Underline days with events on the widget instead of using bold
+ * Misc UI improvements
+
+Version 1.21 *(2016-09-13)*
+----------------------------
+
+ * Add simple daily, weekly, monthly and yearly recurring option
+ * Update the widget every 1 hour down from 5 hours
+ * Make event End date and time really optional
+
+Version 1.20 *(2016-09-09)*
+----------------------------
+
+ * Allow setting first day of the week to sunday
+
+Version 1.19 *(2016-09-07)*
+----------------------------
+
+ * Added German translation
+
+Version 1.18 *(2016-08-29)*
+----------------------------
+
+ * Rename the app launcher to Calendar
+ * Update the launcher icon
+ * Fix deleting multiple events at once
+
+Version 1.17 *(2016-08-21)*
+----------------------------
+
+ * Add an Invite friends button
+ * Allow adding events in the past, but notify the user
+ * Set default event reminder to At start
+ * Use manually translated month names for reliability
+ * Fix day switching arrows for every timezone
+
+Version 1.16 *(2016-08-04)*
+----------------------------
+
+ * Make event end date/time optional
+ * Show the event description at the events screen
+
+Version 1.15 *(2016-07-31)*
+----------------------------
+
+ * Fix a bug with some wrong month names
+
+Version 1.14 *(2016-07-26)*
+----------------------------
+
+ * Make the dark theme really dark
+
+Version 1.13 *(2016-07-26)*
+----------------------------
+
+ * Properly translate month names
+
+Version 1.12 *(2016-07-21)*
+----------------------------
+
+ * Fix date at adding new event
+
+Version 1.11 *(2016-07-18)*
+----------------------------
+
+ * Added navigation between screens
+
+Version 1.10 *(2016-07-18)*
+----------------------------
+
+ * Added Dark Theme
+ * Added Japanese, Swedish and Italian translations
+ * Misc minor fixes
+
+Version 1.9 *(2016-07-13)*
+----------------------------
+
+ * Do not force portrait mode
+
+Version 1.8 *(2016-07-07)*
+----------------------------
+
+ * Implement Event notifications
+
+Version 1.6 *(2016-07-05)*
+----------------------------
+
+ * Implement Events (no reminder yet)
+
+Version 1.5 *(2016-07-01)*
+----------------------------
+
+ * Adjust everything properly if used on a tablet
+ * Show a Rate us button to returning users
+
+Version 1.4 *(2016-06-27)*
+----------------------------
+
+ * Add a Google Plus page link to the About section
+
+Version 1.3 *(2016-06-19)*
+----------------------------
+
+ * Add a Facebook page link to the About section
+
+Version 1.2 *(2016-06-17)*
+----------------------------
+
+ * Always force english locale
+
+Version 1.1 *(2016-06-13)*
+----------------------------
+
+ * Allow resizing the widget
+
+Version 1.0 *(2016-06-05)*
+----------------------------
+
+ * Initial release
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..05ae14869ced6d6b9d96f386ca5b493cd57a32e3
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        https://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright 2017 SimpleMobileTools
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       https://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/app/.gitignore b/app/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..796b96d1c402326528b4ba3c12ee9d92d0e212e9
--- /dev/null
+++ b/app/.gitignore
@@ -0,0 +1 @@
+/build
diff --git a/app/build.gradle b/app/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..9dec386e1cc7eee667c180bbe55c040f805701e8
--- /dev/null
+++ b/app/build.gradle
@@ -0,0 +1,75 @@
+apply plugin: 'com.android.application'
+apply plugin: 'kotlin-android'
+apply plugin: 'kotlin-android-extensions'
+
+android {
+    compileSdkVersion 27
+    buildToolsVersion "27.0.3"
+
+    defaultConfig {
+        applicationId "com.simplemobiletools.calendar"
+        minSdkVersion 16
+        targetSdkVersion 27
+        versionCode 122
+        versionName "4.0.3"
+        multiDexEnabled true
+        setProperty("archivesBaseName", "calendar")
+    }
+
+    signingConfigs {
+        release
+    }
+
+    buildTypes {
+        debug {
+            applicationIdSuffix ".debug"
+        }
+        release {
+            minifyEnabled true
+            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
+            signingConfig signingConfigs.release
+        }
+    }
+
+    sourceSets {
+        main.java.srcDirs += 'src/main/kotlin'
+    }
+
+    lintOptions {
+        checkReleaseBuilds false
+        abortOnError false
+    }
+}
+
+ext {
+    leakCanaryVersion = '1.5.4'
+}
+
+dependencies {
+    implementation 'com.simplemobiletools:commons:4.0.15'
+    implementation 'joda-time:joda-time:2.9.9'
+    implementation 'com.facebook.stetho:stetho:1.5.0'
+    implementation 'com.android.support:multidex:1.0.3'
+
+    debugImplementation "com.squareup.leakcanary:leakcanary-android:$leakCanaryVersion"
+    releaseImplementation "com.squareup.leakcanary:leakcanary-android-no-op:$leakCanaryVersion"
+}
+
+Properties props = new Properties()
+def propFile = new File('signing.properties')
+if (propFile.canRead()) {
+    props.load(new FileInputStream(propFile))
+
+    if (props != null && props.containsKey('STORE_FILE') && props.containsKey('KEY_ALIAS') && props.containsKey('PASSWORD')) {
+        android.signingConfigs.release.storeFile = file(props['STORE_FILE'])
+        android.signingConfigs.release.storePassword = props['PASSWORD']
+        android.signingConfigs.release.keyAlias = props['KEY_ALIAS']
+        android.signingConfigs.release.keyPassword = props['PASSWORD']
+    } else {
+        println 'signing.properties found but some entries are missing'
+        android.buildTypes.release.signingConfig = null
+    }
+} else {
+    println 'signing.properties not found'
+    android.buildTypes.release.signingConfig = null
+}
diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro
new file mode 100644
index 0000000000000000000000000000000000000000..ad7d60487c68185a8fb0ddaec8874d7951e5d044
--- /dev/null
+++ b/app/proguard-rules.pro
@@ -0,0 +1 @@
+-keep class com.simplemobiletools.calendar.models.** { *; }
diff --git a/app/src/debug/res/drawable-hdpi/leak_canary_icon.png b/app/src/debug/res/drawable-hdpi/leak_canary_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..e10f62503524a234a4ddcf13be698d209513f15a
Binary files /dev/null and b/app/src/debug/res/drawable-hdpi/leak_canary_icon.png differ
diff --git a/app/src/debug/res/drawable-xhdpi/leak_canary_icon.png b/app/src/debug/res/drawable-xhdpi/leak_canary_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..462db1d633eb30ee8d93f410bc6a08ecd5289c6a
Binary files /dev/null and b/app/src/debug/res/drawable-xhdpi/leak_canary_icon.png differ
diff --git a/app/src/debug/res/drawable-xxhdpi/leak_canary_icon.png b/app/src/debug/res/drawable-xxhdpi/leak_canary_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..047eedcae6c31982b5d95276bc785d1cb36460ed
Binary files /dev/null and b/app/src/debug/res/drawable-xxhdpi/leak_canary_icon.png differ
diff --git a/app/src/debug/res/drawable-xxxhdpi/leak_canary_icon.png b/app/src/debug/res/drawable-xxxhdpi/leak_canary_icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c264e8077476dd0cd1e6d2c0c9329288e5bf342
Binary files /dev/null and b/app/src/debug/res/drawable-xxxhdpi/leak_canary_icon.png differ
diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..39feb947ec5099f6e77a8afea3f16edce75c6246
--- /dev/null
+++ b/app/src/debug/res/values/strings.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_launcher_name">Calendar_debug</string>
+    <string name="leak_canary_display_activity_label">Calendar Leaks</string>
+</resources>
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f065f2fac6572aa4e88527d9da4a37e2fe6f6719
--- /dev/null
+++ b/app/src/main/AndroidManifest.xml
@@ -0,0 +1,447 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.simplemobiletools.calendar"
+    android:installLocation="auto">
+
+    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
+    <uses-permission android:name="android.permission.READ_CONTACTS"/>
+    <uses-permission android:name="android.permission.VIBRATE"/>
+    <uses-permission android:name="android.permission.READ_CALENDAR"/>
+    <uses-permission android:name="android.permission.WRITE_CALENDAR"/>
+    <uses-permission android:name='android.permission.WAKE_LOCK'/>
+    <uses-permission
+        android:name="android.permission.USE_FINGERPRINT"
+        tools:node="remove"/>
+
+    <application
+        android:name=".App"
+        android:allowBackup="true"
+        android:icon="@mipmap/ic_launcher"
+        android:label="@string/app_launcher_name"
+        android:roundIcon="@mipmap/ic_launcher"
+        android:theme="@style/AppTheme">
+
+        <activity
+            android:name=".activities.SplashActivity"
+            android:launchMode="singleTask"
+            android:theme="@style/SplashTheme">
+            <intent-filter>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:name=".activities.MainActivity"
+            android:launchMode="singleTask">
+            <meta-data
+                android:name="android.app.default_searchable"
+                android:resource="@xml/searchable"/>
+
+            <intent-filter>
+                <action android:name="android.intent.action.SEARCH"/>
+            </intent-filter>
+
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+
+                <data android:scheme="content"/>
+                <data android:scheme="file"/>
+                <data android:mimeType="text/x-vcalendar"/>
+                <data android:mimeType="text/calendar"/>
+            </intent-filter>
+
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+
+                <data android:mimeType="time/epoch"/>
+                <data android:host="com.android.calendar"/>
+                <data android:scheme="content"/>
+            </intent-filter>
+
+            <intent-filter>
+                <action android:name="android.intent.action.VIEW"/>
+                <category android:name="android.intent.category.DEFAULT"/>
+                <data android:mimeType="vnd.android.cursor.item/event"/>
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:name=".activities.WidgetMonthlyConfigureActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/MyWidgetConfigTheme">
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:name=".activities.WidgetListConfigureActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/MyWidgetConfigTheme">
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:name="com.simplemobiletools.commons.activities.AboutActivity"
+            android:label="@string/about"
+            android:parentActivityName=".activities.MainActivity"/>
+
+        <activity
+            android:name="com.simplemobiletools.commons.activities.CustomizationActivity"
+            android:label="@string/customize_colors"
+            android:parentActivityName=".activities.SettingsActivity"/>
+
+        <activity
+            android:name="com.simplemobiletools.commons.activities.LicenseActivity"
+            android:label="@string/third_party_licences"
+            android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
+
+        <activity
+            android:name="com.simplemobiletools.commons.activities.FAQActivity"
+            android:label="@string/frequently_asked_questions"
+            android:parentActivityName="com.simplemobiletools.commons.activities.AboutActivity"/>
+
+        <activity
+            android:name=".activities.EventActivity"
+            android:parentActivityName=".activities.MainActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.EDIT"/>
+                <action android:name="android.intent.action.INSERT"/>
+
+                <category android:name="android.intent.category.DEFAULT"/>
+                <data android:mimeType="vnd.android.cursor.item/event"/>
+            </intent-filter>
+
+            <intent-filter>
+                <action android:name="android.intent.action.EDIT"/>
+                <action android:name="android.intent.action.INSERT"/>
+
+                <category android:name="android.intent.category.DEFAULT"/>
+                <data android:mimeType="vnd.android.cursor.dir/event"/>
+            </intent-filter>
+        </activity>
+
+        <activity
+            android:name=".activities.SettingsActivity"
+            android:label="@string/settings"
+            android:parentActivityName=".activities.MainActivity"/>
+
+        <activity
+            android:name=".activities.ManageEventTypesActivity"
+            android:label="@string/event_types"
+            android:parentActivityName=".activities.SettingsActivity"/>
+
+        <activity
+            android:name=".activities.SnoozeReminderActivity"
+            android:theme="@style/Theme.Transparent"/>
+
+        <receiver
+            android:name=".helpers.MyWidgetMonthlyProvider"
+            android:icon="@drawable/img_widget_monthly_preview"
+            android:label="@string/widget_monthly">
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
+            </intent-filter>
+
+            <meta-data
+                android:name="android.appwidget.provider"
+                android:resource="@xml/widget_monthly_info"/>
+        </receiver>
+
+        <receiver
+            android:name=".helpers.MyWidgetListProvider"
+            android:icon="@drawable/img_widget_list_preview"
+            android:label="@string/widget_list">
+            <intent-filter>
+                <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
+            </intent-filter>
+
+            <meta-data
+                android:name="android.appwidget.provider"
+                android:resource="@xml/widget_list_info"/>
+        </receiver>
+
+        <service
+            android:name=".services.WidgetService"
+            android:permission="android.permission.BIND_REMOTEVIEWS"/>
+
+        <service android:name=".services.SnoozeService"/>
+
+        <receiver android:name=".receivers.NotificationReceiver"/>
+
+        <receiver android:name=".receivers.CalDAVSyncReceiver"/>
+
+        <receiver android:name=".receivers.BootCompletedReceiver">
+            <intent-filter>
+                <action android:name="android.intent.action.BOOT_COMPLETED"/>
+                <action android:name="android.intent.action.QUICKBOOT_POWERON"/>
+                <action android:name="com.htc.intent.action.QUICKBOOT_POWERON"/>
+            </intent-filter>
+        </receiver>
+
+        <provider
+            android:name="android.support.v4.content.FileProvider"
+            android:authorities="${applicationId}.provider"
+            android:exported="false"
+            android:grantUriPermissions="true">
+            <meta-data
+                android:name="android.support.FILE_PROVIDER_PATHS"
+                android:resource="@xml/provider_paths"/>
+        </provider>
+
+        <!-- Do not append ".Orange" to the default alias "name", it would remove the old homescreen launcher of users at upgrade -->
+        <activity-alias
+            android:name=".activities.SplashActivity"
+            android:enabled="true"
+            android:icon="@mipmap/ic_launcher"
+            android:roundIcon="@mipmap/ic_launcher"
+            android:targetActivity=".activities.SplashActivity">
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Red"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_red"
+            android:roundIcon="@mipmap/ic_launcher_red"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Pink"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_pink"
+            android:roundIcon="@mipmap/ic_launcher_pink"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Purple"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_purple"
+            android:roundIcon="@mipmap/ic_launcher_purple"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Deep_purple"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_deep_purple"
+            android:roundIcon="@mipmap/ic_launcher_deep_purple"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Indigo"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_indigo"
+            android:roundIcon="@mipmap/ic_launcher_indigo"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Blue"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_blue"
+            android:roundIcon="@mipmap/ic_launcher_blue"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Light_blue"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_light_blue"
+            android:roundIcon="@mipmap/ic_launcher_light_blue"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Cyan"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_cyan"
+            android:roundIcon="@mipmap/ic_launcher_cyan"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Teal"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_teal"
+            android:roundIcon="@mipmap/ic_launcher_teal"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Green"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_green"
+            android:roundIcon="@mipmap/ic_launcher_green"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Light_green"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_light_green"
+            android:roundIcon="@mipmap/ic_launcher_light_green"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Lime"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_lime"
+            android:roundIcon="@mipmap/ic_launcher_lime"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Yellow"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_yellow"
+            android:roundIcon="@mipmap/ic_launcher_yellow"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Amber"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_amber"
+            android:roundIcon="@mipmap/ic_launcher_amber"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Deep_orange"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_deep_orange"
+            android:roundIcon="@mipmap/ic_launcher_deep_orange"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Brown"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_brown"
+            android:roundIcon="@mipmap/ic_launcher_brown"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Blue_grey"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_blue_grey"
+            android:roundIcon="@mipmap/ic_launcher_blue_grey"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+
+        <activity-alias
+            android:name=".activities.SplashActivity.Grey_black"
+            android:enabled="false"
+            android:icon="@mipmap/ic_launcher_grey_black"
+            android:roundIcon="@mipmap/ic_launcher_grey_black"
+            android:targetActivity=".activities.SplashActivity">
+
+            <intent-filter>
+                <action android:name="android.intent.action.MAIN"/>
+                <category android:name="android.intent.category.LAUNCHER"/>
+            </intent-filter>
+        </activity-alias>
+    </application>
+</manifest>
diff --git a/app/src/main/assets/algeria.ics b/app/src/main/assets/algeria.ics
new file mode 100644
index 0000000000000000000000000000000000000000..aba9cc5d577c3165b468e643c244de7cd8318069
--- /dev/null
+++ b/app/src/main/assets/algeria.ics
@@ -0,0 +1,34 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Revolutionary Day
+UID:c01410fe-c524-46bd-853e-5e0f396cd735
+DTSTART;VALUE=DATE:19541101
+DTEND;VALUE=DATE:19541102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Independence Day
+UID:15f94b62-fc7e-4328-9455-5b910e1b00e4
+DTSTART;VALUE=DATE:19620705
+DTEND;VALUE=DATE:19620706
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year's Day
+UID:25a90d5e-8bcc-4c4f-b759-c57ad5d6a8f3
+DTSTART;VALUE=DATE:20070101
+DTEND;VALUE=DATE:20070102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Labor Day
+UID:8a873eed-fb68-4397-ae3d-24729443f8db
+DTSTART;VALUE=DATE:20070501
+DTEND;VALUE=DATE:20070502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/argentina.ics b/app/src/main/assets/argentina.ics
new file mode 100644
index 0000000000000000000000000000000000000000..59aa28a6a632e041a9f018413ad0544fe1909ec4
--- /dev/null
+++ b/app/src/main/assets/argentina.ics
@@ -0,0 +1,172 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Año Nuevo
+UID:Argentina1
+DTSTART;VALUE=DATE:20170101
+DTEND;VALUE=DATE:20170102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de la Verdad y la Justicia
+UID:Argentina2
+DTSTART;VALUE=DATE:20170324
+DTEND;VALUE=DATE:20170325
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día del Veterano y los Caídos en Malvinas
+UID:Argentina3
+DTSTART;VALUE=DATE:20170402
+DTEND;VALUE=DATE:20170403
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día del Trabajador
+UID:Argentina3
+DTSTART;VALUE=DATE:20170501
+DTEND;VALUE=DATE:20170502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de la Revolución de Mayo
+UID:Argentina4
+DTSTART;VALUE=DATE:20170525
+DTEND;VALUE=DATE:20170526
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Paso a la Inmortalidad del Gral. Belgrano
+UID:Argentina5
+DTSTART;VALUE=DATE:20170620
+DTEND;VALUE=DATE:20170621
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de la Independencia
+UID:Argentina6
+DTSTART;VALUE=DATE:20170709
+DTEND;VALUE=DATE:20170710
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Inmaculada Concepción de María
+UID:Argentina7
+DTSTART;VALUE=DATE:20171208
+DTEND;VALUE=DATE:20171209
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Navidad
+UID:Argentina8
+DTSTART;VALUE=DATE:20171225
+DTEND;VALUE=DATE:20171226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Paso a la Inmortalidad del Gral. San Martín
+UID:Argentina9
+DTSTART;VALUE=DATE:20170821
+DTEND;VALUE=DATE:20170822
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día del Respeto a la Diversidad Cultural
+UID:Argentina10
+DTSTART;VALUE=DATE:20171016
+DTEND;VALUE=DATE:20171017
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de la Soberanía Nacional
+UID:Argentina11
+DTSTART;VALUE=DATE:20171120
+DTEND;VALUE=DATE:20171121
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:Argentina12
+DTSTART;VALUE=DATE:20180212
+DTEND;VALUE=DATE:20180214
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Viernes Santo
+UID:Argentina13
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Paso a la Inmortalidad del Gral. Güemes
+UID:Argentina14
+DTSTART;VALUE=DATE:20180617
+DTEND;VALUE=DATE:20180618
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día del Respeto a la Diversidad Cultural
+UID:Argentina15
+DTSTART;VALUE=DATE:20181015
+DTEND;VALUE=DATE:20181016
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de la Soberanía Nacional
+UID:Argentina16
+DTSTART;VALUE=DATE:20181119
+DTEND;VALUE=DATE:20181120
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:Argentina16
+DTSTART;VALUE=DATE:20190304
+DTEND;VALUE=DATE:20190306
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Viernes Santo
+UID:Argentina17
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Paso a la Inmortalidad del Gral. Güemes
+UID:Argentina18
+DTSTART;VALUE=DATE:20190617
+DTEND;VALUE=DATE:20190618
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Paso a la Inmortalidad del Gral. San Martín
+UID:Argentina19
+DTSTART;VALUE=DATE:20190817
+DTEND;VALUE=DATE:20190818
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día del Respeto a la Diversidad Cultural
+UID:Argentina19
+DTSTART;VALUE=DATE:20191012
+DTEND;VALUE=DATE:20191013
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de la Soberanía Nacional
+UID:Argentina20
+DTSTART;VALUE=DATE:20191118
+DTEND;VALUE=DATE:20191119
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/australia.ics b/app/src/main/assets/australia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..e728a0e1e162e240999b31a4265afa5d4d2b5b3b
--- /dev/null
+++ b/app/src/main/assets/australia.ics
@@ -0,0 +1,89 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:New Year's Day
+UID:aus-123
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Australia Day
+UID:aus-127
+DTSTART;VALUE=DATE:20180126
+DTEND;VALUE=DATE:20180127
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday
+UID:aus-129
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Saturday
+UID:aus-131
+DTSTART;VALUE=DATE:20180331
+DTEND;VALUE=DATE:20180401
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Sunday
+UID:aus-133
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday
+UID:aus-135
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Anzac Day
+UID:aus-137
+DTSTART;VALUE=DATE:20180425
+DTEND;VALUE=DATE:20180426
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Queen's Birthday
+UID:aus-139
+DTSTART;VALUE=DATE:20180611
+DTEND;VALUE=DATE:20180612
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Bank Holiday
+UID:aus-141
+DTSTART;VALUE=DATE:20180806
+DTEND;VALUE=DATE:20180806
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Labour Day
+UID:aus-143
+DTSTART;VALUE=DATE:20181001
+DTEND;VALUE=DATE:20181001
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas Day
+UID:aus-145
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boxing Day
+UID:aus-147
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/austria.ics b/app/src/main/assets/austria.ics
new file mode 100644
index 0000000000000000000000000000000000000000..91f132d938a706d5004195ce990f87fc4efeab52
--- /dev/null
+++ b/app/src/main/assets/austria.ics
@@ -0,0 +1,275 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-aut-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Neujahr
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20180106@kayaposoft.com
+DTSTART;VALUE=DATE:20180106
+DTEND;VALUE=DATE:20180107
+SUMMARY:Heilige Drei Könige
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20180402@kayaposoft.com
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+SUMMARY:Ostermontag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Staatsfeiertag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20180510@kayaposoft.com
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180511
+SUMMARY:Christi Himmelfahrt
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20180521@kayaposoft.com
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180522
+SUMMARY:Pfingstmontag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20180531@kayaposoft.com
+DTSTART;VALUE=DATE:20180531
+DTEND;VALUE=DATE:20180601
+SUMMARY:Fronleichnam
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20180815@kayaposoft.com
+DTSTART;VALUE=DATE:20180815
+DTEND;VALUE=DATE:20180816
+SUMMARY:Mariä Himmelfahrt
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20181026@kayaposoft.com
+DTSTART;VALUE=DATE:20181026
+DTEND;VALUE=DATE:20181027
+SUMMARY:Nationalfeiertag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20181101@kayaposoft.com
+DTSTART;VALUE=DATE:20181101
+DTEND;VALUE=DATE:20181102
+SUMMARY:Allerheiligen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20181208@kayaposoft.com
+DTSTART;VALUE=DATE:20181208
+DTEND;VALUE=DATE:20181209
+SUMMARY:Mariä Empfängnis
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Weihnachten
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:Stephanstag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Neujahr
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20190106@kayaposoft.com
+DTSTART;VALUE=DATE:20190106
+DTEND;VALUE=DATE:20190107
+SUMMARY:Heilige Drei Könige
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20190422@kayaposoft.com
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+SUMMARY:Ostermontag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Staatsfeiertag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20190530@kayaposoft.com
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190531
+SUMMARY:Christi Himmelfahrt
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20190610@kayaposoft.com
+DTSTART;VALUE=DATE:20190610
+DTEND;VALUE=DATE:20190611
+SUMMARY:Pfingstmontag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20190620@kayaposoft.com
+DTSTART;VALUE=DATE:20190620
+DTEND;VALUE=DATE:20190621
+SUMMARY:Fronleichnam
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20190815@kayaposoft.com
+DTSTART;VALUE=DATE:20190815
+DTEND;VALUE=DATE:20190816
+SUMMARY:Mariä Himmelfahrt
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20191026@kayaposoft.com
+DTSTART;VALUE=DATE:20191026
+DTEND;VALUE=DATE:20191027
+SUMMARY:Nationalfeiertag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20191101@kayaposoft.com
+DTSTART;VALUE=DATE:20191101
+DTEND;VALUE=DATE:20191102
+SUMMARY:Allerheiligen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20191208@kayaposoft.com
+DTSTART;VALUE=DATE:20191208
+DTEND;VALUE=DATE:20191209
+SUMMARY:Mariä Empfängnis
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Weihnachten
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:Stephanstag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Neujahr
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20200106@kayaposoft.com
+DTSTART;VALUE=DATE:20200106
+DTEND;VALUE=DATE:20200107
+SUMMARY:Heilige Drei Könige
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20200413@kayaposoft.com
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+SUMMARY:Ostermontag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Staatsfeiertag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20200521@kayaposoft.com
+DTSTART;VALUE=DATE:20200521
+DTEND;VALUE=DATE:20200522
+SUMMARY:Christi Himmelfahrt
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20200601@kayaposoft.com
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+SUMMARY:Pfingstmontag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20200611@kayaposoft.com
+DTSTART;VALUE=DATE:20200611
+DTEND;VALUE=DATE:20200612
+SUMMARY:Fronleichnam
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20200815@kayaposoft.com
+DTSTART;VALUE=DATE:20200815
+DTEND;VALUE=DATE:20200816
+SUMMARY:Mariä Himmelfahrt
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20201026@kayaposoft.com
+DTSTART;VALUE=DATE:20201026
+DTEND;VALUE=DATE:20201027
+SUMMARY:Nationalfeiertag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20201101@kayaposoft.com
+DTSTART;VALUE=DATE:20201101
+DTEND;VALUE=DATE:20201102
+SUMMARY:Allerheiligen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20201208@kayaposoft.com
+DTSTART;VALUE=DATE:20201208
+DTEND;VALUE=DATE:20201209
+SUMMARY:Mariä Empfängnis
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Weihnachten
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-aut-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:Stephanstag
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/belgium.ics b/app/src/main/assets/belgium.ics
new file mode 100644
index 0000000000000000000000000000000000000000..c322031cc3979b13c3541c9c7dade090bb5891b1
--- /dev/null
+++ b/app/src/main/assets/belgium.ics
@@ -0,0 +1,312 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:HEMELVAART
+UID:f6c6b1c2-c886-4c44-a1d5-739f731b7c72
+DTSTART;VALUE=DATE:20170525
+DTEND;VALUE=DATE:20170526
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PINKSTEREN
+UID:ce980cca-ce88-41be-8dc2-1cffefff0ceb
+DTSTART;VALUE=DATE:20170604
+DTEND;VALUE=DATE:20170605
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PINKSTERENDAG
+UID:bb37cdf2-9b23-44f6-b18b-0d9258169403
+DTSTART;VALUE=DATE:20170605
+DTEND;VALUE=DATE:20170606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Aswoensdag
+UID:94b165dc-e0e6-416e-9033-a5c0862fbcf8
+DTSTART;VALUE=DATE:20180214
+DTEND;VALUE=DATE:20180215
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PASEN
+UID:be9c7fbc-42cd-4c74-b8a9-4f8f483849a4
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PAASDAG
+UID:fd50581a-c08e-4e75-a10d-08baf619203f
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:HEMELVAART
+UID:7d72a20d-83e7-4e6a-8ff2-261da27b03aa
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180511
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PINKSTEREN
+UID:9fdcd64d-6c28-44f3-826b-496b04631b2d
+DTSTART;VALUE=DATE:20180520
+DTEND;VALUE=DATE:20180521
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PINKSTERENDAG
+UID:74d25bb5-eae4-4fce-b56e-42383a9a25a1
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Aswoensdag
+UID:23e1b254-17c4-4f85-b789-8c63bce19afd
+DTSTART;VALUE=DATE:20190306
+DTEND;VALUE=DATE:20190307
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Valentijn
+UID:3130fc66-96e3-4a0e-81ac-6a5ecd4dfce3
+DTSTART;VALUE=DATE:20190314
+DTEND;VALUE=DATE:20190315
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PASEN
+UID:9042a06a-3004-4c9e-a419-729f066d831e
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PAASDAG
+UID:35098c0c-51d3-4ffc-abc4-2a2fc8e01a93
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:HEMELVAART
+UID:73e7dc8b-79de-49e3-b41c-b0943f57ff03
+DTSTART;VALUE=DATE:20190523
+DTEND;VALUE=DATE:20190524
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PINKSTEREN
+UID:ceb2d711-4529-4a7f-beca-c3a10eb1f647
+DTSTART;VALUE=DATE:20190602
+DTEND;VALUE=DATE:20190603
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PINKSTERENDAG
+UID:43b88e5d-3dba-4711-8b90-2e1b813ca7c3
+DTSTART;VALUE=DATE:20190603
+DTEND;VALUE=DATE:20190604
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Aswoensdag
+UID:722b7424-bada-41fc-8e32-cba3d93327f0
+DTSTART;VALUE=DATE:20200226
+DTEND;VALUE=DATE:20200227
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PASEN
+UID:02fa5cde-594d-4825-adb1-960f61ad9838
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PAASDAG
+UID:ff7a663e-46c6-4fdf-961c-e0cbc785c831
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:HEMELVAART
+UID:e0334a6a-767b-4957-8e4c-d61282c3f749
+DTSTART;VALUE=DATE:20200521
+DTEND;VALUE=DATE:20200522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PINKSTEREN
+UID:1a0795a2-827e-4b75-982d-de504c8915ae
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PINKSTERENDAG
+UID:315187d7-7183-4e7b-b5ed-dfcbb939797a
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Aswoensdag
+UID:00921b36-2bc1-46af-b31b-72c7a97c4798
+DTSTART;VALUE=DATE:20210217
+DTEND;VALUE=DATE:20210218
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PASEN
+UID:738e4e02-2d8b-4911-b0cd-88688685ffd5
+DTSTART;VALUE=DATE:20210404
+DTEND;VALUE=DATE:20210405
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PAASDAG
+UID:30c0954b-c8bf-4ea1-a125-42635e297e3f
+DTSTART;VALUE=DATE:20210405
+DTEND;VALUE=DATE:20210406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:HEMELVAART
+UID:cb19eb72-1981-40e1-bc35-a7430874f2f8
+DTSTART;VALUE=DATE:20210513
+DTEND;VALUE=DATE:20210514
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PINKSTEREN
+UID:a8820fe0-5dd5-4435-b3b1-6fe4153a4916
+DTSTART;VALUE=DATE:20210523
+DTEND;VALUE=DATE:20210524
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PINKSTERENDAG
+UID:115e66c0-4022-4e75-8910-17140957c587
+DTSTART;VALUE=DATE:20210524
+DTEND;VALUE=DATE:20210525
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Aswoensdag
+UID:e14de088-276e-420b-a5cf-fe50eda58a04
+DTSTART;VALUE=DATE:20220302
+DTEND;VALUE=DATE:20220303
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PASEN
+UID:6a9c5350-feeb-43c5-b48e-9270ccf5a59f
+DTSTART;VALUE=DATE:20220417
+DTEND;VALUE=DATE:20220418
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PAASDAG
+UID:9cc94126-e27c-4069-aaf7-82a22903ac9e
+DTSTART;VALUE=DATE:20220418
+DTEND;VALUE=DATE:20220419
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:HEMELVAART
+UID:464440b6-4cf6-45de-be8f-a1a453483a73
+DTSTART;VALUE=DATE:20220526
+DTEND;VALUE=DATE:20220527
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:PINKSTEREN
+UID:8f9f07ed-1ccf-4c8d-bdcc-e66bfe94023e
+DTSTART;VALUE=DATE:20220605
+DTEND;VALUE=DATE:20220606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2de PINKSTERENDAG
+UID:852878ae-bfae-4ff8-9743-21f43ffe531d
+DTSTART;VALUE=DATE:20220606
+DTEND;VALUE=DATE:20220607
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:NIEUWJAAR
+UID:e0cb8f81-dbb9-4235-a60d-123dd2c2ba52
+DTSTART;VALUE=DATE:20110101
+DTEND;VALUE=DATE:20110102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:FEEST VAN DE ARBEID
+UID:4c6330e2-a8f6-47f4-b983-5fa66b61e794
+DTSTART;VALUE=DATE:20110501
+DTEND;VALUE=DATE:20110502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Vlaamse feestdag
+UID:ab715718-0d44-4e0e-ba15-2542c2c2fe28
+DTSTART;VALUE=DATE:20110711
+DTEND;VALUE=DATE:20110712
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:NATIONALE FEESTDAG
+UID:915c6b06-ae23-4373-8554-c7298ea6954d
+DTSTART;VALUE=DATE:20110721
+DTEND;VALUE=DATE:20110722
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:ONZE LIEVE VROUW HEMELVAART
+UID:233bdc02-f75a-414f-9b94-4564f4446c09
+DTSTART;VALUE=DATE:20110815
+DTEND;VALUE=DATE:20110816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:ALLERHEILIGEN
+UID:de66e692-bffa-4b09-9dc6-565482e61db0
+DTSTART;VALUE=DATE:20111101
+DTEND;VALUE=DATE:20111102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:WAPENSTILSTAND
+UID:38a79322-a130-48a0-b83b-174cb8a5f933
+DTSTART;VALUE=DATE:20111111
+DTEND;VALUE=DATE:20111112
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:KERSTMIS
+UID:4f17a100-d003-4046-8c74-9d9d1c01ade0
+DTSTART;VALUE=DATE:20111225
+DTEND;VALUE=DATE:20111226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Valentijn
+UID:50111cbb-45eb-4010-a3cd-c098dda38c27
+DTSTART;VALUE=DATE:20120214
+DTEND;VALUE=DATE:20120215
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/bolivia.ics b/app/src/main/assets/bolivia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..2f6941ebf836420deadc5e8187d4a7ad6415439c
--- /dev/null
+++ b/app/src/main/assets/bolivia.ics
@@ -0,0 +1,197 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Corpus Christi
+UID:5188576b-eef7-477c-82bd-f84ab9ea16a4
+DTSTART;VALUE=DATE:20170615
+DTEND;VALUE=DATE:20170616
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:be1e70d3-1c36-45a0-85c9-1ac7ba9ac761
+DTSTART;VALUE=DATE:20180212
+DTEND;VALUE=DATE:20180213
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Martes de Ch'alla
+UID:9cb1e170-f0e6-4fd5-afc3-4ed4619a0811
+DTSTART;VALUE=DATE:20180213
+DTEND;VALUE=DATE:20180214
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Viernes Santo
+UID:7f88a260-94cf-4990-8422-7e9d5d0540e0
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi
+UID:05ce623c-e151-4656-9939-266624681df9
+DTSTART;VALUE=DATE:20180531
+DTEND;VALUE=DATE:20180601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:d3a0ca0f-47e5-437e-9ece-d8a71ae89d58
+DTSTART;VALUE=DATE:20190304
+DTEND;VALUE=DATE:20190305
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Martes de Ch'alla
+UID:6c5b7101-16b1-4b4f-906b-637c9bf311b2
+DTSTART;VALUE=DATE:20190305
+DTEND;VALUE=DATE:20190306
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Viernes Santo
+UID:78aa8b7b-6e4e-4896-b57f-26017c078db2
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi
+UID:40023221-0c8f-4470-a647-1a71f9e171f2
+DTSTART;VALUE=DATE:20190620
+DTEND;VALUE=DATE:20190621
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:960f012a-6e22-46e6-81fb-674d062536a3
+DTSTART;VALUE=DATE:20200224
+DTEND;VALUE=DATE:20200225
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Martes de Ch'alla
+UID:7bbfccc3-5ca2-4600-ae7d-da433c2ebead
+DTSTART;VALUE=DATE:20200225
+DTEND;VALUE=DATE:20200226
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Viernes Santo
+UID:e799bfee-65ef-460d-997c-be2dd5c4dadc
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi
+UID:05ab683f-bbb9-4ff3-874f-0bdb8c2a65bf
+DTSTART;VALUE=DATE:20200611
+DTEND;VALUE=DATE:20200612
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Año Nuevo
+UID:e2973a06-6aa6-4a87-95a9-7dacb21cb215
+DTSTART;VALUE=DATE:20100101
+DTEND;VALUE=DATE:20100102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Regional: Aniversario de Oruro
+UID:196cd97a-f4bd-4314-8544-44670fbebe2f
+DTSTART;VALUE=DATE:20100210
+DTEND;VALUE=DATE:20100211
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día del mar
+UID:880fb429-622c-42d4-b066-cc6128965df9
+DTSTART;VALUE=DATE:20100323
+DTEND;VALUE=DATE:20100324
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de Trabajador
+UID:5a1e937a-2180-44bb-b35f-fe1ee85700f2
+DTSTART;VALUE=DATE:20100501
+DTEND;VALUE=DATE:20100502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Regional: Aniversario de Chuquisaca
+UID:8c5e46b0-7691-4cb2-a053-55cb284880f8
+DTSTART;VALUE=DATE:20100525
+DTEND;VALUE=DATE:20100526
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Regional: Aniversario de La Paz
+UID:5e1a697f-7480-4e1b-8743-c460d07e2a65
+DTSTART;VALUE=DATE:20100716
+DTEND;VALUE=DATE:20100717
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de la Independencia
+UID:da99fb8b-1992-4759-8819-29862f25bd72
+DTSTART;VALUE=DATE:20100806
+DTEND;VALUE=DATE:20100807
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Regional: Aniversario de Cochambamba
+UID:e401e40e-52ff-433f-83f5-c1c7f6788b98
+DTSTART;VALUE=DATE:20100914
+DTEND;VALUE=DATE:20100915
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Regional: Aniversario de Santa Cruz de la Sierra
+UID:b926d2e2-d9d3-4f03-834b-eb74c86c54fa
+DTSTART:20100924T130000Z
+DTEND:20100924T140000Z
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Regional: Aniversario de Pando
+UID:f4f962d5-cd55-4a44-a63c-b97fc0f3327b
+DTSTART;VALUE=DATE:20101011
+DTEND;VALUE=DATE:20101012
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fiesta de Todos los Santos
+UID:75fe8dbd-a8f9-4dc7-9b4f-71fbeafadfe2
+DTSTART;VALUE=DATE:20101102
+DTEND;VALUE=DATE:20101103
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Regional: Aniversario de Potosí
+UID:3b0d3d17-fb0b-49ce-8d64-1f218b3b47a7
+DTSTART;VALUE=DATE:20101110
+DTEND;VALUE=DATE:20101111
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Navidad
+UID:53052b8b-9710-488f-84e4-e15a270a000f
+DTSTART;VALUE=DATE:20101225
+DTEND;VALUE=DATE:20101226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/brazil.ics b/app/src/main/assets/brazil.ics
new file mode 100644
index 0000000000000000000000000000000000000000..c58d4cbb450602af19ceb36a2d48cd4f63c1ac98
--- /dev/null
+++ b/app/src/main/assets/brazil.ics
@@ -0,0 +1,249 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Corpus Christi
+UID:e77eca83-871f-4ac8-97c2-0bca08ab9c2a
+DTSTART;VALUE=DATE:20170615
+DTEND;VALUE=DATE:20170616
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:8cd3cd18-1b75-4711-afe0-07ab4e81e51a
+DTSTART;VALUE=DATE:20180210
+DTEND;VALUE=DATE:20180211
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:6753cf0a-b94e-47a6-a81c-b683475664f4
+DTSTART;VALUE=DATE:20180211
+DTEND;VALUE=DATE:20180212
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:52504836-b825-475b-86dc-4f386edb3ba3
+DTSTART;VALUE=DATE:20180212
+DTEND;VALUE=DATE:20180213
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:a405d8d0-8c23-42f5-a32c-b08c8073c463
+DTSTART;VALUE=DATE:20180213
+DTEND;VALUE=DATE:20180214
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Cinzas
+UID:5077ddcf-ca4c-4207-abc4-301b7cfc5687
+DTSTART:20180213T230000Z
+DTEND:20180214T130000Z
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Paixão de Cristo
+UID:4bfa5f27-ceda-41d7-ba2e-b1650f0bea54
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Páscoa
+UID:369576b5-e46a-489f-9f8c-888f641b4aaf
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi
+UID:19e096e0-df92-4de5-ae80-7f00a61a6f4a
+DTSTART;VALUE=DATE:20180531
+DTEND;VALUE=DATE:20180601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:860a732f-4fb1-4b63-9814-d1f806315009
+DTSTART;VALUE=DATE:20190302
+DTEND;VALUE=DATE:20190303
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:35314a5e-5aa4-4790-96c2-55494a755396
+DTSTART;VALUE=DATE:20190303
+DTEND;VALUE=DATE:20190304
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:a8d07bcb-84bf-4ccc-815b-53a76a15ce16
+DTSTART;VALUE=DATE:20190304
+DTEND;VALUE=DATE:20190305
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:36ce5bf2-9e91-41be-99be-085091e44529
+DTSTART;VALUE=DATE:20190305
+DTEND;VALUE=DATE:20190306
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Cinzas
+UID:83252ad4-1440-485f-8692-0c7f414964f0
+DTSTART:20190305T230000Z
+DTEND:20190306T130000Z
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Paixão de Cristo
+UID:15a703bb-8974-4d74-a01a-8c6da88008b5
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Páscoa
+UID:6379f90b-af84-4acb-8e7f-a69a7e101d73
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi
+UID:891f9d34-9709-4fd6-86ff-072e08b03154
+DTSTART;VALUE=DATE:20190620
+DTEND;VALUE=DATE:20190621
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:3c44f372-514d-49dd-ba49-630b3c557fe5
+DTSTART;VALUE=DATE:20200222
+DTEND;VALUE=DATE:20200223
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:aeeee39d-c448-4722-bd7b-6d69f7abcf5e
+DTSTART;VALUE=DATE:20200223
+DTEND;VALUE=DATE:20200224
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:9515a760-be8f-450c-8182-2e1310fd2704
+DTSTART;VALUE=DATE:20200224
+DTEND;VALUE=DATE:20200225
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnaval
+UID:70900ae0-3da4-4099-8fed-2fd1f3d250a9
+DTSTART;VALUE=DATE:20200225
+DTEND;VALUE=DATE:20200226
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Cinzas
+UID:d3e200f1-e0dd-4219-b58a-61b1c00db20c
+DTSTART:20200225T230000Z
+DTEND:20200226T130000Z
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Paixão de Cristo
+UID:b1a8bf33-940e-42e0-a64c-c1dd3b7045a0
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Páscoa
+UID:6e639659-ee2f-4f52-ac39-49cabbf0cb8d
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi
+UID:14e309d9-2f87-4efc-a02b-d98f4dd0f9b7
+DTSTART;VALUE=DATE:20200611
+DTEND;VALUE=DATE:20200612
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Confraternização Universal
+UID:2a1776fa-da81-4bea-8d87-66f5862f7ba0
+DTSTART;VALUE=DATE:20090101
+DTEND;VALUE=DATE:20090102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Tiradentes
+UID:ad668d9a-72e1-498e-9279-3b55dcdf5de6
+DTSTART;VALUE=DATE:20090421
+DTEND;VALUE=DATE:20090422
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dia do Trabalho
+UID:768ebe6e-c46d-4493-aafc-c720f0a8196f
+DTSTART;VALUE=DATE:20090501
+DTEND;VALUE=DATE:20090502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Independência
+UID:984030a1-31bd-4bcb-bad5-624f64230b7e
+DTSTART;VALUE=DATE:20090907
+DTEND;VALUE=DATE:20090908
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Nossa Senhora de Aparecida
+UID:0527c464-4b54-4317-912f-10a2dbb69a7b
+DTSTART;VALUE=DATE:20091012
+DTEND;VALUE=DATE:20091013
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Finados
+UID:3fc1d5ae-c27b-4a80-a7c5-58136e8b645b
+DTSTART;VALUE=DATE:20091102
+DTEND;VALUE=DATE:20091103
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Proclamação da República
+UID:fec98fbf-1c5d-4c28-b3e5-a859b4357c0a
+DTSTART;VALUE=DATE:20091115
+DTEND;VALUE=DATE:20091116
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Natal
+UID:74237bec-45c5-4d08-9114-0897596e9fbd
+DTSTART;VALUE=DATE:20091225
+DTEND;VALUE=DATE:20091226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Véspera de Ano Novo
+UID:45cc471f-c2ea-4831-9327-e41d59f2598a
+DTSTART:20091231T130000Z
+DTEND:20091231T225500Z
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/canada.ics b/app/src/main/assets/canada.ics
new file mode 100644
index 0000000000000000000000000000000000000000..8baf33eeed73dec9c7443047440dfd8b17d7e6b8
--- /dev/null
+++ b/app/src/main/assets/canada.ics
@@ -0,0 +1,604 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Victoria Day (Most regions)
+UID:fb4e32a5-3312-4143-816f-07c1011712db
+DTSTART;VALUE=DATE:20170522
+DTEND;VALUE=DATE:20170523
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:National Aboriginal Day
+UID:5959a81d-63b7-41cb-acfc-bfd5f37c00ab
+DTSTART;VALUE=DATE:20170621
+DTEND;VALUE=DATE:20170622
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Canada Day
+UID:064e098c-1588-425b-a277-343aba7b7ec8
+DTSTART;VALUE=DATE:20170701
+DTEND;VALUE=DATE:20170702
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Canada Day (additional)
+UID:56c6d990-3818-449d-8ccc-8e4fbc5c20af
+DTSTART;VALUE=DATE:20170703
+DTEND;VALUE=DATE:20170704
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Civic/Provincial Day (Many regions)
+UID:5f09999c-1293-4674-ac50-677772c75c47
+DTSTART;VALUE=DATE:20170807
+DTEND;VALUE=DATE:20170808
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Labour Day (All)
+UID:d2699e03-7f9a-43f1-9795-eb4aa8ce0924
+DTSTART;VALUE=DATE:20170904
+DTEND;VALUE=DATE:20170905
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Thanksgiving Day (All)
+UID:cf27d4de-7658-4d2b-940d-c7787d1ab418
+DTSTART;VALUE=DATE:20171009
+DTEND;VALUE=DATE:20171010
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Halloween
+UID:61c81c44-7f53-4052-bcc4-02e7999a68c6
+DTSTART;VALUE=DATE:20171031
+DTEND;VALUE=DATE:20171101
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Remembrance Day (Most regions)
+UID:7f257f5d-d925-4e10-9ad7-2a6caedd7a6d
+DTSTART;VALUE=DATE:20171111
+DTEND;VALUE=DATE:20171112
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Anniversary of the Statute of Westminster
+UID:46e06aa6-dc2c-44e2-9acf-6bb3c3d8be0e
+DTSTART;VALUE=DATE:20171211
+DTEND;VALUE=DATE:20171212
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas
+UID:e86fd5df-a3a8-438e-980a-b79203d31181
+DTSTART;VALUE=DATE:20171225
+DTEND;VALUE=DATE:20171226
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boxing Day (Most regions)
+UID:e7e75f01-cf09-4252-a733-1221d4a2b2cc
+DTSTART;VALUE=DATE:20171226
+DTEND;VALUE=DATE:20171227
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year's Eve
+UID:a2c9e44c-073c-4a6d-a209-696ef200d7ea
+DTSTART;VALUE=DATE:20171231
+DTEND;VALUE=DATE:20180101
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year's Day
+UID:ec273493-1d41-4627-86f8-e62f55b56ae7
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Epiphany
+UID:90a7adab-3550-4076-83e0-55af716bd7ca
+DTSTART;VALUE=DATE:20180106
+DTEND;VALUE=DATE:20180107
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Groundhog Day
+UID:8e2537ca-9d3c-48fc-adf3-ecc4ac2308b5
+DTSTART;VALUE=DATE:20180202
+DTEND;VALUE=DATE:20180203
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Familiy Day (BC)
+UID:eb5348e9-4804-447a-8fcf-b0ace3a4498e
+DTSTART;VALUE=DATE:20180212
+DTEND;VALUE=DATE:20180213
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Valentine's Day
+UID:0d4aa9ea-5dce-477e-9ae0-32b557888d13
+DTSTART;VALUE=DATE:20180214
+DTEND;VALUE=DATE:20180215
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Familiy Day (AL\, ON\, SK)
+UID:d73973f7-f7ec-40fb-ad66-50cd1e5d75cc
+DTSTART;VALUE=DATE:20180219
+DTEND;VALUE=DATE:20180220
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Commonwealth Day
+UID:1e5663e7-3b00-4ff9-9164-d7861e9c73d6
+DTSTART;VALUE=DATE:20180312
+DTEND;VALUE=DATE:20180313
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. Patrick's Day
+UID:3ad74476-2205-4ef2-bcfc-ac819c847e4e
+DTSTART;VALUE=DATE:20180317
+DTEND;VALUE=DATE:20180318
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday
+UID:08112e3f-936a-4262-85fd-ce82403141aa
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Sunday
+UID:355c9356-2d43-4f5b-9536-037b3e698c85
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday
+UID:6331f30a-e396-4b7b-9d3f-b0263d3a1268
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Vimy Ridge Day
+UID:c32ac59d-0361-41c9-ba90-f756937b0e8e
+DTSTART;VALUE=DATE:20180409
+DTEND;VALUE=DATE:20180410
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Victoria Day (Most regions)
+UID:aaeb1072-d22b-42d5-ae05-74a37d14c72a
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:National Aboriginal Day
+UID:0427784d-5c3b-4600-8dec-5a02e704a2d0
+DTSTART;VALUE=DATE:20180621
+DTEND;VALUE=DATE:20180622
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Canada Day
+UID:c636e02b-d9ae-44cd-82f8-25f904047ad9
+DTSTART;VALUE=DATE:20180701
+DTEND;VALUE=DATE:20180702
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Canada Day (additional)
+UID:633730f9-d620-43c5-ad15-ae51f78a6d94
+DTSTART;VALUE=DATE:20180702
+DTEND;VALUE=DATE:20180703
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Civic/Provincial Day (Many regions)
+UID:4c0c2771-b82c-48f1-bfab-4b9d47d3e4f6
+DTSTART;VALUE=DATE:20180806
+DTEND;VALUE=DATE:20180807
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Labour Day (All)
+UID:e1df04ae-e20b-4de0-aa0a-1ab86ba93e0e
+DTSTART;VALUE=DATE:20180903
+DTEND;VALUE=DATE:20180904
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Thanksgiving Day (All)
+UID:3e89e0c7-9124-4682-805d-aac2155263d1
+DTSTART;VALUE=DATE:20181008
+DTEND;VALUE=DATE:20181009
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Halloween
+UID:9594d587-1064-4dda-ac18-2acdee4a2a74
+DTSTART;VALUE=DATE:20181031
+DTEND;VALUE=DATE:20181101
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Remembrance Day (Most regions)
+UID:5d4e0151-9991-4364-8277-b460fe3e1c94
+DTSTART;VALUE=DATE:20181111
+DTEND;VALUE=DATE:20181112
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Anniversary of the Statute of Westminster
+UID:f628782a-2734-4cc8-b231-17eab40a4410
+DTSTART;VALUE=DATE:20181211
+DTEND;VALUE=DATE:20181212
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas
+UID:d51b3879-6437-47bf-b9ef-5fce6cd3b5e9
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boxing Day (Most regions)
+UID:0ffe67f0-43d9-448b-941e-9b86e4e5ce0c
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year's Eve
+UID:9e98b0a9-ded3-4e4c-8718-5da44666508a
+DTSTART;VALUE=DATE:20181231
+DTEND;VALUE=DATE:20190101
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year's Day
+UID:61a5a6b9-152e-42d6-aee3-f0e314bf3045
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Epiphany
+UID:a4731227-98c5-42fb-890d-d11fc9921559
+DTSTART;VALUE=DATE:20190106
+DTEND;VALUE=DATE:20190107
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Groundhog Day
+UID:b8067f58-cfe4-4803-bfcf-ecd9f18a3477
+DTSTART;VALUE=DATE:20190202
+DTEND;VALUE=DATE:20190203
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Familiy Day (BC)
+UID:51c6de42-d9d9-470b-80a6-7235c4c323f8
+DTSTART;VALUE=DATE:20190211
+DTEND;VALUE=DATE:20190212
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Valentine's Day
+UID:6d1b6b67-3048-46ec-9739-35c7bef5fb52
+DTSTART;VALUE=DATE:20190214
+DTEND;VALUE=DATE:20190215
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Familiy Day (AL\, ON\, SK)
+UID:79937d85-f410-4b27-bf42-2c674cad3c85
+DTSTART;VALUE=DATE:20190218
+DTEND;VALUE=DATE:20190219
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Commonwealth Day
+UID:3a0a2d57-917a-443c-9a96-d7bbb0f718d2
+DTSTART;VALUE=DATE:20190311
+DTEND;VALUE=DATE:20190312
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. Patrick's Day
+UID:a7af1632-9c60-433e-a14e-b2fa7b63d0e4
+DTSTART;VALUE=DATE:20190317
+DTEND;VALUE=DATE:20190318
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Vimy Ridge Day
+UID:a4cce146-21d0-464f-aec0-e1932b7f4772
+DTSTART;VALUE=DATE:20190409
+DTEND;VALUE=DATE:20190410
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday
+UID:0d13bec4-08a3-4606-a2ca-0a3b2c925c01
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Sunday
+UID:5b2a608d-4de4-4e72-b8b5-3749dd63b30a
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday
+UID:60e4eb44-15e9-40ff-b2b7-8ce1abbc5ec1
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Victoria Day (Most regions)
+UID:d4eee053-5d5e-40cb-98bd-c83b562b7a34
+DTSTART;VALUE=DATE:20190520
+DTEND;VALUE=DATE:20190521
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:National Aboriginal Day
+UID:269e25f1-bdf9-497a-8efc-e58d444c4bc7
+DTSTART;VALUE=DATE:20190621
+DTEND;VALUE=DATE:20190622
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Canada Day
+UID:d5877ba9-4bd0-42f4-9983-6d9437034888
+DTSTART;VALUE=DATE:20190701
+DTEND;VALUE=DATE:20190702
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Civic/Provincial Day (Many regions)
+UID:efbbe042-a635-40ed-b744-ac3fabb4f663
+DTSTART;VALUE=DATE:20190805
+DTEND;VALUE=DATE:20190806
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Labour Day (All)
+UID:3a123d9f-96a3-4c16-8e1a-ed33bb36d780
+DTSTART;VALUE=DATE:20190902
+DTEND;VALUE=DATE:20190903
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Thanksgiving Day (All)
+UID:af10260b-a8ee-42fc-b75e-1ee1fbbb4066
+DTSTART;VALUE=DATE:20191014
+DTEND;VALUE=DATE:20191015
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Halloween
+UID:0ce3099a-974b-4a96-ab48-3ae573fe018b
+DTSTART;VALUE=DATE:20191031
+DTEND;VALUE=DATE:20191101
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Remembrance Day (Most regions)
+UID:fb3c7843-5278-4528-9188-7439c89522ce
+DTSTART;VALUE=DATE:20191111
+DTEND;VALUE=DATE:20191112
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Anniversary of the Statute of Westminster
+UID:5ee35f25-fb9c-4dad-b88e-7b7e1080e16a
+DTSTART;VALUE=DATE:20191211
+DTEND;VALUE=DATE:20191212
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas
+UID:1c12575d-a6ae-4c63-befb-94d44748438f
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boxing Day (Most regions)
+UID:54304aa4-e36e-4b33-9971-24033295af71
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year's Eve
+UID:c9787413-b10a-4083-9e07-e4e7fd33d629
+DTSTART;VALUE=DATE:20191231
+DTEND;VALUE=DATE:20200101
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year's Day
+UID:4031b73c-247a-4fd4-8d92-8fc9817d58c1
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Epiphany
+UID:539e3ede-a9ae-4c17-8a14-030e7530c1d7
+DTSTART;VALUE=DATE:20200106
+DTEND;VALUE=DATE:20200107
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Groundhog Day
+UID:03e53920-f7d4-4db0-882b-117e66e84f6b
+DTSTART;VALUE=DATE:20200202
+DTEND;VALUE=DATE:20200203
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Familiy Day (BC)
+UID:1af43ec4-5a83-4809-af66-c3c437392575
+DTSTART;VALUE=DATE:20200210
+DTEND;VALUE=DATE:20200211
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Valentine's Day
+UID:70b22ae5-ecb7-4052-a260-bb723ebdf46e
+DTSTART;VALUE=DATE:20200214
+DTEND;VALUE=DATE:20200215
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Familiy Day (AL\, ON\, SK)
+UID:5b3c08fc-4f6a-4b12-9f16-9d6d777b28db
+DTSTART;VALUE=DATE:20200217
+DTEND;VALUE=DATE:20200218
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Commonwealth Day
+UID:779eb141-bec4-42b4-828a-fec6aca0328b
+DTSTART;VALUE=DATE:20200309
+DTEND;VALUE=DATE:20200310
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. Patrick's Day
+UID:ad94f6ba-9e73-458d-abcd-eb60f6f7ab95
+DTSTART;VALUE=DATE:20200317
+DTEND;VALUE=DATE:20200318
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Vimy Ridge Day
+UID:c9bf7c30-acbe-4cbc-874f-a41e96c8d5e1
+DTSTART;VALUE=DATE:20200409
+DTEND;VALUE=DATE:20200410
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday
+UID:8a221b48-08fd-4827-ae0f-f546edac5344
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Sunday
+UID:4ee6bb8b-d47c-4585-9ef1-2e45bfc7fe52
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday
+UID:9e9c3674-4381-499b-912c-cb36a355fb1c
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Victoria Day (Most regions)
+UID:56062369-252e-47e8-ad7a-c85289573a07
+DTSTART;VALUE=DATE:20200518
+DTEND;VALUE=DATE:20200519
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:National Aboriginal Day
+UID:0ca16e6c-dab1-42e5-beed-304fd466533b
+DTSTART;VALUE=DATE:20200621
+DTEND;VALUE=DATE:20200622
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Canada Day
+UID:d7dae22b-d072-4498-9b3b-6df8a376141a
+DTSTART;VALUE=DATE:20200701
+DTEND;VALUE=DATE:20200702
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Civic/Provincial Day (Many regions)
+UID:b30d93b0-4ac2-46a9-b0a2-30e5a3fda0d3
+DTSTART;VALUE=DATE:20200803
+DTEND;VALUE=DATE:20200804
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Labour Day (All)
+UID:d2853b95-fe8a-4094-88ff-b899c70be1cc
+DTSTART;VALUE=DATE:20200907
+DTEND;VALUE=DATE:20200908
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Thanksgiving Day (All)
+UID:9626a25b-ee91-4c91-b080-dc4bd9aae125
+DTSTART;VALUE=DATE:20201012
+DTEND;VALUE=DATE:20201013
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Halloween
+UID:6b63b306-4462-4dd9-8dd8-a411ddb059ff
+DTSTART;VALUE=DATE:20201031
+DTEND;VALUE=DATE:20201101
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Remembrance Day (Most regions)
+UID:1f77d433-3fef-4ae3-9bcd-04505eac3bfe
+DTSTART;VALUE=DATE:20201111
+DTEND;VALUE=DATE:20201112
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Anniversary of the Statute of Westminster
+UID:1916284f-b2d3-463e-af76-f921f6b7863b
+DTSTART;VALUE=DATE:20201211
+DTEND;VALUE=DATE:20201212
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas
+UID:570de254-18f5-4065-9168-3daa97f0e5b4
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boxing Day (Most regions)
+UID:0fe42fdf-c342-4104-83d2-fd004eda8090
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year's Eve
+UID:ccb85a68-8a72-46e2-8484-8f9a2fd5a612
+DTSTART;VALUE=DATE:20201231
+DTEND;VALUE=DATE:20210101
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/china.ics b/app/src/main/assets/china.ics
new file mode 100644
index 0000000000000000000000000000000000000000..26f08e7a3614cb9894ce184a0dc867f7d8e58602
--- /dev/null
+++ b/app/src/main/assets/china.ics
@@ -0,0 +1,149 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-chn-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:元旦
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20180215@kayaposoft.com
+DTSTART;VALUE=DATE:20180215
+DTEND;VALUE=DATE:20180222
+SUMMARY:春节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20180405@kayaposoft.com
+DTSTART;VALUE=DATE:20180405
+DTEND;VALUE=DATE:20180408
+SUMMARY:清明节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20180429@kayaposoft.com
+DTSTART;VALUE=DATE:20180429
+DTEND;VALUE=DATE:20180502
+SUMMARY:劳动节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20180616@kayaposoft.com
+DTSTART;VALUE=DATE:20180616
+DTEND;VALUE=DATE:20180619
+SUMMARY:端午节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20180922@kayaposoft.com
+DTSTART;VALUE=DATE:20180922
+DTEND;VALUE=DATE:20180925
+SUMMARY:中秋节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20181001@kayaposoft.com
+DTSTART;VALUE=DATE:20181001
+DTEND;VALUE=DATE:20181008
+SUMMARY:国庆节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:元旦
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20190205@kayaposoft.com
+DTSTART;VALUE=DATE:20190205
+DTEND;VALUE=DATE:20190206
+SUMMARY:春节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20190405@kayaposoft.com
+DTSTART;VALUE=DATE:20190405
+DTEND;VALUE=DATE:20190406
+SUMMARY:清明节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:劳动节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20190607@kayaposoft.com
+DTSTART;VALUE=DATE:20190607
+DTEND;VALUE=DATE:20190608
+SUMMARY:端午节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20190913@kayaposoft.com
+DTSTART;VALUE=DATE:20190913
+DTEND;VALUE=DATE:20190914
+SUMMARY:中秋节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20191001@kayaposoft.com
+DTSTART;VALUE=DATE:20191001
+DTEND;VALUE=DATE:20191002
+SUMMARY:国庆节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:元旦
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20200125@kayaposoft.com
+DTSTART;VALUE=DATE:20200125
+DTEND;VALUE=DATE:20200126
+SUMMARY:春节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20200404@kayaposoft.com
+DTSTART;VALUE=DATE:20200404
+DTEND;VALUE=DATE:20200405
+SUMMARY:清明节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:劳动节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20200625@kayaposoft.com
+DTSTART;VALUE=DATE:20200625
+DTEND;VALUE=DATE:20200626
+SUMMARY:端午节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20201001@kayaposoft.com
+DTSTART;VALUE=DATE:20201001
+DTEND;VALUE=DATE:20201002
+SUMMARY:国庆节
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-chn-20201001-529562@kayaposoft.com
+DTSTART;VALUE=DATE:20201001
+DTEND;VALUE=DATE:20201002
+SUMMARY:中秋节
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/colombia.ics b/app/src/main/assets/colombia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..e7caf346442a0e0afb5118dfb987b3107013e8dd
--- /dev/null
+++ b/app/src/main/assets/colombia.ics
@@ -0,0 +1,422 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-col-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Año Nuevo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180108@kayaposoft.com
+DTSTART;VALUE=DATE:20180108
+DTEND;VALUE=DATE:20180109
+SUMMARY:Día de los Reyes Magos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180319@kayaposoft.com
+DTSTART;VALUE=DATE:20180319
+DTEND;VALUE=DATE:20180320
+SUMMARY:Día de San José
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180325@kayaposoft.com
+DTSTART;VALUE=DATE:20180325
+DTEND;VALUE=DATE:20180326
+SUMMARY:Domingo de Ramos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180329@kayaposoft.com
+DTSTART;VALUE=DATE:20180329
+DTEND;VALUE=DATE:20180330
+SUMMARY:Jueves Santo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180330@kayaposoft.com
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+SUMMARY:Viernes Santo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180401@kayaposoft.com
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+SUMMARY:Domingo de Pascuas o Resurrección
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Día del Trabajo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180514@kayaposoft.com
+DTSTART;VALUE=DATE:20180514
+DTEND;VALUE=DATE:20180515
+SUMMARY:Día de la Ascensión
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180604@kayaposoft.com
+DTSTART;VALUE=DATE:20180604
+DTEND;VALUE=DATE:20180605
+SUMMARY:Corpus Christi
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180611@kayaposoft.com
+DTSTART;VALUE=DATE:20180611
+DTEND;VALUE=DATE:20180612
+SUMMARY:Sagrado Corazón de Jesús
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180702@kayaposoft.com
+DTSTART;VALUE=DATE:20180702
+DTEND;VALUE=DATE:20180703
+SUMMARY:San Pedro y San Pablo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180720@kayaposoft.com
+DTSTART;VALUE=DATE:20180720
+DTEND;VALUE=DATE:20180721
+SUMMARY:Declaracion de la Independencia de Colombia
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180807@kayaposoft.com
+DTSTART;VALUE=DATE:20180807
+DTEND;VALUE=DATE:20180808
+SUMMARY:Batalla de Boyacá
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20180820@kayaposoft.com
+DTSTART;VALUE=DATE:20180820
+DTEND;VALUE=DATE:20180821
+SUMMARY:Asunción de la Virgen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20181015@kayaposoft.com
+DTSTART;VALUE=DATE:20181015
+DTEND;VALUE=DATE:20181016
+SUMMARY:Día de la Raza
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20181105@kayaposoft.com
+DTSTART;VALUE=DATE:20181105
+DTEND;VALUE=DATE:20181106
+SUMMARY:Día de todos los Santos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20181112@kayaposoft.com
+DTSTART;VALUE=DATE:20181112
+DTEND;VALUE=DATE:20181113
+SUMMARY:Independencia de Cartagena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20181208@kayaposoft.com
+DTSTART;VALUE=DATE:20181208
+DTEND;VALUE=DATE:20181209
+SUMMARY:Día de la Inmaculada Concepción
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Navidad
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Año Nuevo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190107@kayaposoft.com
+DTSTART;VALUE=DATE:20190107
+DTEND;VALUE=DATE:20190108
+SUMMARY:Día de los Reyes Magos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190325@kayaposoft.com
+DTSTART;VALUE=DATE:20190325
+DTEND;VALUE=DATE:20190326
+SUMMARY:Día de San José
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190414@kayaposoft.com
+DTSTART;VALUE=DATE:20190414
+DTEND;VALUE=DATE:20190415
+SUMMARY:Domingo de Ramos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190418@kayaposoft.com
+DTSTART;VALUE=DATE:20190418
+DTEND;VALUE=DATE:20190419
+SUMMARY:Jueves Santo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190419@kayaposoft.com
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+SUMMARY:Viernes Santo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190421@kayaposoft.com
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+SUMMARY:Domingo de Pascuas o Resurrección
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Día del Trabajo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190603@kayaposoft.com
+DTSTART;VALUE=DATE:20190603
+DTEND;VALUE=DATE:20190604
+SUMMARY:Día de la Ascensión
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190624@kayaposoft.com
+DTSTART;VALUE=DATE:20190624
+DTEND;VALUE=DATE:20190625
+SUMMARY:Corpus Christi
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190701@kayaposoft.com
+DTSTART;VALUE=DATE:20190701
+DTEND;VALUE=DATE:20190702
+SUMMARY:Sagrado Corazón de Jesús
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190701-289927@kayaposoft.com
+DTSTART;VALUE=DATE:20190701
+DTEND;VALUE=DATE:20190702
+SUMMARY:San Pedro y San Pablo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190720@kayaposoft.com
+DTSTART;VALUE=DATE:20190720
+DTEND;VALUE=DATE:20190721
+SUMMARY:Declaracion de la Independencia de Colombia
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190807@kayaposoft.com
+DTSTART;VALUE=DATE:20190807
+DTEND;VALUE=DATE:20190808
+SUMMARY:Batalla de Boyacá
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20190819@kayaposoft.com
+DTSTART;VALUE=DATE:20190819
+DTEND;VALUE=DATE:20190820
+SUMMARY:Asunción de la Virgen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20191014@kayaposoft.com
+DTSTART;VALUE=DATE:20191014
+DTEND;VALUE=DATE:20191015
+SUMMARY:Día de la Raza
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20191104@kayaposoft.com
+DTSTART;VALUE=DATE:20191104
+DTEND;VALUE=DATE:20191105
+SUMMARY:Día de todos los Santos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20191111@kayaposoft.com
+DTSTART;VALUE=DATE:20191111
+DTEND;VALUE=DATE:20191112
+SUMMARY:Independencia de Cartagena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20191208@kayaposoft.com
+DTSTART;VALUE=DATE:20191208
+DTEND;VALUE=DATE:20191209
+SUMMARY:Día de la Inmaculada Concepción
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Navidad
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Año Nuevo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200106@kayaposoft.com
+DTSTART;VALUE=DATE:20200106
+DTEND;VALUE=DATE:20200107
+SUMMARY:Día de los Reyes Magos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200323@kayaposoft.com
+DTSTART;VALUE=DATE:20200323
+DTEND;VALUE=DATE:20200324
+SUMMARY:Día de San José
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200405@kayaposoft.com
+DTSTART;VALUE=DATE:20200405
+DTEND;VALUE=DATE:20200406
+SUMMARY:Domingo de Ramos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200409@kayaposoft.com
+DTSTART;VALUE=DATE:20200409
+DTEND;VALUE=DATE:20200410
+SUMMARY:Jueves Santo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200410@kayaposoft.com
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+SUMMARY:Viernes Santo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200412@kayaposoft.com
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+SUMMARY:Domingo de Pascuas o Resurrección
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Día del Trabajo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200525@kayaposoft.com
+DTSTART;VALUE=DATE:20200525
+DTEND;VALUE=DATE:20200526
+SUMMARY:Día de la Ascensión
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200615@kayaposoft.com
+DTSTART;VALUE=DATE:20200615
+DTEND;VALUE=DATE:20200616
+SUMMARY:Corpus Christi
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200622@kayaposoft.com
+DTSTART;VALUE=DATE:20200622
+DTEND;VALUE=DATE:20200623
+SUMMARY:Sagrado Corazón de Jesús
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200629@kayaposoft.com
+DTSTART;VALUE=DATE:20200629
+DTEND;VALUE=DATE:20200630
+SUMMARY:San Pedro y San Pablo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200720@kayaposoft.com
+DTSTART;VALUE=DATE:20200720
+DTEND;VALUE=DATE:20200721
+SUMMARY:Declaracion de la Independencia de Colombia
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200807@kayaposoft.com
+DTSTART;VALUE=DATE:20200807
+DTEND;VALUE=DATE:20200808
+SUMMARY:Batalla de Boyacá
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20200817@kayaposoft.com
+DTSTART;VALUE=DATE:20200817
+DTEND;VALUE=DATE:20200818
+SUMMARY:Asunción de la Virgen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20201012@kayaposoft.com
+DTSTART;VALUE=DATE:20201012
+DTEND;VALUE=DATE:20201013
+SUMMARY:Día de la Raza
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20201102@kayaposoft.com
+DTSTART;VALUE=DATE:20201102
+DTEND;VALUE=DATE:20201103
+SUMMARY:Día de todos los Santos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20201116@kayaposoft.com
+DTSTART;VALUE=DATE:20201116
+DTEND;VALUE=DATE:20201117
+SUMMARY:Independencia de Cartagena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20201208@kayaposoft.com
+DTSTART;VALUE=DATE:20201208
+DTEND;VALUE=DATE:20201209
+SUMMARY:Día de la Inmaculada Concepción
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-col-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Navidad
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/croatia.ics b/app/src/main/assets/croatia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..fc9b894f9e65050b930276f1564c297ba50483a4
--- /dev/null
+++ b/app/src/main/assets/croatia.ics
@@ -0,0 +1,296 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-hrv-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20180106@kayaposoft.com
+DTSTART;VALUE=DATE:20180106
+DTEND;VALUE=DATE:20180107
+SUMMARY:Bogojavljanje ili Sveta tri kralja
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20180401@kayaposoft.com
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+SUMMARY:Uskrs
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20180402@kayaposoft.com
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+SUMMARY:Uskrsni ponedjeljak
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Praznik rada
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20180531@kayaposoft.com
+DTSTART;VALUE=DATE:20180531
+DTEND;VALUE=DATE:20180601
+SUMMARY:Tijelovo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20180622@kayaposoft.com
+DTSTART;VALUE=DATE:20180622
+DTEND;VALUE=DATE:20180623
+SUMMARY:Dan antifašističke borbe
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20180625@kayaposoft.com
+DTSTART;VALUE=DATE:20180625
+DTEND;VALUE=DATE:20180626
+SUMMARY:Dan državnosti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20180805@kayaposoft.com
+DTSTART;VALUE=DATE:20180805
+DTEND;VALUE=DATE:20180806
+SUMMARY:Dan pobjede i domovinske zahvalnosti i Dan hrvatskih branitelja
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20180815@kayaposoft.com
+DTSTART;VALUE=DATE:20180815
+DTEND;VALUE=DATE:20180816
+SUMMARY:Velika Gospa
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20181008@kayaposoft.com
+DTSTART;VALUE=DATE:20181008
+DTEND;VALUE=DATE:20181009
+SUMMARY:Dan neovisnosti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20181101@kayaposoft.com
+DTSTART;VALUE=DATE:20181101
+DTEND;VALUE=DATE:20181102
+SUMMARY:Svi sveti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Božić
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:Prvi dan po Božiću\, Sveti Stjepan
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20190106@kayaposoft.com
+DTSTART;VALUE=DATE:20190106
+DTEND;VALUE=DATE:20190107
+SUMMARY:Bogojavljanje ili Sveta tri kralja
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20190421@kayaposoft.com
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+SUMMARY:Uskrs
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20190422@kayaposoft.com
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+SUMMARY:Uskrsni ponedjeljak
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Praznik rada
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20190620@kayaposoft.com
+DTSTART;VALUE=DATE:20190620
+DTEND;VALUE=DATE:20190621
+SUMMARY:Tijelovo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20190622@kayaposoft.com
+DTSTART;VALUE=DATE:20190622
+DTEND;VALUE=DATE:20190623
+SUMMARY:Dan antifašističke borbe
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20190625@kayaposoft.com
+DTSTART;VALUE=DATE:20190625
+DTEND;VALUE=DATE:20190626
+SUMMARY:Dan državnosti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20190805@kayaposoft.com
+DTSTART;VALUE=DATE:20190805
+DTEND;VALUE=DATE:20190806
+SUMMARY:Dan pobjede i domovinske zahvalnosti i Dan hrvatskih branitelja
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20190815@kayaposoft.com
+DTSTART;VALUE=DATE:20190815
+DTEND;VALUE=DATE:20190816
+SUMMARY:Velika Gospa
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20191008@kayaposoft.com
+DTSTART;VALUE=DATE:20191008
+DTEND;VALUE=DATE:20191009
+SUMMARY:Dan neovisnosti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20191101@kayaposoft.com
+DTSTART;VALUE=DATE:20191101
+DTEND;VALUE=DATE:20191102
+SUMMARY:Svi sveti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Božić
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:Prvi dan po Božiću\, Sveti Stjepan
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20200106@kayaposoft.com
+DTSTART;VALUE=DATE:20200106
+DTEND;VALUE=DATE:20200107
+SUMMARY:Bogojavljanje ili Sveta tri kralja
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20200412@kayaposoft.com
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+SUMMARY:Uskrs
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20200413@kayaposoft.com
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+SUMMARY:Uskrsni ponedjeljak
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Praznik rada
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20200611@kayaposoft.com
+DTSTART;VALUE=DATE:20200611
+DTEND;VALUE=DATE:20200612
+SUMMARY:Tijelovo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20200622@kayaposoft.com
+DTSTART;VALUE=DATE:20200622
+DTEND;VALUE=DATE:20200623
+SUMMARY:Dan antifašističke borbe
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20200625@kayaposoft.com
+DTSTART;VALUE=DATE:20200625
+DTEND;VALUE=DATE:20200626
+SUMMARY:Dan državnosti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20200805@kayaposoft.com
+DTSTART;VALUE=DATE:20200805
+DTEND;VALUE=DATE:20200806
+SUMMARY:Dan pobjede i domovinske zahvalnosti i Dan hrvatskih branitelja
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20200815@kayaposoft.com
+DTSTART;VALUE=DATE:20200815
+DTEND;VALUE=DATE:20200816
+SUMMARY:Velika Gospa
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20201008@kayaposoft.com
+DTSTART;VALUE=DATE:20201008
+DTEND;VALUE=DATE:20201009
+SUMMARY:Dan neovisnosti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20201101@kayaposoft.com
+DTSTART;VALUE=DATE:20201101
+DTEND;VALUE=DATE:20201102
+SUMMARY:Svi sveti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Božić
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-hrv-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:Prvi dan po Božiću\, Sveti Stjepan
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/czech.ics b/app/src/main/assets/czech.ics
new file mode 100644
index 0000000000000000000000000000000000000000..b10d57c029a5605693e309507167153632671513
--- /dev/null
+++ b/app/src/main/assets/czech.ics
@@ -0,0 +1,140 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Velký pátek
+UID:d86dcd28-cbc3-49ec-b3da-6f757f086374
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velikonoční pondělí
+UID:c4da31e7-e895-4fbc-b334-6e007c6ca092
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velký pátek
+UID:0212291d-f56f-4a15-afa4-e3c5a950a166
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velikonoční pondělí
+UID:678aff5b-e30b-4a54-a211-0f047c1e3767
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velký pátek
+UID:4d28e75f-2c33-4435-92fe-793e1dd93a97
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velikonoční pondělí
+UID:352d8746-4d90-4443-b3fc-e572052f7a20
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Štědrý den
+UID:a56cc74b-7a5b-4848-9b3f-b6b729b682ba
+DTSTART;VALUE=DATE:20071224
+DTEND;VALUE=DATE:20071225
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:1. svátek vánoční
+UID:b4cfcb30-8041-4244-91bb-9af9954c5b2d
+DTSTART;VALUE=DATE:20071225
+DTEND;VALUE=DATE:20071226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. svátek vánoční
+UID:f1381245-0442-9a41-9eb3-43ab84b148e2
+DTSTART;VALUE=DATE:20071226
+DTEND;VALUE=DATE:20071227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Nový rok
+UID:c92e67c1-1319-ad4d-9e47-b078c82732ae
+DTSTART;VALUE=DATE:20080101
+DTEND;VALUE=DATE:20080102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Den obnovy samostatného českého státu (1993)
+UID:aca364cd-7732-0d40-bddc-8951284a8008
+DTSTART;VALUE=DATE:20080101
+DTEND;VALUE=DATE:20080102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Svátek práce
+UID:520f666b-fe72-a146-b6e8-a68036f8b09f
+DTSTART;VALUE=DATE:20080501
+DTEND;VALUE=DATE:20080502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Den vítězství (1945)
+UID:99803396-7b1d-4745-a5f0-df95188d6555
+DTSTART;VALUE=DATE:20080508
+DTEND;VALUE=DATE:20080509
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Den slovanských věrozvěstů Cyrila a Metoděje (863)
+UID:34e10e5b-b11a-5044-a9f2-7e0e45f32117
+DTSTART;VALUE=DATE:20080705
+DTEND;VALUE=DATE:20080706
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Den upálení mistra Jana Husa (1415)
+UID:9886a881-7eac-7e43-bb8f-3a0def75a8c9
+DTSTART;VALUE=DATE:20080706
+DTEND;VALUE=DATE:20080707
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Den české státnosti
+UID:38aef6bb-4646-5f48-aba5-c12481cc6b8f
+DTSTART;VALUE=DATE:20080928
+DTEND;VALUE=DATE:20080929
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Den vzniku samostatného československého státu (1918)
+UID:3f5df1be-1028-524d-9e1d-4e4bff4c4d48
+DTSTART;VALUE=DATE:20081028
+DTEND;VALUE=DATE:20081029
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Den boje za svobodu a demokracii
+UID:7233642b-1f2d-4442-befc-fa6ce63daf0f
+DTSTART;VALUE=DATE:20081117
+DTEND;VALUE=DATE:20081118
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/denmark.ics b/app/src/main/assets/denmark.ics
new file mode 100644
index 0000000000000000000000000000000000000000..ca7d095ef3376e4daebb1e57ea746b752446a344
--- /dev/null
+++ b/app/src/main/assets/denmark.ics
@@ -0,0 +1,254 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-dnk-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Nytårsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20180325@kayaposoft.com
+DTSTART;VALUE=DATE:20180325
+DTEND;VALUE=DATE:20180326
+SUMMARY:Palmesøndag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20180329@kayaposoft.com
+DTSTART;VALUE=DATE:20180329
+DTEND;VALUE=DATE:20180330
+SUMMARY:Skærtorsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20180330@kayaposoft.com
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+SUMMARY:Langfredag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20180401@kayaposoft.com
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+SUMMARY:1. Påskedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20180402@kayaposoft.com
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+SUMMARY:2. Påskedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20180427@kayaposoft.com
+DTSTART;VALUE=DATE:20180427
+DTEND;VALUE=DATE:20180428
+SUMMARY:Store Bededag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20180510@kayaposoft.com
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180511
+SUMMARY:Kristi Himmelfartsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20180520@kayaposoft.com
+DTSTART;VALUE=DATE:20180520
+DTEND;VALUE=DATE:20180521
+SUMMARY:1. Pinsedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20180521@kayaposoft.com
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180522
+SUMMARY:2. Pinsedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:1. Juledag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:2. Juledag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Nytårsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20190414@kayaposoft.com
+DTSTART;VALUE=DATE:20190414
+DTEND;VALUE=DATE:20190415
+SUMMARY:Palmesøndag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20190418@kayaposoft.com
+DTSTART;VALUE=DATE:20190418
+DTEND;VALUE=DATE:20190419
+SUMMARY:Skærtorsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20190419@kayaposoft.com
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+SUMMARY:Langfredag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20190421@kayaposoft.com
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+SUMMARY:1. Påskedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20190422@kayaposoft.com
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+SUMMARY:2. Påskedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20190517@kayaposoft.com
+DTSTART;VALUE=DATE:20190517
+DTEND;VALUE=DATE:20190518
+SUMMARY:Store Bededag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20190530@kayaposoft.com
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190531
+SUMMARY:Kristi Himmelfartsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20190609@kayaposoft.com
+DTSTART;VALUE=DATE:20190609
+DTEND;VALUE=DATE:20190610
+SUMMARY:1. Pinsedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20190610@kayaposoft.com
+DTSTART;VALUE=DATE:20190610
+DTEND;VALUE=DATE:20190611
+SUMMARY:2. Pinsedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:1. Juledag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:2. Juledag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Nytårsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20200405@kayaposoft.com
+DTSTART;VALUE=DATE:20200405
+DTEND;VALUE=DATE:20200406
+SUMMARY:Palmesøndag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20200409@kayaposoft.com
+DTSTART;VALUE=DATE:20200409
+DTEND;VALUE=DATE:20200410
+SUMMARY:Skærtorsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20200410@kayaposoft.com
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+SUMMARY:Langfredag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20200412@kayaposoft.com
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+SUMMARY:1. Påskedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20200413@kayaposoft.com
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+SUMMARY:2. Påskedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20200508@kayaposoft.com
+DTSTART;VALUE=DATE:20200508
+DTEND;VALUE=DATE:20200509
+SUMMARY:Store Bededag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20200521@kayaposoft.com
+DTSTART;VALUE=DATE:20200521
+DTEND;VALUE=DATE:20200522
+SUMMARY:Kristi Himmelfartsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20200531@kayaposoft.com
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200601
+SUMMARY:1. Pinsedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20200601@kayaposoft.com
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+SUMMARY:2. Pinsedag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:1. Juledag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-dnk-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:2. Juledag
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/estonia.ics b/app/src/main/assets/estonia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..ffe6ebb2e556341bbdd2eac8e5494da8da2b91e6
--- /dev/null
+++ b/app/src/main/assets/estonia.ics
@@ -0,0 +1,254 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-est-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:uusaasta
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20180224@kayaposoft.com
+DTSTART;VALUE=DATE:20180224
+DTEND;VALUE=DATE:20180225
+SUMMARY:iseseisvuspäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20180330@kayaposoft.com
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+SUMMARY:suur reede
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20180401@kayaposoft.com
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+SUMMARY:ülestõusmispühade 1. püha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:kevadpüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20180520@kayaposoft.com
+DTSTART;VALUE=DATE:20180520
+DTEND;VALUE=DATE:20180521
+SUMMARY:nelipühade 1. püha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20180623@kayaposoft.com
+DTSTART;VALUE=DATE:20180623
+DTEND;VALUE=DATE:20180624
+SUMMARY:võidupüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20180624@kayaposoft.com
+DTSTART;VALUE=DATE:20180624
+DTEND;VALUE=DATE:20180625
+SUMMARY:jaanipäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20180820@kayaposoft.com
+DTSTART;VALUE=DATE:20180820
+DTEND;VALUE=DATE:20180821
+SUMMARY:taasiseseisvumispäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20181224@kayaposoft.com
+DTSTART;VALUE=DATE:20181224
+DTEND;VALUE=DATE:20181225
+SUMMARY:jõululaupäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:esimene jõulupüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:teine jõulupüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:uusaasta
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20190224@kayaposoft.com
+DTSTART;VALUE=DATE:20190224
+DTEND;VALUE=DATE:20190225
+SUMMARY:iseseisvuspäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20190419@kayaposoft.com
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+SUMMARY:suur reede
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20190421@kayaposoft.com
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+SUMMARY:ülestõusmispühade 1. püha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:kevadpüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20190609@kayaposoft.com
+DTSTART;VALUE=DATE:20190609
+DTEND;VALUE=DATE:20190610
+SUMMARY:nelipühade 1. püha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20190623@kayaposoft.com
+DTSTART;VALUE=DATE:20190623
+DTEND;VALUE=DATE:20190624
+SUMMARY:võidupüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20190624@kayaposoft.com
+DTSTART;VALUE=DATE:20190624
+DTEND;VALUE=DATE:20190625
+SUMMARY:jaanipäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20190820@kayaposoft.com
+DTSTART;VALUE=DATE:20190820
+DTEND;VALUE=DATE:20190821
+SUMMARY:taasiseseisvumispäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20191224@kayaposoft.com
+DTSTART;VALUE=DATE:20191224
+DTEND;VALUE=DATE:20191225
+SUMMARY:jõululaupäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:esimene jõulupüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:teine jõulupüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:uusaasta
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20200224@kayaposoft.com
+DTSTART;VALUE=DATE:20200224
+DTEND;VALUE=DATE:20200225
+SUMMARY:iseseisvuspäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20200410@kayaposoft.com
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+SUMMARY:suur reede
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20200412@kayaposoft.com
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+SUMMARY:ülestõusmispühade 1. püha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:kevadpüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20200531@kayaposoft.com
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200601
+SUMMARY:nelipühade 1. püha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20200623@kayaposoft.com
+DTSTART;VALUE=DATE:20200623
+DTEND;VALUE=DATE:20200624
+SUMMARY:võidupüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20200624@kayaposoft.com
+DTSTART;VALUE=DATE:20200624
+DTEND;VALUE=DATE:20200625
+SUMMARY:jaanipäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20200820@kayaposoft.com
+DTSTART;VALUE=DATE:20200820
+DTEND;VALUE=DATE:20200821
+SUMMARY:taasiseseisvumispäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20201224@kayaposoft.com
+DTSTART;VALUE=DATE:20201224
+DTEND;VALUE=DATE:20201225
+SUMMARY:jõululaupäev
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:esimene jõulupüha
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-est-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:teine jõulupüha
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/finland.ics b/app/src/main/assets/finland.ics
new file mode 100644
index 0000000000000000000000000000000000000000..da9373306450f110e2c1e0562cc65a92456dc2a3
--- /dev/null
+++ b/app/src/main/assets/finland.ics
@@ -0,0 +1,193 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Helatorstai
+UID:8aec24b7-7b83-4c8f-af5b-1e90671c8f8e
+DTSTART;VALUE=DATE:20170525
+DTEND;VALUE=DATE:20170526
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Helluntaipäivä
+UID:1477839d-af1f-4bbd-8be8-7a1bbc76a56f
+DTSTART;VALUE=DATE:20170604
+DTEND;VALUE=DATE:20170605
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Kesäpäivänseisaus
+UID:c4d192a3-64da-4e4b-be10-b99ac4fefee4
+DTSTART;VALUE=DATE:20170621
+DTEND;VALUE=DATE:20170622
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Juhannausaatto
+UID:de15440f-b1fa-4bb1-b088-e26e2af1e096
+DTSTART;VALUE=DATE:20170623
+DTEND;VALUE=DATE:20170624
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Juhannauspäivä
+UID:8401ad1e-0fb2-4454-9bd3-dc82229285fd
+DTSTART;VALUE=DATE:20170624
+DTEND;VALUE=DATE:20170625
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Syyspäiväntasaus
+UID:9e87d0dc-8773-4327-95b6-b4c221ffee39
+DTSTART;VALUE=DATE:20170922
+DTEND;VALUE=DATE:20170923
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pyhäinpäivä
+UID:5f4d0abe-0d16-4d0d-b6c2-ffafead89ba5
+DTSTART;VALUE=DATE:20171104
+DTEND;VALUE=DATE:20171105
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:1. adventtisunnuntai
+UID:c3af0841-a260-405c-8b6b-ea84ad48147a
+DTSTART;VALUE=DATE:20171203
+DTEND;VALUE=DATE:20171204
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Talvipäivänseisaus
+UID:7634cb1e-4854-47fe-8c8e-4c3264203d15
+DTSTART;VALUE=DATE:20171221
+DTEND;VALUE=DATE:20171222
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Naistenpäivä
+UID:55954496-9c99-4eeb-871e-b015d0f8ce40
+DTSTART;VALUE=DATE:20170308
+DTEND;VALUE=DATE:20170309
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ruotsalaisuuden päivä
+UID:ac081b74-6737-49a2-aeaf-4993eec75d0e
+DTSTART;VALUE=DATE:20171106
+DTEND;VALUE=DATE:20171107
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Uudenvuoden päivä
+UID:uuid1173904352072
+DTSTART;VALUE=DATE:20070101
+DTEND;VALUE=DATE:20070102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Loppiainen
+UID:uuid1173904370248
+DTSTART;VALUE=DATE:20070106
+DTEND;VALUE=DATE:20070107
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ystävänpäivä
+UID:3efb2264-6af2-4a14-a884-bd782c4db846
+DTSTART;VALUE=DATE:20070214
+DTEND;VALUE=DATE:20070215
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Vapunaatto
+UID:91312106-7a42-47e7-bb08-932df2e5bb8e
+DTSTART;VALUE=DATE:20070430
+DTEND;VALUE=DATE:20070501
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Vappu
+UID:uuid1173902771209
+DTSTART;VALUE=DATE:20070501
+DTEND;VALUE=DATE:20070502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Äitienpäivä
+UID:uuid1173904176169
+DTSTART;VALUE=DATE:20070513
+DTEND;VALUE=DATE:20070514
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Kesäaika päättyy
+UID:uuid1173903515119
+DTSTART;VALUE=DATE:20071028
+DTEND;VALUE=DATE:20071029
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Isänpäivä
+UID:uuid1173903607401
+DTSTART;VALUE=DATE:20071111
+DTEND;VALUE=DATE:20071112
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Itsenäisyyspäivä
+UID:uuid1173903722337
+DTSTART;VALUE=DATE:20071206
+DTEND;VALUE=DATE:20071207
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lucian päivä
+UID:7e288df4-770c-4899-a220-9da337943e5a
+DTSTART;VALUE=DATE:20071213
+DTEND;VALUE=DATE:20071214
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Jouluaatto
+UID:9cd77dfc-1995-43f0-9bcf-7a40f87363c7
+DTSTART;VALUE=DATE:20071224
+DTEND;VALUE=DATE:20071225
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Joulupäivä
+UID:uuid1173903783765
+DTSTART;VALUE=DATE:20071225
+DTEND;VALUE=DATE:20071226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Tapaninpäivä
+UID:uuid1173903799728
+DTSTART;VALUE=DATE:20071226
+DTEND;VALUE=DATE:20071227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Uudenvuodenaatto
+UID:c46a14c1-034a-4b37-85f0-5c4a42a31db7
+DTSTART;VALUE=DATE:20071231
+DTEND;VALUE=DATE:20080101
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/france.ics b/app/src/main/assets/france.ics
new file mode 100644
index 0000000000000000000000000000000000000000..a9fb9570b320121e440a9c6350edb9989663a971
--- /dev/null
+++ b/app/src/main/assets/france.ics
@@ -0,0 +1,353 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:7d5337af-6e82-4237-853e-548cf9f25bd8
+DTSTART;VALUE=DATE:20170525
+DTEND;VALUE=DATE:20170526
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:a4648b91-a16a-4093-b332-2632a8949a70
+DTSTART;VALUE=DATE:20170605
+DTEND;VALUE=DATE:20170606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:10b8aaa1-e75f-4c11-a944-73a823f3c401
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:15053b93-4499-4bce-b9c6-f0080cfe2a1b
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180511
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:7a5e41d9-6859-4630-93e0-f814126390c3
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:8c505518-4c70-46dd-94a7-55dc9fdd5610
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:a8af34b6-7f95-4e91-abe4-b103558c4c35
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190531
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:bc27d007-2cb6-4eaa-9f4e-4f58385d091d
+DTSTART;VALUE=DATE:20190610
+DTEND;VALUE=DATE:20190611
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:cbabb0ea-c3c3-4985-8ba9-3a8542a1f205
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:ce69f467-fdef-4777-b385-c788c5bc308c
+DTSTART;VALUE=DATE:20200521
+DTEND;VALUE=DATE:20200522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:581e247a-bb41-444a-8cf6-0e0dce156ac8
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:a46031fb-e7bc-4960-9c85-a63a175b0b36
+DTSTART;VALUE=DATE:20210405
+DTEND;VALUE=DATE:20210406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:e990aa82-1577-43f9-93e3-ec237ca4f7fe
+DTSTART;VALUE=DATE:20210513
+DTEND;VALUE=DATE:20210514
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:c7ca29f9-a334-4fdf-85b7-ae4550ebb44b
+DTSTART;VALUE=DATE:20210524
+DTEND;VALUE=DATE:20210525
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:5b932638-2257-4aa2-bc8c-38c3ab1b59f1
+DTSTART;VALUE=DATE:20220418
+DTEND;VALUE=DATE:20220419
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:ce454ef4-92b5-4fd2-8ffc-c1e21ab2d733
+DTSTART;VALUE=DATE:20220526
+DTEND;VALUE=DATE:20220527
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:25a7601d-9838-4ee7-9d0f-b4858b81316d
+DTSTART;VALUE=DATE:20220606
+DTEND;VALUE=DATE:20220607
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:32078edc-89d5-451b-a8d4-1dde70973e30
+DTSTART;VALUE=DATE:20230410
+DTEND;VALUE=DATE:20230411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:15f3215c-dda9-4790-879c-af1392586f26
+DTSTART;VALUE=DATE:20230518
+DTEND;VALUE=DATE:20230519
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:ffc60f7e-e362-4c4a-b9a5-0f7d381abf42
+DTSTART;VALUE=DATE:20230529
+DTEND;VALUE=DATE:20230530
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:655a8d83-65c5-4bf4-9efe-a8250e95bd65
+DTSTART;VALUE=DATE:20240401
+DTEND;VALUE=DATE:20240402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:1e426f49-f245-40f9-a8e7-2e55382dc02a
+DTSTART;VALUE=DATE:20240509
+DTEND;VALUE=DATE:20240510
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:e4e1467b-03ec-4be8-a7f5-eb69ea3b6393
+DTSTART;VALUE=DATE:20240520
+DTEND;VALUE=DATE:20240521
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:160f347b-f57b-4e2a-acf4-ba44ae824b7a
+DTSTART;VALUE=DATE:20250421
+DTEND;VALUE=DATE:20250422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:d6d5cb5d-7f54-4b65-8db7-cf365419f0e4
+DTSTART;VALUE=DATE:20250529
+DTEND;VALUE=DATE:20250530
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:41273995-1658-4199-b5df-036de11262e1
+DTSTART;VALUE=DATE:20250609
+DTEND;VALUE=DATE:20250610
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:9abc1e74-10f3-486e-8ad6-e9f0bde24149
+DTSTART;VALUE=DATE:20260406
+DTEND;VALUE=DATE:20260407
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:292f78a1-d1b7-47f9-b8cd-38e68ce3252c
+DTSTART;VALUE=DATE:20260514
+DTEND;VALUE=DATE:20260515
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:20f56e61-b349-40d8-a0ef-6691e5d1c925
+DTSTART;VALUE=DATE:20260525
+DTEND;VALUE=DATE:20260526
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:a1438e11-8fbf-4add-8014-90990689c23d
+DTSTART;VALUE=DATE:20270329
+DTEND;VALUE=DATE:20270330
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:e0457ba7-cfaa-4d53-b896-009470d5aa8f
+DTSTART;VALUE=DATE:20270506
+DTEND;VALUE=DATE:20270507
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:76eeeeea-cc44-4de1-a0b4-65c3ee5a5f9b
+DTSTART;VALUE=DATE:20270517
+DTEND;VALUE=DATE:20270518
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:0d842a5a-6910-4f5c-85ec-77692b5a2274
+DTSTART;VALUE=DATE:20280417
+DTEND;VALUE=DATE:20280418
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:2cd07b5d-cb7f-4f98-8d11-f1b5616ec4df
+DTSTART;VALUE=DATE:20280525
+DTEND;VALUE=DATE:20280526
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:66aad88b-b4b4-4cd0-af21-59d9cdd2aec1
+DTSTART;VALUE=DATE:20280605
+DTEND;VALUE=DATE:20280606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:cf809c66-e3de-45d0-88a8-01d7af53c087
+DTSTART;VALUE=DATE:20290402
+DTEND;VALUE=DATE:20290403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:0f345dc1-0612-46ca-8251-d8846ac1cc4e
+DTSTART;VALUE=DATE:20290510
+DTEND;VALUE=DATE:20290511
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:34024a8c-5f87-4306-a7b4-65edf4af50e1
+DTSTART;VALUE=DATE:20290521
+DTEND;VALUE=DATE:20290522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pâques
+UID:a407007c-23d5-429b-8f94-6429618a179c
+DTSTART;VALUE=DATE:20300422
+DTEND;VALUE=DATE:20300423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension
+UID:391f76ea-b6ff-414f-9e90-40559460399e
+DTSTART;VALUE=DATE:20300530
+DTEND;VALUE=DATE:20300531
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lundi de Pentecôte
+UID:d00c8d81-de37-4b74-a5f0-cb2ae97e952b
+DTSTART;VALUE=DATE:20300610
+DTEND;VALUE=DATE:20300611
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Jour de l'an
+UID:a727fa9d-ee37-425e-b237-1b5a37863c6a
+DTSTART;VALUE=DATE:20100101
+DTEND;VALUE=DATE:20100102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fête du Travail
+UID:d618a4c8-11a3-4793-b0da-46c824747f28
+DTSTART;VALUE=DATE:20100501
+DTEND;VALUE=DATE:20100502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fête de la Victoire
+UID:b9869ebf-e989-4198-9010-707839c11bb6
+DTSTART;VALUE=DATE:20100508
+DTEND;VALUE=DATE:20100509
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fête Nationale
+UID:53323e17-ea25-45b0-9040-741bedbcc5ba
+DTSTART;VALUE=DATE:20100714
+DTEND;VALUE=DATE:20100715
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Assomption
+UID:82fc9af4-3840-4af3-8cf6-012c71e72bfb
+DTSTART;VALUE=DATE:20100815
+DTEND;VALUE=DATE:20100816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Toussaint
+UID:3e233def-8956-41e3-a69c-423791c85513
+DTSTART;VALUE=DATE:20101101
+DTEND;VALUE=DATE:20101102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Armistice 1918
+UID:e161844e-feb4-4c54-b8fd-5806625b367c
+DTSTART;VALUE=DATE:20101111
+DTEND;VALUE=DATE:20101112
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Noël
+UID:8c53d7e9-0078-4fc0-b930-0793e5d30c12
+DTSTART;VALUE=DATE:20101225
+DTEND;VALUE=DATE:20101226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/germany.ics b/app/src/main/assets/germany.ics
new file mode 100644
index 0000000000000000000000000000000000000000..83ccec98166175ce3b303ba06f834d24ddcc5d5d
--- /dev/null
+++ b/app/src/main/assets/germany.ics
@@ -0,0 +1,537 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Christi Himmelfahrt
+UID:2bbc5f38-6d37-45f6-a015-027520fb4b26
+DTSTART;VALUE=DATE:20170525
+DTEND;VALUE=DATE:20170526
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pfingstmontag
+UID:0763c01f-245e-4ebf-acff-45597e999a01
+DTSTART;VALUE=DATE:20170605
+DTEND;VALUE=DATE:20170606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fronleichnam
+UID:015cf5bd-1737-414a-9ed5-54f12a26ea8c
+DTSTART;VALUE=DATE:20170615
+DTEND;VALUE=DATE:20170616
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Volkstrauertag
+UID:1d786d4e-0306-4171-a821-f570cfc23a1e
+DTSTART;VALUE=DATE:20171119
+DTEND;VALUE=DATE:20171120
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Totensonntag
+UID:3d292c6c-c482-4a6a-8ec3-18dae2c57aa0
+DTSTART;VALUE=DATE:20171126
+DTEND;VALUE=DATE:20171127
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Karfreitag
+UID:00fa1ea2-c91d-4d5b-89c5-1102259e1d24
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ostermontag
+UID:0ab12047-4716-4307-9d41-025db2534867
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christi Himmelfahrt
+UID:52384e2f-82a3-4318-98da-8d9ebc700d76
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180511
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pfingstmontag
+UID:01da1f59-2a95-4528-84b7-45c420d73130
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fronleichnam
+UID:67fb97d6-d8f6-46be-bcc0-4e7c515330fc
+DTSTART;VALUE=DATE:20180531
+DTEND;VALUE=DATE:20180601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Volkstrauertag
+UID:5d16b62d-e646-4fb9-b6c2-ade396b87ea7
+DTSTART;VALUE=DATE:20181118
+DTEND;VALUE=DATE:20181119
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Totensonntag
+UID:5ce3351e-8a46-4a6a-86c1-9d6a4691d69c
+DTSTART;VALUE=DATE:20181125
+DTEND;VALUE=DATE:20181126
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Karfreitag
+UID:0aaa7d21-c168-4dbb-a9ca-311c83c0840d
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ostermontag
+UID:b0300aa9-c14b-482c-b9d9-be81d9475123
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christi Himmelfahrt
+UID:54b3d09c-99f7-4f27-9253-d1fe8e358c50
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190531
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pfingstmontag
+UID:68095b69-e62a-4a0a-be4a-c9a68844a341
+DTSTART;VALUE=DATE:20190610
+DTEND;VALUE=DATE:20190611
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fronleichnam
+UID:b6b1feb6-a276-4601-bc55-ad41d61525dc
+DTSTART;VALUE=DATE:20190620
+DTEND;VALUE=DATE:20190621
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Volkstrauertag
+UID:de277d46-95e5-4345-be04-a3e37e4e9903
+DTSTART;VALUE=DATE:20191117
+DTEND;VALUE=DATE:20191118
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Totensonntag
+UID:55f73cbf-979c-4947-9245-1f39720f017a
+DTSTART;VALUE=DATE:20191124
+DTEND;VALUE=DATE:20191125
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Karfreitag
+UID:84fb596d-f62c-4f0c-be11-7d96e7883e97
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ostermontag
+UID:12013b62-6924-4457-89ff-3a8ba947bd5e
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christi Himmelfahrt
+UID:20b3805d-d325-478b-bcee-c8f1f87f7e2d
+DTSTART;VALUE=DATE:20200521
+DTEND;VALUE=DATE:20200522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pfingstmontag
+UID:279144b9-b220-4b4d-972b-97cf5ec2d3cf
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fronleichnam
+UID:d7546276-1150-44c1-98a2-dae1bb8116a5
+DTSTART;VALUE=DATE:20200611
+DTEND;VALUE=DATE:20200612
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Volkstrauertag
+UID:679fbcca-0d15-4d5e-8f8b-42d39c1a6365
+DTSTART;VALUE=DATE:20201115
+DTEND;VALUE=DATE:20201116
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Totensonntag
+UID:0cc4f56c-7eb8-4de7-ae2a-99b293b25f97
+DTSTART;VALUE=DATE:20201122
+DTEND;VALUE=DATE:20201123
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Karfreitag
+UID:4c8899f1-6694-4804-bdaf-dd13f837c8d5
+DTSTART;VALUE=DATE:20210402
+DTEND;VALUE=DATE:20210403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ostermontag
+UID:3ab2214a-92e4-4fca-87b6-77d92c142631
+DTSTART;VALUE=DATE:20210405
+DTEND;VALUE=DATE:20210406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christi Himmelfahrt
+UID:65fd8793-c12f-4c51-b392-a40b8b434fee
+DTSTART;VALUE=DATE:20210513
+DTEND;VALUE=DATE:20210514
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pfingstmontag
+UID:8a560aec-1ad3-4116-b0c0-f345345f8112
+DTSTART;VALUE=DATE:20210524
+DTEND;VALUE=DATE:20210525
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fronleichnam
+UID:c04a8136-ee52-432f-b744-b9add999d195
+DTSTART;VALUE=DATE:20210603
+DTEND;VALUE=DATE:20210604
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Volkstrauertag
+UID:40ee0ec1-9825-45a6-a535-521bcba47c92
+DTSTART;VALUE=DATE:20211114
+DTEND;VALUE=DATE:20211115
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Totensonntag
+UID:f0a7eadd-30e7-46c1-bce0-37616e68ac13
+DTSTART;VALUE=DATE:20211121
+DTEND;VALUE=DATE:20211122
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Karfreitag
+UID:018fdbdd-e2c5-48aa-bf6e-4f802d757d52
+DTSTART;VALUE=DATE:20220415
+DTEND;VALUE=DATE:20220416
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ostermontag
+UID:402857cd-1eb5-48ef-9b8c-fd0eb188dec6
+DTSTART;VALUE=DATE:20220418
+DTEND;VALUE=DATE:20220419
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christi Himmelfahrt
+UID:c90fd01f-5521-4973-b0bb-11c3b16dd9ff
+DTSTART;VALUE=DATE:20220526
+DTEND;VALUE=DATE:20220527
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pfingstmontag
+UID:a22fa187-185b-4cf1-93c1-82bdca14fd0e
+DTSTART;VALUE=DATE:20220606
+DTEND;VALUE=DATE:20220607
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fronleichnam
+UID:29b04dc6-23d4-4091-b7ab-168ff3b296f9
+DTSTART;VALUE=DATE:20220616
+DTEND;VALUE=DATE:20220617
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Volkstrauertag
+UID:46944530-cbdd-46c4-8d8c-796ee55127c8
+DTSTART;VALUE=DATE:20221113
+DTEND;VALUE=DATE:20221114
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Totensonntag
+UID:f3b740a9-5fe6-42f8-8ea1-0a24c3b7947c
+DTSTART;VALUE=DATE:20221120
+DTEND;VALUE=DATE:20221121
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Karfreitag
+UID:ffaf8199-f853-45c8-b635-5f0e302f13fe
+DTSTART;VALUE=DATE:20230407
+DTEND;VALUE=DATE:20230408
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ostermontag
+UID:bb40c59f-7f00-44b7-98fc-e5fd5e0c9c27
+DTSTART;VALUE=DATE:20230410
+DTEND;VALUE=DATE:20230411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christi Himmelfahrt
+UID:f91d0e50-3550-46f4-959e-4c0837d122b3
+DTSTART;VALUE=DATE:20230518
+DTEND;VALUE=DATE:20230519
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pfingstmontag
+UID:4eebf391-9bab-4c47-9828-9f102779600a
+DTSTART;VALUE=DATE:20230529
+DTEND;VALUE=DATE:20230530
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fronleichnam
+UID:915c704e-a4bc-427a-9e0a-1da455be901b
+DTSTART;VALUE=DATE:20230608
+DTEND;VALUE=DATE:20230609
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Volkstrauertag
+UID:c5bb509b-f206-4bd9-acbe-921c6607180c
+DTSTART;VALUE=DATE:20231119
+DTEND;VALUE=DATE:20231120
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Totensonntag
+UID:0eae032b-ae56-42ba-9d9b-42893d74dfb2
+DTSTART;VALUE=DATE:20231126
+DTEND;VALUE=DATE:20231127
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Karfreitag
+UID:179a8a7f-6ebc-427f-89c8-dfd87f770bf9
+DTSTART;VALUE=DATE:20240329
+DTEND;VALUE=DATE:20240330
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ostermontag
+UID:09d071fa-e352-474d-8984-12fdc76cb033
+DTSTART;VALUE=DATE:20240401
+DTEND;VALUE=DATE:20240402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christi Himmelfahrt
+UID:82a44164-d23c-44cf-b3c1-da1eabe1f397
+DTSTART;VALUE=DATE:20240509
+DTEND;VALUE=DATE:20240510
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pfingstmontag
+UID:aa76019e-b3b6-4488-8bbf-31dc09fb1764
+DTSTART;VALUE=DATE:20240520
+DTEND;VALUE=DATE:20240521
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fronleichnam
+UID:0d3c9c69-6871-4d18-806d-0be0279c723e
+DTSTART;VALUE=DATE:20240530
+DTEND;VALUE=DATE:20240531
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Volkstrauertag
+UID:08403872-2393-42bd-b1fb-ad5fac4f6f34
+DTSTART;VALUE=DATE:20241117
+DTEND;VALUE=DATE:20241118
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Totensonntag
+UID:546e46fb-ec99-4ddd-aa9d-6ec619b96dc0
+DTSTART;VALUE=DATE:20241124
+DTEND;VALUE=DATE:20241125
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Karfreitag
+UID:e9a51e52-0956-4d0f-be18-c5ce39dae024
+DTSTART;VALUE=DATE:20250418
+DTEND;VALUE=DATE:20250419
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ostermontag
+UID:457982d2-a038-49d2-9b27-6f9708a16206
+DTSTART;VALUE=DATE:20250421
+DTEND;VALUE=DATE:20250422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christi Himmelfahrt
+UID:0705f107-eef7-4929-ac93-a9d7a645e7f8
+DTSTART;VALUE=DATE:20250529
+DTEND;VALUE=DATE:20250530
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pfingstmontag
+UID:082092fe-3345-4652-b5f9-d5aeee66328f
+DTSTART;VALUE=DATE:20250609
+DTEND;VALUE=DATE:20250610
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fronleichnam
+UID:e6575a32-8845-4a0a-a00a-9f13654244e2
+DTSTART;VALUE=DATE:20250619
+DTEND;VALUE=DATE:20250620
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Volkstrauertag
+UID:2ca238e4-196f-4d18-bb0a-4658e7ab987f
+DTSTART;VALUE=DATE:20251116
+DTEND;VALUE=DATE:20251117
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Totensonntag
+UID:54c731a4-2052-44f7-be17-7976de70f144
+DTSTART;VALUE=DATE:20251123
+DTEND;VALUE=DATE:20251124
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Erster Advent
+UID:fc4cb35f-9128-43e9-a221-206f67d73e61
+DTSTART;VALUE=DATE:20251130
+DTEND;VALUE=DATE:20251201
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Zweiter Advent
+UID:9ff7d8d6-2237-41eb-b2a7-f47732452a14
+DTSTART;VALUE=DATE:20251207
+DTEND;VALUE=DATE:20251208
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dritter Advent
+UID:5a2a2659-1e7f-4efb-bdf1-fbfdfc2c6e22
+DTSTART;VALUE=DATE:20251214
+DTEND;VALUE=DATE:20251215
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Vierter Advent
+UID:99f53a1a-98e5-4640-ab07-b04b84f8128a
+DTSTART;VALUE=DATE:20251221
+DTEND;VALUE=DATE:20251222
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Neujahr
+UID:928286484
+DTSTART;VALUE=DATE:20060101
+DTEND;VALUE=DATE:20060102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Heilige drei Könige
+UID:917544590
+DTSTART;VALUE=DATE:20060106
+DTEND;VALUE=DATE:20060107
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Tag der Arbeit
+UID:999463355
+DTSTART;VALUE=DATE:20060501
+DTEND;VALUE=DATE:20060502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Friedensfest
+UID:942159081
+DTSTART;VALUE=DATE:20060808
+DTEND;VALUE=DATE:20060809
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Mariä Himmelfahrt
+UID:948278340
+DTSTART;VALUE=DATE:20060815
+DTEND;VALUE=DATE:20060816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Tag der Deutschen Einheit
+UID:932572589
+DTSTART;VALUE=DATE:20061003
+DTEND;VALUE=DATE:20061004
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Allerheiligen
+UID:970745861
+DTSTART;VALUE=DATE:20061101
+DTEND;VALUE=DATE:20061102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:1. Weihnachtstag
+UID:982967580
+DTSTART;VALUE=DATE:20061225
+DTEND;VALUE=DATE:20061226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. Weihnachtstag
+UID:984536863
+DTSTART;VALUE=DATE:20061226
+DTEND;VALUE=DATE:20061227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Silvester
+UID:97f269a0-c8d9-11da-b420-f5a1afe01740
+DTSTART;VALUE=DATE:20061231
+DTEND;VALUE=DATE:20070101
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/greece.ics b/app/src/main/assets/greece.ics
new file mode 100644
index 0000000000000000000000000000000000000000..eabf0797c64aca13d0fc7f4adf75fe1578e5ea84
--- /dev/null
+++ b/app/src/main/assets/greece.ics
@@ -0,0 +1,206 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Whit Sunday / Πεντηκοστή
+UID:dc317407-f92b-4394-924c-21f2ed0790f5
+DTSTART;VALUE=DATE:20170604
+DTEND;VALUE=DATE:20170605
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Whit Monday / Αγίου Πνεύματος
+UID:bc09b670-ce64-4d5e-b08b-1657f3bf6609
+DTSTART;VALUE=DATE:20170605
+DTEND;VALUE=DATE:20170606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Clean Monday / Καθαρά Δευτέρα
+UID:59e9368a-71e2-4a39-8649-a92edb333f2d
+DTSTART;VALUE=DATE:20180219
+DTEND;VALUE=DATE:20180220
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday / Μεγάλη Παρασκευή
+UID:cb9f7b8e-697f-4649-95af-888ef09ca98a
+DTSTART;VALUE=DATE:20180406
+DTEND;VALUE=DATE:20180407
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter / Κυριακή του Πάσχα
+UID:080d82b3-b4cb-4a04-ac64-f539091df094
+DTSTART;VALUE=DATE:20180408
+DTEND;VALUE=DATE:20180409
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday / Δευτέρα του Πάσχα
+UID:8e2bc347-ac8f-4ac3-9f8b-a29be0c3687f
+DTSTART;VALUE=DATE:20180409
+DTEND;VALUE=DATE:20180410
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Whit Sunday / Πεντηκοστή
+UID:1132473a-b88b-42f3-bbf8-68c506a6e26d
+DTSTART;VALUE=DATE:20180527
+DTEND;VALUE=DATE:20180528
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Whit Monday / Αγίου Πνεύματος
+UID:936a36ae-bb0a-4fee-af3d-b1d6208f19f5
+DTSTART;VALUE=DATE:20180528
+DTEND;VALUE=DATE:20180529
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Clean Monday / Καθαρά Δευτέρα
+UID:693b3ca3-596b-482c-97a7-10c7c95d5cdd
+DTSTART;VALUE=DATE:20190311
+DTEND;VALUE=DATE:20190312
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday / Μεγάλη Παρασκευή
+UID:40c8f0e9-6854-49f6-804e-94219c3a9fca
+DTSTART;VALUE=DATE:20190426
+DTEND;VALUE=DATE:20190427
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter / Κυριακή του Πάσχα
+UID:c1124c7f-63b8-478c-ac51-200f8e48aedd
+DTSTART;VALUE=DATE:20190428
+DTEND;VALUE=DATE:20190429
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday / Δευτέρα του Πάσχα
+UID:0fb9ca5d-e0bf-4fb1-a570-bd93234cc95c
+DTSTART;VALUE=DATE:20190429
+DTEND;VALUE=DATE:20190430
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Whit Sunday / Πεντηκοστή
+UID:029a1d55-8aba-461f-9e34-a09857a5dae3
+DTSTART;VALUE=DATE:20190616
+DTEND;VALUE=DATE:20190617
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Whit Monday / Αγίου Πνεύματος
+UID:18aba38e-9601-450e-bb63-fa4a4d31de2b
+DTSTART;VALUE=DATE:20190617
+DTEND;VALUE=DATE:20190618
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Clean Monday / Καθαρά Δευτέρα
+UID:97e896b3-668e-4292-a913-c444db021709
+DTSTART;VALUE=DATE:20200302
+DTEND;VALUE=DATE:20200303
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday / Μεγάλη Παρασκευή
+UID:74f313c2-736a-4933-aa27-9d28195b4b2a
+DTSTART;VALUE=DATE:20200417
+DTEND;VALUE=DATE:20200418
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter / Κυριακή του Πάσχα
+UID:ccb1bd58-fd97-4683-8402-f48cec64f783
+DTSTART;VALUE=DATE:20200419
+DTEND;VALUE=DATE:20200420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday / Δευτέρα του Πάσχα
+UID:25637128-1288-4414-a48d-ea38aab079e7
+DTSTART;VALUE=DATE:20200420
+DTEND;VALUE=DATE:20200421
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Whit Sunday / Πεντηκοστή
+UID:da332155-4867-4e77-941e-07833b2c2cc4
+DTSTART;VALUE=DATE:20200607
+DTEND;VALUE=DATE:20200608
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Whit Monday / Αγίου Πνεύματος
+UID:c6b4a8a0-3890-4395-940a-ee9fe0b11e71
+DTSTART;VALUE=DATE:20200608
+DTEND;VALUE=DATE:20200609
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year's Day / Πρωτοχρονιά
+UID:5ba562ab-44ac-45a7-87db-54cd663b74fd
+DTSTART;VALUE=DATE:20150101
+DTEND;VALUE=DATE:20150102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Theophany / Θεοφάνεια
+UID:a659e148-c272-42f6-97e7-290a9ed20968
+DTSTART;VALUE=DATE:20150106
+DTEND;VALUE=DATE:20150107
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Independance Day & Annunciation / Εικοστή Πέμπτη Μα
+UID:ef611b69-6e42-4307-87d1-3820a4742a34
+DTSTART;VALUE=DATE:20150325
+DTEND;VALUE=DATE:20150326
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Labour Day / Εργατική Πρωτομαγιά
+UID:00f6f15e-b797-4107-b573-3bb20872d5ba
+DTSTART;VALUE=DATE:20150501
+DTEND;VALUE=DATE:20150502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dormition of the Holy Virgin / Η Κοίμηση της Θεοτό
+UID:d04cfc4b-1c38-41e1-a760-85fb3efb7f42
+DTSTART;VALUE=DATE:20150815
+DTEND;VALUE=DATE:20150816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ochi Day / Ημέρα του Όχι
+UID:a0793322-42a0-431c-b785-f3c7be8b2c74
+DTSTART;VALUE=DATE:20151028
+DTEND;VALUE=DATE:20151029
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas / Χριστούγεννα
+UID:54b16d03-3aa7-4375-a6c3-53724e225254
+DTSTART;VALUE=DATE:20151225
+DTEND;VALUE=DATE:20151226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Glorifying of Mother God / Σύναξις Ὑπεραγίας Θε οτόκου Μαρίας
+UID:101f60fb-fa7f-4ad0-a5d8-a9ec39961ebd
+DTSTART;VALUE=DATE:20151226
+DTEND;VALUE=DATE:20151227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/hungary.ics b/app/src/main/assets/hungary.ics
new file mode 100644
index 0000000000000000000000000000000000000000..6f1a53adff99139be2631ae4586d57c8e0af995f
--- /dev/null
+++ b/app/src/main/assets/hungary.ics
@@ -0,0 +1,135 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Pünkösd hétfő
+UID:6f06bfd3-60ac-486a-be9f-c330018dfe49
+DTSTART;VALUE=DATE:20170604
+DTEND;VALUE=DATE:20170606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Téli időszámítás kezdete (-1 óra)
+UID:d5cea837-b0ee-493c-956b-2963dfd1315c
+DTSTART;VALUE=DATE:20171029
+DTEND;VALUE=DATE:20171030
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Húsvét hétfő
+UID:5cd5facb-f7d9-4153-8797-495812916e51
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pünkösd hétfő
+UID:e088e03d-a128-412d-b827-34da43884957
+DTSTART;VALUE=DATE:20180520
+DTEND;VALUE=DATE:20180522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Téli időszámítás kezdete (-1 óra)
+UID:0d1bf255-73f9-4567-b06b-4196f9529d5a
+DTSTART;VALUE=DATE:20181028
+DTEND;VALUE=DATE:20181029
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Húsvét hétfő
+UID:bfc2c84f-6da1-4df5-8323-6f306a7c5108
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pünkösd hétfő
+UID:64d72bd6-ee4c-49b2-b9e7-ee2fc372ba90
+DTSTART;VALUE=DATE:20190609
+DTEND;VALUE=DATE:20190611
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Téli időszámítás kezdete (-1 óra)
+UID:45c8899d-2450-4a95-acbf-e791562f3dd2
+DTSTART;VALUE=DATE:20191027
+DTEND;VALUE=DATE:20191028
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Húsvét hétfő
+UID:38cb1e79-0108-4541-a879-6cb23aa1f6ec
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pünkösd hétfő
+UID:d749aa68-923a-4e7d-8327-ab51df466c31
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200602
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Téli időszámítás kezdete (-1 óra)
+UID:a5ca89b5-a8aa-4b22-aff3-76b9ded8cca9
+DTSTART;VALUE=DATE:20201025
+DTEND;VALUE=DATE:20201026
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Az 1848-as forradalom ünnepe
+UID:511b80b5-2eb8-4853-b8d0-703244a4422d
+DTSTART;VALUE=DATE:20110315
+DTEND;VALUE=DATE:20110316
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Munka ünnepe
+UID:8f78816d-b921-4649-b1aa-bd90db45ffee
+DTSTART;VALUE=DATE:20110501
+DTEND;VALUE=DATE:20110502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Az 1956-os forradalom ünnepe
+UID:b2c09365-df7c-428c-a62b-82cdc1bdf59e
+DTSTART;VALUE=DATE:20111023
+DTEND;VALUE=DATE:20111024
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Mindenszentek
+UID:b72070c4-013a-4508-a8b3-da6352371a09
+DTSTART;VALUE=DATE:20111101
+DTEND;VALUE=DATE:20111102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Karácsony
+UID:aeea890f-70cc-448e-8306-52227c3f4df4
+DTSTART;VALUE=DATE:20111225
+DTEND;VALUE=DATE:20111227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Újév
+UID:7ec7e047-ba9b-46ad-bcd7-375780a63f00
+DTSTART;VALUE=DATE:20120101
+DTEND;VALUE=DATE:20120102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20200101
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Államalapítás ünnepe
+UID:3f0f897b-725d-4924-9014-6d93cd3fc45a
+DTSTART;VALUE=DATE:20120820
+DTEND;VALUE=DATE:20120821
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1;UNTIL=20201231
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/iceland.ics b/app/src/main/assets/iceland.ics
new file mode 100644
index 0000000000000000000000000000000000000000..3b79f5a9df1999b8cfb729be909e04ba2f18f36d
--- /dev/null
+++ b/app/src/main/assets/iceland.ics
@@ -0,0 +1,634 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Uppstigningardagur
+UID:c5027457-7b3e-4caa-bc74-635964c2a1c0
+DTSTART;VALUE=DATE:20170525
+DTEND;VALUE=DATE:20170526
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Hvítasunnudagur
+UID:c85e16c6-231e-4b23-84d0-c123867c803c
+DTSTART;VALUE=DATE:20170604
+DTEND;VALUE=DATE:20170605
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í hvítasunnu
+UID:b5b70bbb-b74a-40a2-a45e-6336d4841f8d
+DTSTART;VALUE=DATE:20170605
+DTEND;VALUE=DATE:20170606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sjómannadagurinn
+UID:9f044e24-9a8a-445a-8c41-16f6dfc877b7
+DTSTART;VALUE=DATE:20170611
+DTEND;VALUE=DATE:20170612
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Menningarnótt
+UID:ab0c6e3a-19cf-4880-b206-0d4717a8b087
+DTSTART;VALUE=DATE:20170819
+DTEND;VALUE=DATE:20170820
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fyrsti vetrardagur
+UID:c5c3518e-0e66-46f6-a714-22926212b6ce
+DTSTART;VALUE=DATE:20171021
+DTEND;VALUE=DATE:20171022
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fyrsti í aðventu
+UID:27454acb-f233-4fed-9961-aadf598a27f4
+DTSTART;VALUE=DATE:20171203
+DTEND;VALUE=DATE:20171204
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í aðventu
+UID:601d1c56-7862-4303-b4c9-40472bfa8d1a
+DTSTART;VALUE=DATE:20171210
+DTEND;VALUE=DATE:20171211
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Þriðji í aðventu
+UID:d6a97e06-6e42-4fbd-94e5-dec48c8c0e19
+DTSTART;VALUE=DATE:20171217
+DTEND;VALUE=DATE:20171218
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fjórði í aðventu
+UID:5b2a23d2-4d42-4ed2-88a7-1f73cce9e591
+DTSTART;VALUE=DATE:20171224
+DTEND;VALUE=DATE:20171225
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Bóndadagur
+UID:16191875-9e90-4ec5-900a-3aa307efcc1a
+DTSTART;VALUE=DATE:20180119
+DTEND;VALUE=DATE:20180120
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Bolludagur
+UID:f6b908b0-1c65-468d-9428-004d000373ff
+DTSTART;VALUE=DATE:20180212
+DTEND;VALUE=DATE:20180213
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sprengidagur
+UID:c7e82feb-5168-4661-8260-a52022f7d5af
+DTSTART;VALUE=DATE:20180213
+DTEND;VALUE=DATE:20180214
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Öskudagur
+UID:75444211-93cf-4b00-8a9a-c6ece024c0a9
+DTSTART;VALUE=DATE:20180214
+DTEND;VALUE=DATE:20180215
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Konudagur
+UID:074d505e-1b43-474d-98ff-c80d56d09c31
+DTSTART;VALUE=DATE:20180218
+DTEND;VALUE=DATE:20180219
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Skírdagur
+UID:84deaae9-14f4-4ed2-8a16-3007269e1a79
+DTSTART;VALUE=DATE:20180329
+DTEND;VALUE=DATE:20180330
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Föstudagurinn langi
+UID:15adbd7d-ae95-44c1-8af5-39622b9d5523
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Páskadagur
+UID:02052b20-f7ef-487f-90fc-0ceb9448018f
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í páskum
+UID:82fad218-1411-4e17-8e9a-4f7d8b3c648c
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sumardagurinn fyrsti
+UID:26bab17c-f935-4eb7-af22-044961951e16
+DTSTART;VALUE=DATE:20180419
+DTEND;VALUE=DATE:20180420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Uppstigningardagur
+UID:b197dcfb-9dd9-46a9-a222-d981312aeafe
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180511
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Hvítasunnudagur
+UID:97a308db-a652-44c3-8788-277c3ae7683e
+DTSTART;VALUE=DATE:20180520
+DTEND;VALUE=DATE:20180521
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í hvítasunnu
+UID:276cb53b-57fe-4cc9-b0bc-9448c28fabd2
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sjómannadagurinn
+UID:e03fb6b3-cf1b-49a9-ad3a-d2cdd2e10f21
+DTSTART;VALUE=DATE:20180603
+DTEND;VALUE=DATE:20180604
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Menningarnótt
+UID:7bda4558-3d0d-4f7c-ba72-29174a4b03bd
+DTSTART;VALUE=DATE:20180818
+DTEND;VALUE=DATE:20180819
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fyrsti vetrardagur
+UID:58f69b89-0e51-4d99-9e1f-291c42e22aae
+DTSTART;VALUE=DATE:20181027
+DTEND;VALUE=DATE:20181028
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fyrsti í aðventu
+UID:dbb488cd-e659-4e7a-b5b3-e19a0e1e006f
+DTSTART;VALUE=DATE:20181202
+DTEND;VALUE=DATE:20181203
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í aðventu
+UID:67f1838a-4ef2-4497-9c9d-370a1e4edff5
+DTSTART;VALUE=DATE:20181209
+DTEND;VALUE=DATE:20181210
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Þriðji í aðventu
+UID:2d1af323-444b-4d66-a9ee-ce7182cba0e7
+DTSTART;VALUE=DATE:20181216
+DTEND;VALUE=DATE:20181217
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fjórði í aðventu
+UID:d9714752-bbd0-4343-bcc0-efe1d5bc48c9
+DTSTART;VALUE=DATE:20181223
+DTEND;VALUE=DATE:20181224
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Bóndadagur
+UID:786d61fe-1252-41d0-a3fc-51dedf159cd6
+DTSTART;VALUE=DATE:20190118
+DTEND;VALUE=DATE:20190119
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Konudagur
+UID:ab168677-e452-4c30-ad4e-dab992307c87
+DTSTART;VALUE=DATE:20190224
+DTEND;VALUE=DATE:20190225
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Bolludagur
+UID:e9e0d609-efc0-4680-abfb-d7d3abd3f39b
+DTSTART;VALUE=DATE:20190304
+DTEND;VALUE=DATE:20190305
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sprengidagur
+UID:9e728175-33f4-4cc3-8d12-3b35084d9f26
+DTSTART;VALUE=DATE:20190305
+DTEND;VALUE=DATE:20190306
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Öskudagur
+UID:2db18149-2e2a-4815-b062-55d71bcb32a4
+DTSTART;VALUE=DATE:20190306
+DTEND;VALUE=DATE:20190307
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pálmasunnudagur
+UID:6b31d7dd-4796-409d-9344-c64852f69922
+DTSTART;VALUE=DATE:20190414
+DTEND;VALUE=DATE:20190415
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Skírdagur
+UID:0359043f-afa7-4fdd-b998-8ffd4bcd79d9
+DTSTART;VALUE=DATE:20190418
+DTEND;VALUE=DATE:20190419
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Föstudagurinn langi
+UID:58f68821-06b2-4046-bd3e-d4d1c849e922
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Páskadagur
+UID:417d8869-408a-4352-8d33-a8bacd640a80
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í páskum
+UID:eceaee5d-d21f-4c01-9fef-322f480a688f
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sumardagurinn fyrsti
+UID:c8c12f62-73cc-4da6-a341-4cba85299639
+DTSTART;VALUE=DATE:20190425
+DTEND;VALUE=DATE:20190426
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Uppstigningardagur
+UID:df2fdfb3-96b0-4b2e-91db-3da456e952aa
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190531
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sjómannadagurinn
+UID:db90aafa-73e9-44c0-ac60-000f6f27e67a
+DTSTART;VALUE=DATE:20190602
+DTEND;VALUE=DATE:20190603
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Hvítasunnudagur
+UID:2101103e-31bd-4e8c-8b23-41de85859245
+DTSTART;VALUE=DATE:20190609
+DTEND;VALUE=DATE:20190610
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í hvítasunnu
+UID:c0d14cc3-45f0-414a-a753-190a59d13045
+DTSTART;VALUE=DATE:20190610
+DTEND;VALUE=DATE:20190611
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Menningarnótt
+UID:d7442b5a-4d1f-44aa-a303-0edbd4ec8204
+DTSTART;VALUE=DATE:20190824
+DTEND;VALUE=DATE:20190825
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fyrsti vetrardagur
+UID:5d98c5cf-a892-4951-ba82-ba5dccb86e24
+DTSTART;VALUE=DATE:20191026
+DTEND;VALUE=DATE:20191027
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fyrsti í aðventu
+UID:3d9fc523-f73e-4d58-aacc-94b8e17f3e32
+DTSTART;VALUE=DATE:20191201
+DTEND;VALUE=DATE:20191202
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í aðventu
+UID:da933667-ab75-4658-9c4c-e76a9cc56886
+DTSTART;VALUE=DATE:20191208
+DTEND;VALUE=DATE:20191209
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Þriðji í aðventu
+UID:2d44af44-54e8-4a64-9621-2f3a9f8c574a
+DTSTART;VALUE=DATE:20191215
+DTEND;VALUE=DATE:20191216
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fjórði í aðventu
+UID:750854fe-e0dc-48bc-84c6-9b4824fd4318
+DTSTART;VALUE=DATE:20191222
+DTEND;VALUE=DATE:20191223
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Bóndadagur
+UID:e6000cdf-9e51-4337-9351-47202661d099
+DTSTART;VALUE=DATE:20200124
+DTEND;VALUE=DATE:20200125
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Konudagur
+UID:d6e73e1b-0c18-4040-8d02-49d885768166
+DTSTART;VALUE=DATE:20200223
+DTEND;VALUE=DATE:20200224
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Bolludagur
+UID:bc39ee76-782d-48f6-b41f-408d7e6ea68e
+DTSTART;VALUE=DATE:20200224
+DTEND;VALUE=DATE:20200225
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sprengidagur
+UID:d6bf13e8-3708-4e64-937e-e8abaf053b6e
+DTSTART;VALUE=DATE:20200225
+DTEND;VALUE=DATE:20200226
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Öskudagur
+UID:42535133-a356-438d-a1bb-0d0232de4de6
+DTSTART;VALUE=DATE:20200226
+DTEND;VALUE=DATE:20200227
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pálmasunnudagur
+UID:b44bcb6b-f8a7-4754-b17f-85dc2ebac1c9
+DTSTART;VALUE=DATE:20200405
+DTEND;VALUE=DATE:20200406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Skírdagur
+UID:abb80d0e-6623-4e07-b091-5d9b82926515
+DTSTART;VALUE=DATE:20200409
+DTEND;VALUE=DATE:20200410
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Föstudagurinn langi
+UID:7a92551a-9acf-425c-af13-2805683534b8
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Páskadagur
+UID:9a6134ee-810f-405f-b93b-01afefee2128
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í páskum
+UID:482e006d-3dbc-42b5-b582-9837bbc1cda0
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sumardagurinn fyrsti
+UID:6ec52ac0-de08-4f95-9a39-50f264279343
+DTSTART;VALUE=DATE:20200423
+DTEND;VALUE=DATE:20200424
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Uppstigningardagur
+UID:4f610ecb-d58f-467b-9c30-4bf1fc22f85e
+DTSTART;VALUE=DATE:20200521
+DTEND;VALUE=DATE:20200522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Hvítasunnudagur
+UID:c41c0cd7-6e27-467b-b99d-0bdd45842a97
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í hvítasunnu
+UID:d6c72e7b-fcfd-4481-9cf4-fc2074a8f9f0
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sjómannadagurinn
+UID:5dd4d7f0-6f5f-4d16-91c4-d897fe474be1
+DTSTART;VALUE=DATE:20200607
+DTEND;VALUE=DATE:20200608
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Menningarnótt
+UID:265baaf3-d998-4259-bb2f-1f8f89f98e85
+DTSTART;VALUE=DATE:20200822
+DTEND;VALUE=DATE:20200823
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fyrsti vetrardagur
+UID:caf309e6-7565-4ca2-84f1-8914b577b58f
+DTSTART;VALUE=DATE:20201024
+DTEND;VALUE=DATE:20201025
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fyrsti í aðventu
+UID:c5480948-11db-43ae-a77e-3b02037ab338
+DTSTART;VALUE=DATE:20201129
+DTEND;VALUE=DATE:20201130
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í aðventu
+UID:728da255-2984-417b-be76-aa2eee5c0189
+DTSTART;VALUE=DATE:20201206
+DTEND;VALUE=DATE:20201207
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Þriðji í aðventu
+UID:50bc115f-bd88-4f0c-840b-b4ea155f3685
+DTSTART;VALUE=DATE:20201213
+DTEND;VALUE=DATE:20201214
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fjórði í aðventu
+UID:893600d6-f4ef-4bef-b539-4d79859ceb64
+DTSTART;VALUE=DATE:20201220
+DTEND;VALUE=DATE:20201221
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Nýársdagur
+UID:5c6e2c7b-bb06-48ea-a472-af4ed1594598
+DTSTART;VALUE=DATE:20080101
+DTEND;VALUE=DATE:20080102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Þrettándinn
+UID:7310dfe1-2a6b-41ac-8042-31ca22dbed92
+DTSTART;VALUE=DATE:20080106
+DTEND;VALUE=DATE:20080107
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Valentínusdagur
+UID:9bb19668-dd5b-4f3d-a330-79463f60ef46
+DTSTART;VALUE=DATE:20080214
+DTEND;VALUE=DATE:20080215
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Alþjóðadagur verkalýðsins
+UID:7394164c-2ad0-4011-86aa-227b6c31997b
+DTSTART;VALUE=DATE:20080501
+DTEND;VALUE=DATE:20080502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Mæðradagurinn
+UID:4b67ff2b-c612-4feb-bedb-fe69d74bb3c9
+DTSTART;VALUE=DATE:20080511
+DTEND;VALUE=DATE:20080512
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lýðveldisdagurinn
+UID:0a9d386e-47ac-4b00-9955-93ed732fec3e
+DTSTART;VALUE=DATE:20080617
+DTEND;VALUE=DATE:20080618
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Jónsmessa
+UID:4ffa79a7-5949-44b8-a322-3063e131d9b6
+DTSTART;VALUE=DATE:20080624
+DTEND;VALUE=DATE:20080625
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Frídagur verslunarmanna
+UID:f173fc37-b027-4b81-8c90-180849624576
+DTSTART;VALUE=DATE:20080804
+DTEND;VALUE=DATE:20080805
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Feðradagurinn
+UID:d96ad287-ea70-4c09-9136-c75d8728d21c
+DTSTART;VALUE=DATE:20081112
+DTEND;VALUE=DATE:20081113
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dagur íslenskrar tungu
+UID:d9ac70a4-c6cd-4b9c-91a4-5eb99b815458
+DTSTART;VALUE=DATE:20081116
+DTEND;VALUE=DATE:20081117
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fullveldisdagurinn
+UID:a758c951-750f-4348-8a19-c6cf9407cec0
+DTSTART;VALUE=DATE:20081201
+DTEND;VALUE=DATE:20081202
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Þorláksmessa
+UID:9d19dafa-a3fb-47f3-9f61-29dd738509f7
+DTSTART;VALUE=DATE:20081223
+DTEND;VALUE=DATE:20081224
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Aðfangadagur
+UID:436cc1f3-2ef8-4613-8cf7-4f48ef4f8294
+DTSTART;VALUE=DATE:20081224
+DTEND;VALUE=DATE:20081225
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Jóladagur
+UID:b53b43c6-5553-465d-a8e0-f374300a5692
+DTSTART;VALUE=DATE:20081225
+DTEND;VALUE=DATE:20081226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Annar í jólum
+UID:375e5456-df44-4e1a-86a3-38205161a08f
+DTSTART;VALUE=DATE:20081226
+DTEND;VALUE=DATE:20081227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Gamlársdagur
+UID:8befbdd5-6b7c-4d8b-9dc0-bb203c75d4a2
+DTSTART;VALUE=DATE:20081231
+DTEND;VALUE=DATE:20090101
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/india.ics b/app/src/main/assets/india.ics
new file mode 100644
index 0000000000000000000000000000000000000000..eda425aa44f0fb7aca6e6a3f9abebdbb52d8f9f6
--- /dev/null
+++ b/app/src/main/assets/india.ics
@@ -0,0 +1,316 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:New Year's Day
+UID:2002-01-01-1
+DTSTART;VALUE=DATE:20110101
+DTEND;VALUE=DATE:20110102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Netaji's birthday
+UID:902705443
+DTSTART;VALUE=DATE:20110123
+DTEND;VALUE=DATE:20110124
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Republic Day
+UID:2002-01-26-1
+DTSTART;VALUE=DATE:20110126
+DTEND;VALUE=DATE:20110127
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Mahatma's martyrdom day
+UID:2002-01-30-1
+DTSTART;VALUE=DATE:20110130
+DTEND;VALUE=DATE:20110131
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Independence Day
+UID:2002-08-15-1
+DTSTART;VALUE=DATE:20110815
+DTEND;VALUE=DATE:20110816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sankranti
+UID:2002-01-14-1
+DTSTART;VALUE=DATE:20140114
+DTEND;VALUE=DATE:20140115
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+EXDATE:20160114}
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pongal
+UID:2002-01-15-1
+DTSTART;VALUE=DATE:20140115
+DTEND;VALUE=DATE:20140116
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Gandhi Jayanti
+UID:2002-10-02-1
+DTSTART;VALUE=DATE:20141002
+DTEND;VALUE=DATE:20141003
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Bhogi
+UID:2002-01-13-1
+DTSTART;VALUE=DATE:20160114
+DTEND;VALUE=DATE:20160115
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+EXDATE:20180113}
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Losoong [Sikkimese New Year]
+UID:e4d23f27-a4e3-479e-a25b-d905e1d27f67
+DTSTART;VALUE=DATE:20160208
+DTEND;VALUE=DATE:20160209
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Maharishi Dayanand Saraswati Jayanti
+UID:5efd3780-7233-11da-88ad-9f93f56d9df3
+DTSTART;VALUE=DATE:20160214
+DTEND;VALUE=DATE:20160215
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Maha Shivaratri
+UID:2002-03-12-1
+DTSTART;VALUE=DATE:20160226
+DTEND;VALUE=DATE:20160227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+EXDATE:20170225}
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Solar Eclipse [Total]
+UID:8dec8425-9bb9-4749-8078-701299a910f1
+DTSTART:20160309T005800Z
+DTEND:20160309T010200Z
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Holi
+UID:b9e79b50-7235-11da-8266-8565e4d16d93
+DTSTART;VALUE=DATE:20160323
+DTEND;VALUE=DATE:20160324
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunar Eclipse [Penumbral]
+UID:8655066a-d265-4d29-ad48-0b292bce9931
+DTSTART:20160323T013900Z
+DTEND:20160323T055500Z
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday
+UID:cf7417b0-7236-11da-936b-8c894bc3e4c3
+DTSTART;VALUE=DATE:20160325
+DTEND;VALUE=DATE:20160326
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ugadi
+UID:2002-03-29-1
+DTSTART;VALUE=DATE:20160408
+DTEND;VALUE=DATE:20160409
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+EXDATE:20170409}
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Gudi Padwa
+UID:31970fe0-7236-11da-86c4-893c642964fe
+DTSTART;VALUE=DATE:20160408
+DTEND;VALUE=DATE:20160409
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Vaisakhi
+UID:41e41b70-7235-11da-8b29-b8edd2384ed6
+DTSTART;VALUE=DATE:20160413
+DTEND;VALUE=DATE:20160414
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Puthandu
+UID:2002-04-14-1
+DTSTART;VALUE=DATE:20160414
+DTEND;VALUE=DATE:20160415
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dr. Bhimrao Ramji Ambedkar's birthday
+UID:ae54cc40-7236-11da-aaaa-92d722977743
+DTSTART;VALUE=DATE:20160414
+DTEND;VALUE=DATE:20160415
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Bohag Bihu [Assamese New Year]
+UID:0509197b-e862-4b73-837d-98d23d4d0587
+DTSTART;VALUE=DATE:20160414
+DTEND;VALUE=DATE:20160415
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sri Ram navami
+UID:2002-04-21-1
+DTSTART;VALUE=DATE:20160415
+DTEND;VALUE=DATE:20160416
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Mahavir Jayanti
+UID:2002-04-25-1
+DTSTART;VALUE=DATE:20160419
+DTEND;VALUE=DATE:20160420
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+EXDATE:20180420}
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Idu'l Fitr
+UID:2002-12-06-1
+DTSTART;VALUE=DATE:20160507
+DTEND;VALUE=DATE:20160508
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Buddha Purnima
+UID:2002-05-26-1
+DTSTART;VALUE=DATE:20160521
+DTEND;VALUE=DATE:20160522
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+EXDATE:20170522}
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Raksha Bandhan
+UID:2002-08-22-1
+DTSTART;VALUE=DATE:20160705
+DTEND;VALUE=DATE:20160706
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+EXDATE:20170706}
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Parsi New Year
+UID:362908a0-2f52-11d8-ae5b-92fe3e55f869
+DTSTART;VALUE=DATE:20160817
+DTEND;VALUE=DATE:20160818
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+EXDATE:20180818}
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Janmashtami
+UID:2002-08-30-1
+DTSTART;VALUE=DATE:20160825
+DTEND;VALUE=DATE:20160826
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+EXDATE:20170826}
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Solar Eclipse [Annular]
+UID:b0e77f23-b090-4427-ba4b-11b9c3b23849
+DTSTART:20160901T070800Z
+DTEND:20160901T071200Z
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ganesh Chaturthi
+UID:2002-09-10-1
+DTSTART;VALUE=DATE:20160905
+DTEND;VALUE=DATE:20160906
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Onam
+UID:7ed9f200-2f52-11d8-b2cb-913852cf0eb2
+DTSTART;VALUE=DATE:20160913
+DTEND;VALUE=DATE:20160914
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunar Eclipse [Penumbral]
+UID:cef395e0-83b1-11db-9a83-a573279bff77
+DTSTART:20160916T075442Z
+DTEND:20160916T115300Z
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Muharram
+UID:2002-03-25-1
+DTSTART;VALUE=DATE:20161002
+DTEND;VALUE=DATE:20161003
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Maharishi Valmiki's birthday
+UID:7818d420-7237-11da-be73-d94cdcdce3bf
+DTSTART;VALUE=DATE:20161015
+DTEND;VALUE=DATE:20161016
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+EXDATE:20171016}
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Nutan Varsh
+UID:13794675-3cb6-4e3b-9581-d72514278e90
+DTSTART;VALUE=DATE:20161031
+DTEND;VALUE=DATE:20161101
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:ID-I-Milad-un-Nabi [Barah-Wafat]
+UID:2002-05-25-1
+DTSTART;VALUE=DATE:20161213
+DTEND;VALUE=DATE:20161214
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas
+UID:2002-12-25-1
+DTSTART;VALUE=DATE:20161225
+DTEND;VALUE=DATE:20161226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/indonesia.ics b/app/src/main/assets/indonesia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..a584b9e0eeabfb169c6118a6b939cac7fcf70fb9
--- /dev/null
+++ b/app/src/main/assets/indonesia.ics
@@ -0,0 +1,300 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:20171212T045342Z-268948299@marudot.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180101
+SUMMARY:New Year's Day 2018
+DESCRIPTION:Tahun Baru 2018
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-601964501@marudot.com
+DTSTART;VALUE=DATE:20180216
+DTEND;VALUE=DATE:20180216
+SUMMARY:Chinese New Year
+DESCRIPTION:Tahun Baru Imlek 2569
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-417357037@marudot.com
+DTSTART;VALUE=DATE:20180228
+DTEND;VALUE=DATE:20180228
+SUMMARY:Coming to Indonesia-Cross Cultural Training
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-578292563@marudot.com
+DTSTART;VALUE=DATE:20180301
+DTEND;VALUE=DATE:20180301
+SUMMARY:Working in Indonesia-Cross Cultural Workshop for Expats
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-1099619811@marudot.com
+DTSTART;VALUE=DATE:20180313
+DTEND;VALUE=DATE:20180313
+SUMMARY:Living in Indonesia-Cross Cultural Workshop for Spouses
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-894503703@marudot.com
+DTSTART;VALUE=DATE:20180314
+DTEND;VALUE=DATE:20180314
+SUMMARY:Management in Indonesia-Cross Cultural Workshop
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-791851244@marudot.com
+DTSTART;VALUE=DATE:20180317
+DTEND;VALUE=DATE:20180317
+SUMMARY:Balinese New Year 
+DESCRIPTION:Hari Raya Nyepi 1940
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-329618688@marudot.com
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180330
+SUMMARY:Good Friday
+DESCRIPTION:Wafat Isa Al-Masih
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-190146881@marudot.com
+DTSTART;VALUE=DATE:20180414
+DTEND;VALUE=DATE:20180414
+SUMMARY:Ascension of Prophet Muhammad SAW
+DESCRIPTION:Isra’ Mi’raj Nabi Muhammad SAW
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-435386496@marudot.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180501
+SUMMARY:Labor Day
+DESCRIPTION:Hari Buruh Internasional
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-418653428@marudot.com
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180510
+SUMMARY:Waisak Day (“Buddhas Birthday” 2562)
+DESCRIPTION:Hari Waisak 2562
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-2110293750@marudot.com
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180510
+SUMMARY:Ascension Day of Jesus Christ
+DESCRIPTION:Kenaikan Isa Almasih
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-119842090@marudot.com
+DTSTART;VALUE=DATE:20180601
+DTEND;VALUE=DATE:20180601
+SUMMARY:Birthday of Pancasila
+DESCRIPTION:Hari Lahir Pancasila
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-1166612864@marudot.com
+DTSTART;VALUE=DATE:20180615
+DTEND;VALUE=DATE:20180615
+SUMMARY:End of Ramadan – Eid-al-Fitr 1439H  (1st of Shawwal)
+DESCRIPTION:Hari Raya Idul Fitri 1439H
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-640873938@marudot.com
+DTSTART;VALUE=DATE:20180616
+DTEND;VALUE=DATE:20180616
+SUMMARY:End of Ramadan – Eid-al-Fitr 1439H  (2nd of Shawwal)
+DESCRIPTION:Hari Raya Idul Fitri 1439H
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-1948724575@marudot.com
+DTSTART;VALUE=DATE:20180808
+DTEND;VALUE=DATE:20180808
+SUMMARY:Working in Indonesia-Cross Cultural Workshop for Expats
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-1926764224@marudot.com
+DTSTART;VALUE=DATE:20180814
+DTEND;VALUE=DATE:20180814
+SUMMARY:Management in Indonesia-Cross Cultural Workshop
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-828431129@marudot.com
+DTSTART;VALUE=DATE:20180817
+DTEND;VALUE=DATE:20180817
+SUMMARY:Indonesia Independence Day 
+DESCRIPTION:Hari Kemerdekaan Republik Indonesia ke-73
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-1713949044@marudot.com
+DTSTART;VALUE=DATE:20180822
+DTEND;VALUE=DATE:20180822
+SUMMARY:Islamic feast of Sacrifice (Bakr-Eid) 1439H
+DESCRIPTION:Hari Raya Idul Adha 1439H
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-1202137034@marudot.com
+DTSTART;VALUE=DATE:20180911
+DTEND;VALUE=DATE:20180911
+SUMMARY:Islamic New Year (1st Muharram 1440H)
+DESCRIPTION:Tahun Baru Islam 1440H
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-209129850@marudot.com
+DTSTART;VALUE=DATE:20181120
+DTEND;VALUE=DATE:20181120
+SUMMARY:Birth of the Prophet Muhammad SAW
+DESCRIPTION:Maulid Nabi
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-946856460@marudot.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181225
+SUMMARY:Christmas Day
+DESCRIPTION:Hari Raya Natal
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-2689482992@marudot.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190101
+SUMMARY:New Year's Day 2019
+DESCRIPTION:Tahun Baru 2019
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-6019645012@marudot.com
+DTSTART;VALUE=DATE:20190205
+DTEND;VALUE=DATE:20190205
+SUMMARY:Chinese New Year
+DESCRIPTION:Tahun Baru Imlek 2569
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-7918512442@marudot.com
+DTSTART;VALUE=DATE:20190307
+DTEND;VALUE=DATE:20190307
+SUMMARY:Balinese New Year 
+DESCRIPTION:Hari Raya Nyepi 1940
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-3296186882@marudot.com
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190419
+SUMMARY:Good Friday
+DESCRIPTION:Wafat Isa Al-Masih
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-1901468812@marudot.com
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190530
+SUMMARY:Ascension of Prophet Muhammad SAW
+DESCRIPTION:Isra’ Mi’raj Nabi Muhammad SAW
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-4353864962@marudot.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190501
+SUMMARY:Labor Day
+DESCRIPTION:Hari Buruh Internasional
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-4186534282@marudot.com
+DTSTART;VALUE=DATE:20190519
+DTEND;VALUE=DATE:20190519
+SUMMARY:Waisak Day (“Buddhas Birthday” 2562)
+DESCRIPTION:Hari Waisak 2562
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-21102937502@marudot.com
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190530
+SUMMARY:Ascension Day of Jesus Christ
+DESCRIPTION:Kenaikan Isa Almasih
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-1198420902@marudot.com
+DTSTART;VALUE=DATE:20190601
+DTEND;VALUE=DATE:20190601
+SUMMARY:Birthday of Pancasila
+DESCRIPTION:Hari Lahir Pancasila
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-11666128642@marudot.com
+DTSTART;VALUE=DATE:20180605
+DTEND;VALUE=DATE:20180605
+SUMMARY:End of Ramadan – Eid-al-Fitr 1439H  (1st of Shawwal)
+DESCRIPTION:Hari Raya Idul Fitri 1439H
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-6408739382@marudot.com
+DTSTART;VALUE=DATE:20180606
+DTEND;VALUE=DATE:20180606
+SUMMARY:End of Ramadan – Eid-al-Fitr 1439H  (2nd of Shawwal)
+DESCRIPTION:Hari Raya Idul Fitri 1439H
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-8284311292@marudot.com
+DTSTART;VALUE=DATE:20190817
+DTEND;VALUE=DATE:20190817
+SUMMARY:Indonesia Independence Day 
+DESCRIPTION:Hari Kemerdekaan Republik Indonesia ke-73
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-17139490442@marudot.com
+DTSTART;VALUE=DATE:20180812
+DTEND;VALUE=DATE:20180812
+SUMMARY:Islamic feast of Sacrifice (Bakr-Eid) 1439H
+DESCRIPTION:Hari Raya Idul Adha 1439H
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-12021370342@marudot.com
+DTSTART;VALUE=DATE:20180901
+DTEND;VALUE=DATE:20180901
+SUMMARY:Islamic New Year (1st Muharram 1440H)
+DESCRIPTION:Tahun Baru Islam 1440H
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-2091298502@marudot.com
+DTSTART;VALUE=DATE:20181110
+DTEND;VALUE=DATE:20181110
+SUMMARY:Birth of the Prophet Muhammad SAW
+DESCRIPTION:Maulid Nabi
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:20171212T045342Z-9468564602@marudot.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181225
+SUMMARY:Christmas Day
+DESCRIPTION:Hari Raya Natal
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/ireland.ics b/app/src/main/assets/ireland.ics
new file mode 100644
index 0000000000000000000000000000000000000000..9bdb14adab5f19b56eb4373d45372e5e6fdbf45e
--- /dev/null
+++ b/app/src/main/assets/ireland.ics
@@ -0,0 +1,230 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:June Holiday
+UID:11abdac6-ba7e-48e2-98c5-91aa6004766f
+DTSTART;VALUE=DATE:20170605
+DTEND;VALUE=DATE:20170606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:August Holiday
+UID:47d82997-fb1f-4a6d-9080-eb1790479b5c
+DTSTART;VALUE=DATE:20170807
+DTEND;VALUE=DATE:20170808
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:October Holiday
+UID:d074e3be-a24e-4fba-9e74-d1839f3c096b
+DTSTART;VALUE=DATE:20171030
+DTEND;VALUE=DATE:20171031
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. Patrick's Day (Observed)
+UID:7cfc67ab-8609-4c1a-82dd-8bb48363d078
+DTSTART;VALUE=DATE:20180319
+DTEND;VALUE=DATE:20180320
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday
+UID:dbdf2bc4-0f36-4c31-bc44-db6360c1cb23
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:May Day
+UID:8fd56463-e3cb-4310-bb17-7de7787d7a2d
+DTSTART;VALUE=DATE:20180507
+DTEND;VALUE=DATE:20180508
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:June Holiday
+UID:0f74f732-6b11-46a3-b97a-fe68613f0432
+DTSTART;VALUE=DATE:20180604
+DTEND;VALUE=DATE:20180605
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:August Holiday
+UID:d7325907-ced1-45f7-a50e-c188bc5b2a33
+DTSTART;VALUE=DATE:20180806
+DTEND;VALUE=DATE:20180807
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:October Holiday
+UID:911ace2a-c683-44ff-91cd-8d4679df2646
+DTSTART;VALUE=DATE:20181029
+DTEND;VALUE=DATE:20181030
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. Patrick's Day (Observed)
+UID:9953304a-b04b-4e11-b646-42d0b0590a11
+DTSTART;VALUE=DATE:20190318
+DTEND;VALUE=DATE:20190319
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday
+UID:dfbb7e2b-71c4-475f-9340-e68739cb52cc
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:May Day
+UID:b852e929-35c9-4fe0-b755-fe8159512ab7
+DTSTART;VALUE=DATE:20190506
+DTEND;VALUE=DATE:20190507
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:June Holiday
+UID:e1588f52-c284-463a-bb59-e592cbb809d9
+DTSTART;VALUE=DATE:20190603
+DTEND;VALUE=DATE:20190604
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:August Holiday
+UID:850fc5f1-b8bc-437e-a109-764b0d4f87f4
+DTSTART;VALUE=DATE:20190805
+DTEND;VALUE=DATE:20190806
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:October Holiday
+UID:2dc3e89e-6363-4149-80ea-ac29fe2ee8b8
+DTSTART;VALUE=DATE:20191028
+DTEND;VALUE=DATE:20191029
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday
+UID:27259869-540d-424d-b416-3960ef364b9f
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:May Day
+UID:c2d99515-1b92-48b2-9a0b-3e0b3f0fcba2
+DTSTART;VALUE=DATE:20200504
+DTEND;VALUE=DATE:20200505
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:June Holiday
+UID:4e3cbd5a-18fc-4005-9d5d-2693e166852e
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:August Holiday
+UID:ccf4e530-d9ca-45cb-acbf-dedbad4c939e
+DTSTART;VALUE=DATE:20200803
+DTEND;VALUE=DATE:20200804
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:October Holiday
+UID:a1becd5d-2a3a-4174-8880-2d79256dab3d
+DTSTART;VALUE=DATE:20201026
+DTEND;VALUE=DATE:20201027
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. Stephen's Day (Observed)
+UID:9c155831-c7b5-49dd-a739-845501d4acfe
+DTSTART;VALUE=DATE:20201228
+DTEND;VALUE=DATE:20201229
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter Monday
+UID:7cdf3c77-2fc6-4b1a-8ea6-da61a33d1430
+DTSTART;VALUE=DATE:20210405
+DTEND;VALUE=DATE:20210406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:May Day
+UID:eaa35f43-a06d-43f7-8159-1f14557cafac
+DTSTART;VALUE=DATE:20210503
+DTEND;VALUE=DATE:20210504
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:June Holiday
+UID:ce4ae45a-6ee6-441b-980c-cf1ebcd9632d
+DTSTART;VALUE=DATE:20210607
+DTEND;VALUE=DATE:20210608
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:August Holiday
+UID:66412e72-bffd-49dc-a380-dab342ef9503
+DTSTART;VALUE=DATE:20210802
+DTEND;VALUE=DATE:20210803
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:October Holiday
+UID:0a95c5ed-d8f4-4cc3-a38e-c465cd32630d
+DTSTART;VALUE=DATE:20211025
+DTEND;VALUE=DATE:20211026
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas Day (Observed)
+UID:7ffa46af-794e-4ffe-b643-86f7b729c183
+DTSTART;VALUE=DATE:20211227
+DTEND;VALUE=DATE:20211228
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. Stephen's Day (Observed)
+UID:2a7283fe-a207-4f5f-bc88-ee6f267f377c
+DTSTART;VALUE=DATE:20211228
+DTEND;VALUE=DATE:20211229
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year's Day
+UID:23d34dcc-bb2f-4332-95bb-6acad5c07131
+DTSTART;VALUE=DATE:20140101
+DTEND;VALUE=DATE:20140102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. Patrick's Day
+UID:ab1fd7cc-8547-4945-8ed1-16cbc21ac5bb
+DTSTART;VALUE=DATE:20140317
+DTEND;VALUE=DATE:20140318
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas Day
+UID:83b02837-6cf0-4687-bc89-db3dd3ef905f
+DTSTART;VALUE=DATE:20141225
+DTEND;VALUE=DATE:20141226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. Stephen's Day
+UID:46b67912-c3dd-4b13-9271-f84a436d5e72
+DTSTART;VALUE=DATE:20141226
+DTEND;VALUE=DATE:20141227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/italy.ics b/app/src/main/assets/italy.ics
new file mode 100644
index 0000000000000000000000000000000000000000..af99a937d54dcdf172dbbaaabf1853113d3247bb
--- /dev/null
+++ b/app/src/main/assets/italy.ics
@@ -0,0 +1,250 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:96379801-f792-4b8e-acee-64b2b2a66745
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:e974b0d7-4027-4183-87c9-c4a042a6d3c6
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:923c84b8-3e42-45b9-83df-97da9ed92138
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:fb98f85c-fe12-4626-a200-c39040079f2e
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:1f02ab79-a661-4c14-ba04-448f80c35afd
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:df190dd8-2d5b-446c-a9e6-6cff69220ac9
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:e3dd5faa-1137-4640-8639-422a38966b82
+DTSTART;VALUE=DATE:20210404
+DTEND;VALUE=DATE:20210405
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:9202a67c-0854-415d-aa5b-2c7375b3049c
+DTSTART;VALUE=DATE:20210405
+DTEND;VALUE=DATE:20210406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:994715a2-f83c-428a-b9a2-ad0575096ecf
+DTSTART;VALUE=DATE:20220417
+DTEND;VALUE=DATE:20220418
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:3c418ec0-1584-48bf-925f-fc116a3dd46d
+DTSTART;VALUE=DATE:20220418
+DTEND;VALUE=DATE:20220419
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:db106df9-4722-44f2-9747-ace095dc9e4a
+DTSTART;VALUE=DATE:20230409
+DTEND;VALUE=DATE:20230410
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:bb1f6990-df54-455f-8662-6ce8d2dfdb81
+DTSTART;VALUE=DATE:20230410
+DTEND;VALUE=DATE:20230411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:ffe87c13-1124-4ad8-8f67-19bce8a0a406
+DTSTART;VALUE=DATE:20240401
+DTEND;VALUE=DATE:20240402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:99a3b6f9-d83c-4b37-a4a2-271d5e3ccb61
+DTSTART;VALUE=DATE:20250420
+DTEND;VALUE=DATE:20250421
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:52fef0b8-9b81-4304-b358-4a384eb3f684
+DTSTART;VALUE=DATE:20250421
+DTEND;VALUE=DATE:20250422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:1493a858-7d46-41f1-abcb-25d7958bbe91
+DTSTART;VALUE=DATE:20260405
+DTEND;VALUE=DATE:20260406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:a4f1ceef-3094-47f8-856c-924a1be8c89a
+DTSTART;VALUE=DATE:20260406
+DTEND;VALUE=DATE:20260407
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:f8071175-9e56-476f-86cb-33eef4b11882
+DTSTART;VALUE=DATE:20270329
+DTEND;VALUE=DATE:20270330
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:b357c07f-b2fc-4936-b48a-2b76072798ea
+DTSTART;VALUE=DATE:20280416
+DTEND;VALUE=DATE:20280417
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:24b85b97-2a22-4cc8-96bc-83c3b9c41114
+DTSTART;VALUE=DATE:20280417
+DTEND;VALUE=DATE:20280418
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:d85e4c95-a2cb-476a-bccd-a277aa615446
+DTSTART;VALUE=DATE:20290401
+DTEND;VALUE=DATE:20290402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:79cfb8b2-bc45-44bd-be3a-c7725d6be313
+DTSTART;VALUE=DATE:20290402
+DTEND;VALUE=DATE:20290403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pasqua
+UID:d4dce04d-32a3-4640-949d-6222502d35f3
+DTSTART;VALUE=DATE:20300421
+DTEND;VALUE=DATE:20300422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Lunedì dell'Angelo
+UID:e325ca23-f03f-4e88-ae19-1c8e6a40bfdd
+DTSTART;VALUE=DATE:20300422
+DTEND;VALUE=DATE:20300423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Capodanno
+UID:f78b6b4c-f120-4758-81eb-0347295fb068
+DTSTART;VALUE=DATE:20000101
+DTEND;VALUE=DATE:20000102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Epifania
+UID:ff5d871a-764f-42db-9b86-7b67a41b37b3
+DTSTART;VALUE=DATE:20000106
+DTEND;VALUE=DATE:20000107
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Anniversario della Liberazione
+UID:a741ba96-8de1-490e-ae9d-cc77fc6b4a23
+DTSTART;VALUE=DATE:20000425
+DTEND;VALUE=DATE:20000426
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Festa del Lavoro
+UID:c88ee012-a63b-4743-b1ad-6ddeeaafd210
+DTSTART;VALUE=DATE:20000501
+DTEND;VALUE=DATE:20000502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Assunzione di Maria Vergine
+UID:8b8d737e-9724-4326-a39c-2dfb1c2f2ecf
+DTSTART;VALUE=DATE:20000815
+DTEND;VALUE=DATE:20000816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ognissanti
+UID:d7d945eb-d1f6-4a13-b712-38aff15bab78
+DTSTART;VALUE=DATE:20001101
+DTEND;VALUE=DATE:20001102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Immacolata Concezione
+UID:bbe3a557-129c-4a5f-a7fb-5632954970b1
+DTSTART;VALUE=DATE:20001208
+DTEND;VALUE=DATE:20001209
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Natale
+UID:e49d0656-cdda-48ac-b85f-48e52af0ad9c
+DTSTART;VALUE=DATE:20001225
+DTEND;VALUE=DATE:20001226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Santo Stefano
+UID:ffcb400a-b11f-4b06-9050-39db0e363704
+DTSTART;VALUE=DATE:20001226
+DTEND;VALUE=DATE:20001227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Festa della Repubblica
+UID:338fc6ca-5b4d-41c8-8622-6617588a76b4
+DTSTART;VALUE=DATE:20010602
+DTEND;VALUE=DATE:20010603
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/japan.ics b/app/src/main/assets/japan.ics
new file mode 100644
index 0000000000000000000000000000000000000000..f573513733b7536f8c6230fc60917885099bac10
--- /dev/null
+++ b/app/src/main/assets/japan.ics
@@ -0,0 +1,170 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
+UID:cd8808f1-27b7-4815-bf6d-0bf2e0f65f34
+DTSTART;VALUE=DATE:20180212
+DTEND;VALUE=DATE:20180213
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
+UID:bde7f12d-094e-4c4e-b4cc-62e2e6a16538
+DTSTART;VALUE=DATE:20180430
+DTEND;VALUE=DATE:20180501
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
+UID:89363b5d-44d9-488d-9f9b-e0ef54ee39ca
+DTSTART;VALUE=DATE:20180924
+DTEND;VALUE=DATE:20180925
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
+UID:367ec81d-1abd-4052-ac2c-bf4a8d86b1cb
+DTSTART;VALUE=DATE:20181224
+DTEND;VALUE=DATE:20181225
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
+UID:66c460c2-443f-4ebd-a61e-ce165ae85aa8
+DTSTART;VALUE=DATE:20190506
+DTEND;VALUE=DATE:20190507
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
+UID:349b42ff-8ccb-4418-a3d2-53b5532d58b0
+DTSTART;VALUE=DATE:20190812
+DTEND;VALUE=DATE:20190813
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
+UID:f3adcd2f-ca60-42cb-b957-d2cc766b1488
+DTSTART;VALUE=DATE:20191104
+DTEND;VALUE=DATE:20191105
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:振替休日 / Furikae kyūjitsu / Substitute Holiday
+UID:32f83505-e89b-4388-91f5-ea3ff172df51
+DTSTART;VALUE=DATE:20200506
+DTEND;VALUE=DATE:20200507
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:元日 / Ganjitsu / New Year's Day
+UID:ae0b79be-fd56-43ce-a325-654f1135fe59
+DTSTART;VALUE=DATE:20070101
+DTEND;VALUE=DATE:20070102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:成人の日 / Seijin no hi / Coming-of-age Day
+UID:4dc6545c-f883-456d-a1ef-e01ea28b5a88
+DTSTART;VALUE=DATE:20070108
+DTEND;VALUE=DATE:20070109
+STATUS:CONFIRMED
+RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=2MO
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:建国記念の日 / Kenkoku kinen no hi / National Foundation
+UID:e0481cd7-ffcc-434c-8f80-6fa023a51a9f
+DTSTART;VALUE=DATE:20070211
+DTEND;VALUE=DATE:20070212
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:昭和の日 / Shōwa no hi / Shōwa Day
+UID:3b75b536-512d-4e8c-b2e9-c4aed80f3421
+DTSTART;VALUE=DATE:20070429
+DTEND;VALUE=DATE:20070430
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:憲法記念日 / Kenpō kinenbi / Constitution Memorial Day
+UID:350d2e8f-b703-4b36-b4c2-4be3d33ca480
+DTSTART;VALUE=DATE:20070503
+DTEND;VALUE=DATE:20070504
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:みどりの日 / Midori no hi / Greenery Day
+UID:7e514490-ceb1-46b6-8efe-2e094284b931
+DTSTART;VALUE=DATE:20070504
+DTEND;VALUE=DATE:20070505
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:こどもの日 / Kodomo no hi / Children's Day
+UID:46ab68cd-0f47-4841-9e80-86b882bce50d
+DTSTART;VALUE=DATE:20070505
+DTEND;VALUE=DATE:20070506
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:海の日 / Umi no hi / Marine Day
+UID:19eb140c-7ea3-49a0-8f59-a3bafe328095
+DTSTART;VALUE=DATE:20070716
+DTEND;VALUE=DATE:20070717
+STATUS:CONFIRMED
+RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=3MO
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:敬老の日 / Keirō no hi / Respect for the Aged Day
+UID:64a745e7-b542-4a93-9f3e-3b5b1991b93b
+DTSTART;VALUE=DATE:20070917
+DTEND;VALUE=DATE:20070918
+STATUS:CONFIRMED
+RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=3MO
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:体育の日 / Taiiku no hi / Health-Sports Day
+UID:79ff380f-f70e-4aaf-a934-57fa1b747e23
+DTSTART;VALUE=DATE:20071008
+DTEND;VALUE=DATE:20071009
+STATUS:CONFIRMED
+RRULE:FREQ=MONTHLY;INTERVAL=12;BYDAY=2MO
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:文化の日 / Bunka no hi / Culture Day
+UID:db458289-cd7d-44e2-8767-86cce5fb3a84
+DTSTART;VALUE=DATE:20071103
+DTEND;VALUE=DATE:20071104
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:勤労感謝の日 / Kinrō kansha no hi / Labour Thanksgiving
+UID:ba42e657-76e9-4a6b-8c6c-6aec9d7c750f
+DTSTART;VALUE=DATE:20071123
+DTEND;VALUE=DATE:20071124
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:天皇誕生日 / Tennō tanjōbi / Emperor Akihito's Birthday
+UID:0f5a4799-4082-4921-95e5-183652982b2d
+DTSTART;VALUE=DATE:20071223
+DTEND;VALUE=DATE:20071224
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:山の日 / Yama no hi / Mountain Day
+UID:2d7ade3e-710a-4c2b-aaa0-2270d90cdd99
+DTSTART;VALUE=DATE:20160811
+DTEND;VALUE=DATE:20160812
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/latvia.ics b/app/src/main/assets/latvia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..6ce2b4d70a697efe72345e68bdb824caedcd09d1
--- /dev/null
+++ b/app/src/main/assets/latvia.ics
@@ -0,0 +1,326 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-lva-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Jaungada dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20180330@kayaposoft.com
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+SUMMARY:Lielo Piektdienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20180401@kayaposoft.com
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+SUMMARY:Pirmās Lieldienas
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20180402@kayaposoft.com
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+SUMMARY:Otro Lieldienu dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20180430@kayaposoft.com
+DTSTART;VALUE=DATE:20180430
+DTEND;VALUE=DATE:20180501
+SUMMARY:Darba svētkus
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Darba svētkus
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20180504@kayaposoft.com
+DTSTART;VALUE=DATE:20180504
+DTEND;VALUE=DATE:20180505
+SUMMARY:Latvijas Republikas Neatkarības atjaunošanas dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20180513@kayaposoft.com
+DTSTART;VALUE=DATE:20180513
+DTEND;VALUE=DATE:20180514
+SUMMARY:Mātes diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20180520@kayaposoft.com
+DTSTART;VALUE=DATE:20180520
+DTEND;VALUE=DATE:20180521
+SUMMARY:Vasarsvētkus
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20180623@kayaposoft.com
+DTSTART;VALUE=DATE:20180623
+DTEND;VALUE=DATE:20180624
+SUMMARY:Līgo dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20180624@kayaposoft.com
+DTSTART;VALUE=DATE:20180624
+DTEND;VALUE=DATE:20180625
+SUMMARY:Jāņu dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20181119@kayaposoft.com
+DTSTART;VALUE=DATE:20181119
+DTEND;VALUE=DATE:20181120
+SUMMARY:Latvijas Republikas proklamēšanas diena
+DESCRIPTION:Holiday in lieu of 18 Nov 2018
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20181224@kayaposoft.com
+DTSTART;VALUE=DATE:20181224
+DTEND;VALUE=DATE:20181225
+SUMMARY:Ziemassvētku vakars
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Ziemassvētki
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:2. Ziemassvētki
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20181231@kayaposoft.com
+DTSTART;VALUE=DATE:20181231
+DTEND;VALUE=DATE:20190101
+SUMMARY:Vecgada vakars
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Jaungada dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20190419@kayaposoft.com
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+SUMMARY:Lielo Piektdienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20190421@kayaposoft.com
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+SUMMARY:Pirmās Lieldienas
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20190422@kayaposoft.com
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+SUMMARY:Otro Lieldienu dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Darba svētkus
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20190506@kayaposoft.com
+DTSTART;VALUE=DATE:20190506
+DTEND;VALUE=DATE:20190507
+SUMMARY:Latvijas Republikas Neatkarības atjaunošanas dienu
+DESCRIPTION:Holiday in lieu of 4 May 2019
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20190512@kayaposoft.com
+DTSTART;VALUE=DATE:20190512
+DTEND;VALUE=DATE:20190513
+SUMMARY:Mātes diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20190609@kayaposoft.com
+DTSTART;VALUE=DATE:20190609
+DTEND;VALUE=DATE:20190610
+SUMMARY:Vasarsvētkus
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20190623@kayaposoft.com
+DTSTART;VALUE=DATE:20190623
+DTEND;VALUE=DATE:20190624
+SUMMARY:Līgo dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20190624@kayaposoft.com
+DTSTART;VALUE=DATE:20190624
+DTEND;VALUE=DATE:20190625
+SUMMARY:Jāņu dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20191118@kayaposoft.com
+DTSTART;VALUE=DATE:20191118
+DTEND;VALUE=DATE:20191119
+SUMMARY:Latvijas Republikas proklamēšanas diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20191224@kayaposoft.com
+DTSTART;VALUE=DATE:20191224
+DTEND;VALUE=DATE:20191225
+SUMMARY:Ziemassvētku vakars
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Ziemassvētki
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:2. Ziemassvētki
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20191231@kayaposoft.com
+DTSTART;VALUE=DATE:20191231
+DTEND;VALUE=DATE:20200101
+SUMMARY:Vecgada vakars
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Jaungada dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20200410@kayaposoft.com
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+SUMMARY:Lielo Piektdienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20200412@kayaposoft.com
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+SUMMARY:Pirmās Lieldienas
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20200413@kayaposoft.com
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+SUMMARY:Otro Lieldienu dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Darba svētkus
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20200504@kayaposoft.com
+DTSTART;VALUE=DATE:20200504
+DTEND;VALUE=DATE:20200505
+SUMMARY:Latvijas Republikas Neatkarības atjaunošanas dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20200510@kayaposoft.com
+DTSTART;VALUE=DATE:20200510
+DTEND;VALUE=DATE:20200511
+SUMMARY:Mātes diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20200531@kayaposoft.com
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200601
+SUMMARY:Vasarsvētkus
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20200623@kayaposoft.com
+DTSTART;VALUE=DATE:20200623
+DTEND;VALUE=DATE:20200624
+SUMMARY:Līgo dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20200624@kayaposoft.com
+DTSTART;VALUE=DATE:20200624
+DTEND;VALUE=DATE:20200625
+SUMMARY:Jāņu dienu
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20201118@kayaposoft.com
+DTSTART;VALUE=DATE:20201118
+DTEND;VALUE=DATE:20201119
+SUMMARY:Latvijas Republikas proklamēšanas diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20201224@kayaposoft.com
+DTSTART;VALUE=DATE:20201224
+DTEND;VALUE=DATE:20201225
+SUMMARY:Ziemassvētku vakars
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Ziemassvētki
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:2. Ziemassvētki
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lva-20201231@kayaposoft.com
+DTSTART;VALUE=DATE:20201231
+DTEND;VALUE=DATE:20210101
+SUMMARY:Vecgada vakars
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/lithuania.ics b/app/src/main/assets/lithuania.ics
new file mode 100644
index 0000000000000000000000000000000000000000..6e184caef074044b1f6f6218cafa5fb5730b3f26
--- /dev/null
+++ b/app/src/main/assets/lithuania.ics
@@ -0,0 +1,317 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-ltu-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Naujieji metai
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20180216@kayaposoft.com
+DTSTART;VALUE=DATE:20180216
+DTEND;VALUE=DATE:20180217
+SUMMARY:Lietuvos valstybės atkūrimo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20180311@kayaposoft.com
+DTSTART;VALUE=DATE:20180311
+DTEND;VALUE=DATE:20180312
+SUMMARY:Lietuvos nepriklausomybės atkūrimo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20180401@kayaposoft.com
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+SUMMARY:Velykos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20180402@kayaposoft.com
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+SUMMARY:Velykos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Tarptautinė darbo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20180506@kayaposoft.com
+DTSTART;VALUE=DATE:20180506
+DTEND;VALUE=DATE:20180507
+SUMMARY:Motinos diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20180603@kayaposoft.com
+DTSTART;VALUE=DATE:20180603
+DTEND;VALUE=DATE:20180604
+SUMMARY:Tėvo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20180624@kayaposoft.com
+DTSTART;VALUE=DATE:20180624
+DTEND;VALUE=DATE:20180625
+SUMMARY:Rasos (Joninės)
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20180706@kayaposoft.com
+DTSTART;VALUE=DATE:20180706
+DTEND;VALUE=DATE:20180707
+SUMMARY:Valstybės (Lietuvos karaliaus Mindaugo karūnavimo) diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20180815@kayaposoft.com
+DTSTART;VALUE=DATE:20180815
+DTEND;VALUE=DATE:20180816
+SUMMARY:Žolinė (Švč. Mergelės Marijos ėmimo į dangų diena)
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20181101@kayaposoft.com
+DTSTART;VALUE=DATE:20181101
+DTEND;VALUE=DATE:20181102
+SUMMARY:Visų šventųjų diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20181224@kayaposoft.com
+DTSTART;VALUE=DATE:20181224
+DTEND;VALUE=DATE:20181225
+SUMMARY:Šv. Kalėdos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Šv. Kalėdos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:Šv. Kalėdos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Naujieji metai
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190216@kayaposoft.com
+DTSTART;VALUE=DATE:20190216
+DTEND;VALUE=DATE:20190217
+SUMMARY:Lietuvos valstybės atkūrimo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190311@kayaposoft.com
+DTSTART;VALUE=DATE:20190311
+DTEND;VALUE=DATE:20190312
+SUMMARY:Lietuvos nepriklausomybės atkūrimo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190421@kayaposoft.com
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+SUMMARY:Velykos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190422@kayaposoft.com
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+SUMMARY:Velykos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Tarptautinė darbo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190505@kayaposoft.com
+DTSTART;VALUE=DATE:20190505
+DTEND;VALUE=DATE:20190506
+SUMMARY:Motinos diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190602@kayaposoft.com
+DTSTART;VALUE=DATE:20190602
+DTEND;VALUE=DATE:20190603
+SUMMARY:Tėvo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190624@kayaposoft.com
+DTSTART;VALUE=DATE:20190624
+DTEND;VALUE=DATE:20190625
+SUMMARY:Rasos (Joninės)
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190706@kayaposoft.com
+DTSTART;VALUE=DATE:20190706
+DTEND;VALUE=DATE:20190707
+SUMMARY:Valstybės (Lietuvos karaliaus Mindaugo karūnavimo) diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20190815@kayaposoft.com
+DTSTART;VALUE=DATE:20190815
+DTEND;VALUE=DATE:20190816
+SUMMARY:Žolinė (Švč. Mergelės Marijos ėmimo į dangų diena)
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20191101@kayaposoft.com
+DTSTART;VALUE=DATE:20191101
+DTEND;VALUE=DATE:20191102
+SUMMARY:Visų šventųjų diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20191224@kayaposoft.com
+DTSTART;VALUE=DATE:20191224
+DTEND;VALUE=DATE:20191225
+SUMMARY:Šv. Kalėdos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Šv. Kalėdos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:Šv. Kalėdos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Naujieji metai
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200216@kayaposoft.com
+DTSTART;VALUE=DATE:20200216
+DTEND;VALUE=DATE:20200217
+SUMMARY:Lietuvos valstybės atkūrimo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200311@kayaposoft.com
+DTSTART;VALUE=DATE:20200311
+DTEND;VALUE=DATE:20200312
+SUMMARY:Lietuvos nepriklausomybės atkūrimo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200412@kayaposoft.com
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+SUMMARY:Velykos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200413@kayaposoft.com
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+SUMMARY:Velykos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Tarptautinė darbo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200503@kayaposoft.com
+DTSTART;VALUE=DATE:20200503
+DTEND;VALUE=DATE:20200504
+SUMMARY:Motinos diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200607@kayaposoft.com
+DTSTART;VALUE=DATE:20200607
+DTEND;VALUE=DATE:20200608
+SUMMARY:Tėvo diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200624@kayaposoft.com
+DTSTART;VALUE=DATE:20200624
+DTEND;VALUE=DATE:20200625
+SUMMARY:Rasos (Joninės)
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200706@kayaposoft.com
+DTSTART;VALUE=DATE:20200706
+DTEND;VALUE=DATE:20200707
+SUMMARY:Valstybės (Lietuvos karaliaus Mindaugo karūnavimo) diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20200815@kayaposoft.com
+DTSTART;VALUE=DATE:20200815
+DTEND;VALUE=DATE:20200816
+SUMMARY:Žolinė (Švč. Mergelės Marijos ėmimo į dangų diena)
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20201101@kayaposoft.com
+DTSTART;VALUE=DATE:20201101
+DTEND;VALUE=DATE:20201102
+SUMMARY:Visų šventųjų diena
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20201224@kayaposoft.com
+DTSTART;VALUE=DATE:20201224
+DTEND;VALUE=DATE:20201225
+SUMMARY:Šv. Kalėdos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Šv. Kalėdos
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ltu-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:Šv. Kalėdos
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/luxembourg.ics b/app/src/main/assets/luxembourg.ics
new file mode 100644
index 0000000000000000000000000000000000000000..3bbbd19df8cbd8dcd33594439ec1964eb0978a80
--- /dev/null
+++ b/app/src/main/assets/luxembourg.ics
@@ -0,0 +1,212 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-lux-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Neijoerschdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20180402@kayaposoft.com
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+SUMMARY:Ouschterméindeg
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Dag vun der Aarbecht
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20180510@kayaposoft.com
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180511
+SUMMARY:Christi Himmelfaart
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20180521@kayaposoft.com
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180522
+SUMMARY:Péngschtméindeg
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20180623@kayaposoft.com
+DTSTART;VALUE=DATE:20180623
+DTEND;VALUE=DATE:20180624
+SUMMARY:Nationalfeierdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20180815@kayaposoft.com
+DTSTART;VALUE=DATE:20180815
+DTEND;VALUE=DATE:20180816
+SUMMARY:Mariä Himmelfaart
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20181101@kayaposoft.com
+DTSTART;VALUE=DATE:20181101
+DTEND;VALUE=DATE:20181102
+SUMMARY:Allerhellgen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Chrëschtdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:Stiefesdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Neijoerschdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20190422@kayaposoft.com
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+SUMMARY:Ouschterméindeg
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Dag vun der Aarbecht
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20190530@kayaposoft.com
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190531
+SUMMARY:Christi Himmelfaart
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20190610@kayaposoft.com
+DTSTART;VALUE=DATE:20190610
+DTEND;VALUE=DATE:20190611
+SUMMARY:Péngschtméindeg
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20190623@kayaposoft.com
+DTSTART;VALUE=DATE:20190623
+DTEND;VALUE=DATE:20190624
+SUMMARY:Nationalfeierdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20190815@kayaposoft.com
+DTSTART;VALUE=DATE:20190815
+DTEND;VALUE=DATE:20190816
+SUMMARY:Mariä Himmelfaart
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20191101@kayaposoft.com
+DTSTART;VALUE=DATE:20191101
+DTEND;VALUE=DATE:20191102
+SUMMARY:Allerhellgen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Chrëschtdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:Stiefesdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Neijoerschdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20200413@kayaposoft.com
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+SUMMARY:Ouschterméindeg
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Dag vun der Aarbecht
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20200521@kayaposoft.com
+DTSTART;VALUE=DATE:20200521
+DTEND;VALUE=DATE:20200522
+SUMMARY:Christi Himmelfaart
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20200601@kayaposoft.com
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+SUMMARY:Péngschtméindeg
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20200623@kayaposoft.com
+DTSTART;VALUE=DATE:20200623
+DTEND;VALUE=DATE:20200624
+SUMMARY:Nationalfeierdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20200815@kayaposoft.com
+DTSTART;VALUE=DATE:20200815
+DTEND;VALUE=DATE:20200816
+SUMMARY:Mariä Himmelfaart
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20201101@kayaposoft.com
+DTSTART;VALUE=DATE:20201101
+DTEND;VALUE=DATE:20201102
+SUMMARY:Allerhellgen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Chrëschtdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-lux-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:Stiefesdag
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/macedonia.ics b/app/src/main/assets/macedonia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..5574491c6ff553a831d1b27f7f6b73d0137f9fa5
--- /dev/null
+++ b/app/src/main/assets/macedonia.ics
@@ -0,0 +1,239 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-mkd-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Нова Година\, Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20180108@kayaposoft.com
+DTSTART;VALUE=DATE:20180108
+DTEND;VALUE=DATE:20180109
+SUMMARY:Прв ден Божик\, Prv den Božik
+DESCRIPTION:Holiday in lieu of 7 Jan 2018
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20180409@kayaposoft.com
+DTSTART;VALUE=DATE:20180409
+DTEND;VALUE=DATE:20180410
+SUMMARY:Втор ден Велигден\, Vtor den Veligden
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Ден на трудот\, Den na trudot
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20180524@kayaposoft.com
+DTSTART;VALUE=DATE:20180524
+DTEND;VALUE=DATE:20180525
+SUMMARY:Св. Кирил и Методиј\, Ден на сèсловенските просветители; Sv. Kiril i Metodij\, Den na sèslovenskite prosvetiteli
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20180615@kayaposoft.com
+DTSTART;VALUE=DATE:20180615
+DTEND;VALUE=DATE:20180616
+SUMMARY:Рамазан Бајрам\, Ramazan Bajram
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20180802@kayaposoft.com
+DTSTART;VALUE=DATE:20180802
+DTEND;VALUE=DATE:20180803
+SUMMARY:Ден на Републиката\, Den na Republikata
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20180908@kayaposoft.com
+DTSTART;VALUE=DATE:20180908
+DTEND;VALUE=DATE:20180909
+SUMMARY:Ден на независноста\, Den na nezavisnosta
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20181011@kayaposoft.com
+DTSTART;VALUE=DATE:20181011
+DTEND;VALUE=DATE:20181012
+SUMMARY:Ден на востанието\, Den na vostanieto
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20181023@kayaposoft.com
+DTSTART;VALUE=DATE:20181023
+DTEND;VALUE=DATE:20181024
+SUMMARY:Ден на македонската револуционерна борба\, Den na makedonskata revolucionarna borba
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20181208@kayaposoft.com
+DTSTART;VALUE=DATE:20181208
+DTEND;VALUE=DATE:20181209
+SUMMARY:Св. Климент Охридски\, Sv. Kliment Ohridski
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Нова Година\, Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20190107@kayaposoft.com
+DTSTART;VALUE=DATE:20190107
+DTEND;VALUE=DATE:20190108
+SUMMARY:Прв ден Божик\, Prv den Božik
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20190429@kayaposoft.com
+DTSTART;VALUE=DATE:20190429
+DTEND;VALUE=DATE:20190430
+SUMMARY:Втор ден Велигден\, Vtor den Veligden
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Ден на трудот\, Den na trudot
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20190524@kayaposoft.com
+DTSTART;VALUE=DATE:20190524
+DTEND;VALUE=DATE:20190525
+SUMMARY:Св. Кирил и Методиј\, Ден на сèсловенските просветители; Sv. Kiril i Metodij\, Den na sèslovenskite prosvetiteli
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20190604@kayaposoft.com
+DTSTART;VALUE=DATE:20190604
+DTEND;VALUE=DATE:20190605
+SUMMARY:Рамазан Бајрам\, Ramazan Bajram
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20190802@kayaposoft.com
+DTSTART;VALUE=DATE:20190802
+DTEND;VALUE=DATE:20190803
+SUMMARY:Ден на Републиката\, Den na Republikata
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20190909@kayaposoft.com
+DTSTART;VALUE=DATE:20190909
+DTEND;VALUE=DATE:20190910
+SUMMARY:Ден на независноста\, Den na nezavisnosta
+DESCRIPTION:Holiday in lieu of 8 Sep 2019
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20191011@kayaposoft.com
+DTSTART;VALUE=DATE:20191011
+DTEND;VALUE=DATE:20191012
+SUMMARY:Ден на востанието\, Den na vostanieto
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20191023@kayaposoft.com
+DTSTART;VALUE=DATE:20191023
+DTEND;VALUE=DATE:20191024
+SUMMARY:Ден на македонската револуционерна борба\, Den na makedonskata revolucionarna borba
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20191209@kayaposoft.com
+DTSTART;VALUE=DATE:20191209
+DTEND;VALUE=DATE:20191210
+SUMMARY:Св. Климент Охридски\, Sv. Kliment Ohridski
+DESCRIPTION:Holiday in lieu of 8 Dec 2019
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Нова Година\, Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20200107@kayaposoft.com
+DTSTART;VALUE=DATE:20200107
+DTEND;VALUE=DATE:20200108
+SUMMARY:Прв ден Божик\, Prv den Božik
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20200420@kayaposoft.com
+DTSTART;VALUE=DATE:20200420
+DTEND;VALUE=DATE:20200421
+SUMMARY:Втор ден Велигден\, Vtor den Veligden
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Ден на трудот\, Den na trudot
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20200524@kayaposoft.com
+DTSTART;VALUE=DATE:20200524
+DTEND;VALUE=DATE:20200525
+SUMMARY:Рамазан Бајрам\, Ramazan Bajram
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20200525@kayaposoft.com
+DTSTART;VALUE=DATE:20200525
+DTEND;VALUE=DATE:20200526
+SUMMARY:Св. Кирил и Методиј\, Ден на сèсловенските просветители; Sv. Kiril i Metodij\, Den na sèslovenskite prosvetiteli
+DESCRIPTION:Holiday in lieu of 24 May 2020
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20200803@kayaposoft.com
+DTSTART;VALUE=DATE:20200803
+DTEND;VALUE=DATE:20200804
+SUMMARY:Ден на Републиката\, Den na Republikata
+DESCRIPTION:Holiday in lieu of 2 Aug 2020
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20200908@kayaposoft.com
+DTSTART;VALUE=DATE:20200908
+DTEND;VALUE=DATE:20200909
+SUMMARY:Ден на независноста\, Den na nezavisnosta
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20201012@kayaposoft.com
+DTSTART;VALUE=DATE:20201012
+DTEND;VALUE=DATE:20201013
+SUMMARY:Ден на востанието\, Den na vostanieto
+DESCRIPTION:Holiday in lieu of 11 Oct 2020
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20201023@kayaposoft.com
+DTSTART;VALUE=DATE:20201023
+DTEND;VALUE=DATE:20201024
+SUMMARY:Ден на македонската револуционерна борба\, Den na makedonskata revolucionarna borba
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mkd-20201208@kayaposoft.com
+DTSTART;VALUE=DATE:20201208
+DTEND;VALUE=DATE:20201209
+SUMMARY:Св. Климент Охридски\, Sv. Kliment Ohridski
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/mexico.ics b/app/src/main/assets/mexico.ics
new file mode 100644
index 0000000000000000000000000000000000000000..a90511f211234613a13be1c878c50a295f6fb74d
--- /dev/null
+++ b/app/src/main/assets/mexico.ics
@@ -0,0 +1,156 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-mex-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Año Nuevo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20180205@kayaposoft.com
+DTSTART;VALUE=DATE:20180205
+DTEND;VALUE=DATE:20180206
+SUMMARY:Día de la Constitución Mexicana
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20180319@kayaposoft.com
+DTSTART;VALUE=DATE:20180319
+DTEND;VALUE=DATE:20180320
+SUMMARY:Natalicio de Benito Juárez
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Día del Trabajo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20180916@kayaposoft.com
+DTSTART;VALUE=DATE:20180916
+DTEND;VALUE=DATE:20180917
+SUMMARY:Día de la Independencia
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20181119@kayaposoft.com
+DTSTART;VALUE=DATE:20181119
+DTEND;VALUE=DATE:20181120
+SUMMARY:Revolución Mexicana
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20181201@kayaposoft.com
+DTSTART;VALUE=DATE:20181201
+DTEND;VALUE=DATE:20181202
+SUMMARY:Transmisión del Poder Ejecutivo Federal
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Día de Navidad
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Año Nuevo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20190204@kayaposoft.com
+DTSTART;VALUE=DATE:20190204
+DTEND;VALUE=DATE:20190205
+SUMMARY:Día de la Constitución Mexicana
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20190318@kayaposoft.com
+DTSTART;VALUE=DATE:20190318
+DTEND;VALUE=DATE:20190319
+SUMMARY:Natalicio de Benito Juárez
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Día del Trabajo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20190916@kayaposoft.com
+DTSTART;VALUE=DATE:20190916
+DTEND;VALUE=DATE:20190917
+SUMMARY:Día de la Independencia
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20191118@kayaposoft.com
+DTSTART;VALUE=DATE:20191118
+DTEND;VALUE=DATE:20191119
+SUMMARY:Revolución Mexicana
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Día de Navidad
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Año Nuevo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20200203@kayaposoft.com
+DTSTART;VALUE=DATE:20200203
+DTEND;VALUE=DATE:20200204
+SUMMARY:Día de la Constitución Mexicana
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20200316@kayaposoft.com
+DTSTART;VALUE=DATE:20200316
+DTEND;VALUE=DATE:20200317
+SUMMARY:Natalicio de Benito Juárez
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Día del Trabajo
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20200916@kayaposoft.com
+DTSTART;VALUE=DATE:20200916
+DTEND;VALUE=DATE:20200917
+SUMMARY:Día de la Independencia
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20201116@kayaposoft.com
+DTSTART;VALUE=DATE:20201116
+DTEND;VALUE=DATE:20201117
+SUMMARY:Revolución Mexicana
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-mex-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Día de Navidad
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/netherlands.ics b/app/src/main/assets/netherlands.ics
new file mode 100644
index 0000000000000000000000000000000000000000..cf145463cabc0f9c873f0aca987b950c5b1631d5
--- /dev/null
+++ b/app/src/main/assets/netherlands.ics
@@ -0,0 +1,198 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-nld-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Nieuwjaar
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20180401@kayaposoft.com
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+SUMMARY:Eerste Paasdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20180402@kayaposoft.com
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+SUMMARY:Tweede Paasdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20180427@kayaposoft.com
+DTSTART;VALUE=DATE:20180427
+DTEND;VALUE=DATE:20180428
+SUMMARY:Koningsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20180510@kayaposoft.com
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180511
+SUMMARY:Hemelvaartsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20180520@kayaposoft.com
+DTSTART;VALUE=DATE:20180520
+DTEND;VALUE=DATE:20180521
+SUMMARY:Eerste Pinksterdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20180521@kayaposoft.com
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180522
+SUMMARY:Tweede Pinksterdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Eerste Kerstdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:Tweede Kerstdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Nieuwjaar
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20190421@kayaposoft.com
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+SUMMARY:Eerste Paasdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20190422@kayaposoft.com
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+SUMMARY:Tweede Paasdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20190427@kayaposoft.com
+DTSTART;VALUE=DATE:20190427
+DTEND;VALUE=DATE:20190428
+SUMMARY:Koningsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20190530@kayaposoft.com
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190531
+SUMMARY:Hemelvaartsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20190609@kayaposoft.com
+DTSTART;VALUE=DATE:20190609
+DTEND;VALUE=DATE:20190610
+SUMMARY:Eerste Pinksterdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20190610@kayaposoft.com
+DTSTART;VALUE=DATE:20190610
+DTEND;VALUE=DATE:20190611
+SUMMARY:Tweede Pinksterdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Eerste Kerstdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:Tweede Kerstdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Nieuwjaar
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20200412@kayaposoft.com
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+SUMMARY:Eerste Paasdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20200413@kayaposoft.com
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+SUMMARY:Tweede Paasdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20200427@kayaposoft.com
+DTSTART;VALUE=DATE:20200427
+DTEND;VALUE=DATE:20200428
+SUMMARY:Koningsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20200505@kayaposoft.com
+DTSTART;VALUE=DATE:20200505
+DTEND;VALUE=DATE:20200506
+SUMMARY:Bevrijdingsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20200521@kayaposoft.com
+DTSTART;VALUE=DATE:20200521
+DTEND;VALUE=DATE:20200522
+SUMMARY:Hemelvaartsdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20200531@kayaposoft.com
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200601
+SUMMARY:Eerste Pinksterdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20200601@kayaposoft.com
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+SUMMARY:Tweede Pinksterdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Eerste Kerstdag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-nld-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:Tweede Kerstdag
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/norway.ics b/app/src/main/assets/norway.ics
new file mode 100644
index 0000000000000000000000000000000000000000..88f4edc2eadb82a27cffcf29201dd51affc89ca3
--- /dev/null
+++ b/app/src/main/assets/norway.ics
@@ -0,0 +1,420 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Kristi himmelfartsdag
+UID:7f15028e-3ae0-43f8-bf9b-0e4a672f6fe5
+DTSTART;VALUE=DATE:20170525
+DTEND;VALUE=DATE:20170526
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pinsedag
+UID:9645b363-af9c-49ab-91a1-0cc072deb3dc
+DTSTART;VALUE=DATE:20170604
+DTEND;VALUE=DATE:20170605
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. pinsedag
+UID:f6da2bb5-85c3-4edb-bb3e-79975ede524a
+DTSTART;VALUE=DATE:20170605
+DTEND;VALUE=DATE:20170606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Skjærtorsdag
+UID:af1cd706-130e-4659-bbe8-42e1c5c0df0f
+DTSTART;VALUE=DATE:20180329
+DTEND;VALUE=DATE:20180330
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Langfredag
+UID:a5441ccd-1a9a-4bd0-a32d-57aabb242e57
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Påskedag
+UID:43c65367-7890-47ff-9b71-932f29c6051a
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. påskedag
+UID:634ae48c-f550-494c-a460-fc2c689db36e
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Kristi himmelfartsdag
+UID:75d31850-787b-453c-bd79-b9b217bc80af
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180511
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pinsedag
+UID:1d1ea5bc-9d93-445e-8f15-5c5a06d67e24
+DTSTART;VALUE=DATE:20180520
+DTEND;VALUE=DATE:20180521
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. pinsedag
+UID:d3b76824-c2f2-4fc9-8af4-43db004a6d84
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Palmesøndag
+UID:8f1ebf54-a08b-4011-892d-6938edae0a8e
+DTSTART;VALUE=DATE:20190414
+DTEND;VALUE=DATE:20190415
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Skjærtorsdag
+UID:93683990-487d-4742-8102-cd4bb990ea97
+DTSTART;VALUE=DATE:20190418
+DTEND;VALUE=DATE:20190419
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Langfredag
+UID:32bc03a4-5113-42b0-8e4b-b0e72f2c009f
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Påskedag
+UID:945edfd5-bff7-418d-a85f-db22587b57dd
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. påskedag
+UID:efa8ed4e-e762-43ea-b4ab-3e4fe895e160
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Kristi himmelfartsdag
+UID:3c2fb3c6-0055-41ef-bcd8-63b969be38dd
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190531
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pinsedag
+UID:f9a20766-a0f7-4e70-8fa8-1e63fbc4ec29
+DTSTART;VALUE=DATE:20190609
+DTEND;VALUE=DATE:20190610
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. pinsedag
+UID:9fb78540-a8c8-425c-8bf0-7706eb78908b
+DTSTART;VALUE=DATE:20190610
+DTEND;VALUE=DATE:20190611
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Palmesøndag
+UID:c248d3ba-d695-47fc-856c-0379061ca6bf
+DTSTART;VALUE=DATE:20200405
+DTEND;VALUE=DATE:20200406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Skjærtorsdag
+UID:cdce9a51-92f2-44db-8f88-0cfd10b6db29
+DTSTART;VALUE=DATE:20200409
+DTEND;VALUE=DATE:20200410
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Langfredag
+UID:23292ea1-2c22-42f7-92b3-9e8c65095157
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Påskedag
+UID:e96985ee-579d-41f8-9239-88044c233e19
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. påskedag
+UID:f7535533-4e97-45d1-ab07-71be7a28d704
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Kristi himmelfartsdag
+UID:350b665f-1ffc-4fc6-ac5b-5e51a1ff98cd
+DTSTART;VALUE=DATE:20200521
+DTEND;VALUE=DATE:20200522
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pinsedag
+UID:f225f91a-6799-4e9a-a5f6-fd747ba664aa
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. pinsedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a32
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Skjærtorsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a33
+DTSTART;VALUE=DATE:20210401
+DTEND;VALUE=DATE:20210402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Langfredag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a34
+DTSTART;VALUE=DATE:20210402
+DTEND;VALUE=DATE:20210403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Påskedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a35
+DTSTART;VALUE=DATE:20210404
+DTEND;VALUE=DATE:20210405
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. påskedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a36
+DTSTART;VALUE=DATE:20210405
+DTEND;VALUE=DATE:20210406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Kr. himmelfartsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a37
+DTSTART;VALUE=DATE:20210513
+DTEND;VALUE=DATE:20210514
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pinsedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a38
+DTSTART;VALUE=DATE:20210523
+DTEND;VALUE=DATE:20210524
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. pinsedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a39
+DTSTART;VALUE=DATE:20210524
+DTEND;VALUE=DATE:20210525
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Skjærtorsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a40
+DTSTART;VALUE=DATE:20220414
+DTEND;VALUE=DATE:20220415
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Langfredag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a41
+DTSTART;VALUE=DATE:20220415
+DTEND;VALUE=DATE:20220416
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Påskedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a42
+DTSTART;VALUE=DATE:20220417
+DTEND;VALUE=DATE:20220418
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. påskedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a43
+DTSTART;VALUE=DATE:20220418
+DTEND;VALUE=DATE:20220419
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Kr. himmelfartsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a44
+DTSTART;VALUE=DATE:20220526
+DTEND;VALUE=DATE:20220527
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pinsedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a45
+DTSTART;VALUE=DATE:20220605
+DTEND;VALUE=DATE:20220606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. pinsedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a46
+DTSTART;VALUE=DATE:20220606
+DTEND;VALUE=DATE:20220607
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Skjærtorsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a47
+DTSTART;VALUE=DATE:20230406
+DTEND;VALUE=DATE:20230407
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Langfredag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a48
+DTSTART;VALUE=DATE:20230407
+DTEND;VALUE=DATE:20230408
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Påskedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a49
+DTSTART;VALUE=DATE:20230409
+DTEND;VALUE=DATE:20230410
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. påskedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a50
+DTSTART;VALUE=DATE:20230410
+DTEND;VALUE=DATE:20230411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Kr. himmelfartsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a51
+DTSTART;VALUE=DATE:20230518
+DTEND;VALUE=DATE:20230519
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pinsedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a52
+DTSTART;VALUE=DATE:20230528
+DTEND;VALUE=DATE:20230529
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. pinsedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a53
+DTSTART;VALUE=DATE:20230529
+DTEND;VALUE=DATE:20230530
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Skjærtorsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a54
+DTSTART;VALUE=DATE:20240328
+DTEND;VALUE=DATE:20240329
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Langfredag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a55
+DTSTART;VALUE=DATE:20240329
+DTEND;VALUE=DATE:20240330
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Påskedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a56
+DTSTART;VALUE=DATE:20240331
+DTEND;VALUE=DATE:20240401
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. påskedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a57
+DTSTART;VALUE=DATE:20240401
+DTEND;VALUE=DATE:20240402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Kr. himmelfartsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a58
+DTSTART;VALUE=DATE:20240509
+DTEND;VALUE=DATE:20240510
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Pinsedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a59
+DTSTART;VALUE=DATE:20240519
+DTEND;VALUE=DATE:20240520
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. pinsedag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a60
+DTSTART;VALUE=DATE:20240520
+DTEND;VALUE=DATE:20240521
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Nyttårsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a61
+DTSTART;VALUE=DATE:20020101
+DTEND;VALUE=DATE:20020102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Off. høytidsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a62
+DTSTART;VALUE=DATE:20020501
+DTEND;VALUE=DATE:20020502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Grunnlovsdag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a63
+DTSTART;VALUE=DATE:20020517
+DTEND;VALUE=DATE:20020518
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Juledag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a64
+DTSTART;VALUE=DATE:20021225
+DTEND;VALUE=DATE:20021226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:2. juledag
+UID:1c278a1f-8dd5-46cd-ad16-7dfacf731a65
+DTSTART;VALUE=DATE:20021226
+DTEND;VALUE=DATE:20021227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/pakistan.ics b/app/src/main/assets/pakistan.ics
new file mode 100644
index 0000000000000000000000000000000000000000..1c2d6b0b81d3d462b4bb0b828c0e92722e999213
--- /dev/null
+++ b/app/src/main/assets/pakistan.ics
@@ -0,0 +1,74 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:یوم پاکستان
+UID:a3f668f9-567c-4c6d-84d6-bc13049aa857
+DTSTART;VALUE=DATE:20080323
+DTEND;VALUE=DATE:20080324
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:یوم وفات محمد اقبال
+UID:57c5ccf2-e9b2-4e69-84cc-00dee4facbfe
+DTSTART;VALUE=DATE:20080421
+DTEND;VALUE=DATE:20080422
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:یوم کاریگر
+UID:168d52c0-e697-4470-9750-f7b62cd8f09c
+DTSTART;VALUE=DATE:20080501
+DTEND;VALUE=DATE:20080502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:یوم تکبیر
+UID:c59717c1-ac2f-4ff3-a066-900804b2388a
+DTSTART;VALUE=DATE:20080528
+DTEND;VALUE=DATE:20080529
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:یوم آذادی
+UID:b2c80250-3838-4486-b7b2-7caf04e13844
+DTSTART;VALUE=DATE:20080814
+DTEND;VALUE=DATE:20080815
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:یوم دفاع
+UID:0841b6f9-592a-49a9-aedd-227784d94a18
+DTSTART;VALUE=DATE:20080906
+DTEND;VALUE=DATE:20080907
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:یوم وفات قائد اعظم
+UID:9ae7a408-5dd2-4312-a0d4-cc2a31e31f00
+DTSTART;VALUE=DATE:20080911
+DTEND;VALUE=DATE:20080912
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:یوم ولادت محمد اقبال
+UID:3ced098d-f2bf-4e03-bf7f-4e4c8aff1d44
+DTSTART;VALUE=DATE:20081109
+DTEND;VALUE=DATE:20081110
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY: یوم ولادت قائداعظم، عيد الميلاد المسيح
+UID:f1734034-058f-437b-9a91-1e68f421c086
+DTSTART;VALUE=DATE:20081225
+DTEND;VALUE=DATE:20081226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/poland.ics b/app/src/main/assets/poland.ics
new file mode 100644
index 0000000000000000000000000000000000000000..472cd5d22b746c0226de010bfb844ebeff191cc9
--- /dev/null
+++ b/app/src/main/assets/poland.ics
@@ -0,0 +1,172 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego)
+UID:d85e837e-b0fc-416e-8e3e-38cdef142ef8
+DTSTART;VALUE=DATE:20170604
+DTEND;VALUE=DATE:20170605
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boże Ciało
+UID:6c617f79-61c2-4afb-aa5d-0eec34d1cb2a
+DTSTART;VALUE=DATE:20170615
+DTEND;VALUE=DATE:20170616
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Wielkanoc
+UID:0fc4858b-f58d-4fa9-ab7a-95e71739f352
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus)
+UID:1a83a638-a9cc-4512-85e3-12ff321b4a59
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego)
+UID:2ed33158-f0b8-44e2-92e1-481168a7d50e
+DTSTART;VALUE=DATE:20180520
+DTEND;VALUE=DATE:20180521
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boże Ciało
+UID:b9b453fd-4e79-4dd4-99bc-ad932dbf0cb7
+DTSTART;VALUE=DATE:20180531
+DTEND;VALUE=DATE:20180601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Wielkanoc
+UID:046a2f44-e53b-48bd-9a04-d61004e139e6
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus)
+UID:39c19ab0-32a4-4614-a297-39bac5a39a5f
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego)
+UID:ac13f18f-a849-45e3-9a7d-d356a17699ff
+DTSTART;VALUE=DATE:20190609
+DTEND;VALUE=DATE:20190610
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boże Ciało
+UID:d8336121-8496-4ab3-b140-42fe4def8613
+DTSTART;VALUE=DATE:20190620
+DTEND;VALUE=DATE:20190621
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Wielkanoc
+UID:8cf02081-eb57-412a-901f-a9f1db4b3106
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Poniedziałek wielkanocny (Śmigus dyngus)
+UID:d20e2984-edb7-4dad-99e0-e871eea71c62
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Zielone Świątki (Zesłanie Ducha Świętego)
+UID:e1b97ad6-4c46-473a-b18c-4ee32a7eb010
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boże Ciało
+UID:5fbbd989-059f-4bc0-ac82-c21cbfa52242
+DTSTART;VALUE=DATE:20200611
+DTEND;VALUE=DATE:20200612
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Nowy rok
+UID:{9637e1da-f635-4bd4-a8ce-012fcf421fd2}
+DTSTART;VALUE=DATE:20090101
+DTEND;VALUE=DATE:20090102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Święto Pracy
+UID:{582c7073-0929-4c40-a716-ea41d8f87253}
+DTSTART;VALUE=DATE:20090501
+DTEND;VALUE=DATE:20090502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Święto Narodowe Trzeciego Maja
+UID:{28750805-c40a-4db2-b9f8-803ab4c30c16}
+DTSTART;VALUE=DATE:20090503
+DTEND;VALUE=DATE:20090504
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Wniebowzięcia NMP / Święto Wojska Polskiego
+UID:{7a63afcc-13df-48f9-8ba7-3657a212cf6d}
+DTSTART;VALUE=DATE:20090815
+DTEND;VALUE=DATE:20090816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Wszystkich Świętych
+UID:{5c88bdef-b7d8-4cf7-b918-900ce4a346a3}
+DTSTART;VALUE=DATE:20091101
+DTEND;VALUE=DATE:20091102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Narodowe Święto Niepodległości
+UID:{c2ffd0df-b7fa-49b8-baea-b5bfb0b30a02}
+DTSTART;VALUE=DATE:20091111
+DTEND;VALUE=DATE:20091112
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boże Narodzenie
+UID:{277dcc9c-5295-4d95-8a65-5cb978bf073a}
+DTSTART;VALUE=DATE:20091225
+DTEND;VALUE=DATE:20091227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Drugi dzień Bożego Narodzenia
+UID:{891776dc-6d0f-4fa4-89e6-e7d5a1f53053}
+DTSTART;VALUE=DATE:20091226
+DTEND;VALUE=DATE:20091227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Objawienie Pańskie (Trzech Króli)
+UID:a0ae6a7f-93ce-47ee-b1cb-991c0ffee5bf
+DTSTART;VALUE=DATE:20110106
+DTEND;VALUE=DATE:20110107
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/portugal.ics b/app/src/main/assets/portugal.ics
new file mode 100644
index 0000000000000000000000000000000000000000..5a14f06afff2bc8011d85692065499acafa1892c
--- /dev/null
+++ b/app/src/main/assets/portugal.ics
@@ -0,0 +1,439 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:8ea296fc-d77c-4daa-bb35-7ef0f31bbd35
+DTSTART;VALUE=DATE:20170615
+DTEND;VALUE=DATE:20170616
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:efec0135-5fb2-4fc3-b7df-9ee7253150b6
+DTSTART;VALUE=DATE:20180213
+DTEND;VALUE=DATE:20180214
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:5ac77215-3c32-4ea6-94d8-c17e39d123cb
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:4ef32d8f-eb43-4225-a035-4cc727056a5e
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:b6eb9c00-5d32-46ad-af25-1e4ceb7e24d4
+DTSTART;VALUE=DATE:20180531
+DTEND;VALUE=DATE:20180601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:ebd07183-101a-4e8a-b630-084010395c75
+DTSTART;VALUE=DATE:20190305
+DTEND;VALUE=DATE:20190306
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:9319a404-2caa-4860-ab8e-7250c4b26c70
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:c8abc003-8656-4c03-b463-281757c9d6c7
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:5adec9d3-8289-4590-a7d7-15d3beb199e7
+DTSTART;VALUE=DATE:20190620
+DTEND;VALUE=DATE:20190621
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:9134149e-787b-4841-802e-6a1b68914bff
+DTSTART;VALUE=DATE:20200225
+DTEND;VALUE=DATE:20200226
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:07d98915-7fa6-4591-9257-311a35109bf9
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:4bf48b56-7499-4d00-9ee7-6047a2ca8e36
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:f8e5c7e1-8355-4681-ade1-d403e0b6ca23
+DTSTART;VALUE=DATE:20200611
+DTEND;VALUE=DATE:20200612
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:c1bcf217-b07e-471b-bf98-a8eaa253b4fb
+DTSTART;VALUE=DATE:20210216
+DTEND;VALUE=DATE:20210217
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:baa729bb-7145-4cbc-bbd7-00e752ee5b5f
+DTSTART;VALUE=DATE:20210402
+DTEND;VALUE=DATE:20210403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:0ef18ed2-0318-4619-a08f-9bace518ea6b
+DTSTART;VALUE=DATE:20210404
+DTEND;VALUE=DATE:20210405
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:b71bfbee-dba7-4c79-bf07-a2fc4643885e
+DTSTART;VALUE=DATE:20210603
+DTEND;VALUE=DATE:20210604
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:34393672-a43f-4d16-85ec-e2783be1a05c
+DTSTART;VALUE=DATE:20220301
+DTEND;VALUE=DATE:20220302
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:aea2a84a-da17-4f91-b160-15a89afa52cc
+DTSTART;VALUE=DATE:20220415
+DTEND;VALUE=DATE:20220416
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:e435c5bd-f5a2-487a-ac4e-b56745b89d14
+DTSTART;VALUE=DATE:20220417
+DTEND;VALUE=DATE:20220418
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:023a861a-d37e-45f9-b595-6ee750333b3e
+DTSTART;VALUE=DATE:20220616
+DTEND;VALUE=DATE:20220617
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:6ae751a9-75b9-4c40-a6a2-d7dcff275d90
+DTSTART;VALUE=DATE:20230221
+DTEND;VALUE=DATE:20230222
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:a97015e0-4479-48fa-9720-d2d64b5121fa
+DTSTART;VALUE=DATE:20230407
+DTEND;VALUE=DATE:20230408
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:2c78c1b0-9167-4aa3-b9ab-6a904c3968ee
+DTSTART;VALUE=DATE:20230409
+DTEND;VALUE=DATE:20230410
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:fd053ba5-e0fa-431a-ac48-86bea8657167
+DTSTART;VALUE=DATE:20230608
+DTEND;VALUE=DATE:20230609
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:4d992236-76a1-4764-b551-25059527350c
+DTSTART;VALUE=DATE:20240213
+DTEND;VALUE=DATE:20240214
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:cbd961b8-ce49-4e59-9d1c-998e1c6fd3ee
+DTSTART;VALUE=DATE:20240329
+DTEND;VALUE=DATE:20240330
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:1824da6f-f0a0-4faa-a028-8ac59914439b
+DTSTART;VALUE=DATE:20240530
+DTEND;VALUE=DATE:20240531
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:0839a8fe-67ef-49b3-8ca9-985a31792d4d
+DTSTART;VALUE=DATE:20250304
+DTEND;VALUE=DATE:20250305
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:2fb6f244-6722-4d55-b7f7-eb03d8bac186
+DTSTART;VALUE=DATE:20250418
+DTEND;VALUE=DATE:20250419
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:1c93fa44-78ad-48b6-8c9a-f78b14997c8e
+DTSTART;VALUE=DATE:20250420
+DTEND;VALUE=DATE:20250421
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:58b16e20-1093-40ab-87d6-063ef28a9cbf
+DTSTART;VALUE=DATE:20250619
+DTEND;VALUE=DATE:20250620
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:138c5a65-4df9-4d17-9410-5b53e9ff8b0a
+DTSTART;VALUE=DATE:20260217
+DTEND;VALUE=DATE:20260218
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:4e96f4cf-185a-411d-bee6-21eb5eb56b06
+DTSTART;VALUE=DATE:20260403
+DTEND;VALUE=DATE:20260404
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:2ddbd9f0-02aa-4b55-a30d-8b1a14ccedb3
+DTSTART;VALUE=DATE:20260405
+DTEND;VALUE=DATE:20260406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:04e53c14-c9a6-4ae1-9169-47c81231e4f5
+DTSTART;VALUE=DATE:20260604
+DTEND;VALUE=DATE:20260605
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:2617081c-c96d-4cf9-88fd-72688fb4910b
+DTSTART;VALUE=DATE:20270209
+DTEND;VALUE=DATE:20270210
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:aba7a9f2-a8bc-4b31-b6ec-86b0a92f11c0
+DTSTART;VALUE=DATE:20270326
+DTEND;VALUE=DATE:20270327
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:7f9c3fe9-06f5-45b0-ba55-2c8da8055b38
+DTSTART;VALUE=DATE:20270527
+DTEND;VALUE=DATE:20270528
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:918f486a-f745-4bb7-ab1b-3e4ae771845f
+DTSTART;VALUE=DATE:20280229
+DTEND;VALUE=DATE:20280301
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:516e9453-13ba-46f0-bd0a-e0996cf85dd7
+DTSTART;VALUE=DATE:20280414
+DTEND;VALUE=DATE:20280415
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:bf203169-cc8c-4329-9559-c89dc96c6695
+DTSTART;VALUE=DATE:20280416
+DTEND;VALUE=DATE:20280417
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:329fd131-869e-4855-805a-94b58c66241e
+DTSTART;VALUE=DATE:20280615
+DTEND;VALUE=DATE:20280616
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:bd294fef-c437-4351-ad44-986917cc79dd
+DTSTART;VALUE=DATE:20290213
+DTEND;VALUE=DATE:20290214
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:06104d63-a31c-419a-95b4-a03d4bb40cb1
+DTSTART;VALUE=DATE:20290330
+DTEND;VALUE=DATE:20290331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:ae8f5a91-1d01-49b7-b22b-4ca562a25a02
+DTSTART;VALUE=DATE:20290401
+DTEND;VALUE=DATE:20290402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:f33509dc-e9fc-4fb0-9c93-e3671e498f12
+DTSTART;VALUE=DATE:20290531
+DTEND;VALUE=DATE:20290601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Carnival 
+UID:faa77196-c452-4f05-a146-01048d362c23
+DTSTART;VALUE=DATE:20300305
+DTEND;VALUE=DATE:20300306
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Good Friday 
+UID:23bb3359-d3a8-4b1d-b45e-625c6aa9d7ab
+DTSTART;VALUE=DATE:20300419
+DTEND;VALUE=DATE:20300420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter 
+UID:c38cda82-92dc-49ce-b49f-a581213fef38
+DTSTART;VALUE=DATE:20300421
+DTEND;VALUE=DATE:20300422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi 
+UID:a3a2a74a-7c19-4ffb-9f19-519743bffd1d
+DTSTART;VALUE=DATE:20300620
+DTEND;VALUE=DATE:20300621
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:New Year
+UID:d0c7af02-7a6b-41e3-8421-cfd6895e1223
+DTSTART;VALUE=DATE:20010101
+DTEND;VALUE=DATE:20010102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Liberty Day
+UID:8b096e79-da0d-45f3-905d-80cdaddcb07c
+DTSTART;VALUE=DATE:20010425
+DTEND;VALUE=DATE:20010426
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Labour Day
+UID:26e3ea80-ba4b-4208-bd73-c07483cb87b5
+DTSTART;VALUE=DATE:20010501
+DTEND;VALUE=DATE:20010502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Day of Portugal
+UID:0317f4ef-6bb6-49db-a8f7-36957676e05f
+DTSTART;VALUE=DATE:20010610
+DTEND;VALUE=DATE:20010611
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Our Lady Assumption Day
+UID:66c355ac-f86b-4b62-9b88-bfab5da28dd9
+DTSTART;VALUE=DATE:20010815
+DTEND;VALUE=DATE:20010816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Republic Day
+UID:0a1bf4e7-50f8-4d3f-b449-e0f792b7fc9c
+DTSTART;VALUE=DATE:20011005
+DTEND;VALUE=DATE:20011006
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Day of All Saints
+UID:79b44222-18ac-47a6-9361-0f69c28c1038
+DTSTART;VALUE=DATE:20011101
+DTEND;VALUE=DATE:20011102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Independence Day
+UID:e5ab7efe-c4ce-4bb1-a8a4-e63e46de2d74
+DTSTART;VALUE=DATE:20011201
+DTEND;VALUE=DATE:20011202
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Imaculate Conception Day
+UID:44cf05dd-d95d-4759-be8e-d177e943189f
+DTSTART;VALUE=DATE:20011208
+DTEND;VALUE=DATE:20011209
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas
+UID:c6312a02-e749-42e4-855b-51af541b5fcd
+DTSTART;VALUE=DATE:20011225
+DTEND;VALUE=DATE:20011226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/romania.ics b/app/src/main/assets/romania.ics
new file mode 100644
index 0000000000000000000000000000000000000000..74ab34730156aaa1a3a0141758985f28f0a38437
--- /dev/null
+++ b/app/src/main/assets/romania.ics
@@ -0,0 +1,296 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-rou-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Anul nou
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20180102@kayaposoft.com
+DTSTART;VALUE=DATE:20180102
+DTEND;VALUE=DATE:20180103
+SUMMARY:Anul nou
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20180124@kayaposoft.com
+DTSTART;VALUE=DATE:20180124
+DTEND;VALUE=DATE:20180125
+SUMMARY:Unirea Principatelor Române/Mica Unire
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20180408@kayaposoft.com
+DTSTART;VALUE=DATE:20180408
+DTEND;VALUE=DATE:20180409
+SUMMARY:Paştele
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20180409@kayaposoft.com
+DTSTART;VALUE=DATE:20180409
+DTEND;VALUE=DATE:20180410
+SUMMARY:Doua zi de Pasti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Ziua muncii
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20180527@kayaposoft.com
+DTSTART;VALUE=DATE:20180527
+DTEND;VALUE=DATE:20180528
+SUMMARY:Rusaliile
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20180528@kayaposoft.com
+DTSTART;VALUE=DATE:20180528
+DTEND;VALUE=DATE:20180529
+SUMMARY:Doua zi de Rusaliile
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20180601@kayaposoft.com
+DTSTART;VALUE=DATE:20180601
+DTEND;VALUE=DATE:20180602
+SUMMARY:Ziua Copilului
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20180815@kayaposoft.com
+DTSTART;VALUE=DATE:20180815
+DTEND;VALUE=DATE:20180816
+SUMMARY:Adormirea Maicii Domnului/Sfânta Maria Mare
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20181130@kayaposoft.com
+DTSTART;VALUE=DATE:20181130
+DTEND;VALUE=DATE:20181201
+SUMMARY:Sfântul Andrei
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20181201@kayaposoft.com
+DTSTART;VALUE=DATE:20181201
+DTEND;VALUE=DATE:20181202
+SUMMARY:Ziua Națională/Marea Unire
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Crăciunul
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:Crăciunul
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Anul nou
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20190102@kayaposoft.com
+DTSTART;VALUE=DATE:20190102
+DTEND;VALUE=DATE:20190103
+SUMMARY:Anul nou
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20190124@kayaposoft.com
+DTSTART;VALUE=DATE:20190124
+DTEND;VALUE=DATE:20190125
+SUMMARY:Unirea Principatelor Române/Mica Unire
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20190428@kayaposoft.com
+DTSTART;VALUE=DATE:20190428
+DTEND;VALUE=DATE:20190429
+SUMMARY:Paştele
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20190429@kayaposoft.com
+DTSTART;VALUE=DATE:20190429
+DTEND;VALUE=DATE:20190430
+SUMMARY:Doua zi de Pasti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Ziua muncii
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20190601@kayaposoft.com
+DTSTART;VALUE=DATE:20190601
+DTEND;VALUE=DATE:20190602
+SUMMARY:Ziua Copilului
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20190616@kayaposoft.com
+DTSTART;VALUE=DATE:20190616
+DTEND;VALUE=DATE:20190617
+SUMMARY:Rusaliile
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20190617@kayaposoft.com
+DTSTART;VALUE=DATE:20190617
+DTEND;VALUE=DATE:20190618
+SUMMARY:Doua zi de Rusaliile
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20190815@kayaposoft.com
+DTSTART;VALUE=DATE:20190815
+DTEND;VALUE=DATE:20190816
+SUMMARY:Adormirea Maicii Domnului/Sfânta Maria Mare
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20191130@kayaposoft.com
+DTSTART;VALUE=DATE:20191130
+DTEND;VALUE=DATE:20191201
+SUMMARY:Sfântul Andrei
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20191201@kayaposoft.com
+DTSTART;VALUE=DATE:20191201
+DTEND;VALUE=DATE:20191202
+SUMMARY:Ziua Națională/Marea Unire
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Crăciunul
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:Crăciunul
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Anul nou
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20200102@kayaposoft.com
+DTSTART;VALUE=DATE:20200102
+DTEND;VALUE=DATE:20200103
+SUMMARY:Anul nou
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20200124@kayaposoft.com
+DTSTART;VALUE=DATE:20200124
+DTEND;VALUE=DATE:20200125
+SUMMARY:Unirea Principatelor Române/Mica Unire
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20200419@kayaposoft.com
+DTSTART;VALUE=DATE:20200419
+DTEND;VALUE=DATE:20200420
+SUMMARY:Paştele
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20200420@kayaposoft.com
+DTSTART;VALUE=DATE:20200420
+DTEND;VALUE=DATE:20200421
+SUMMARY:Doua zi de Pasti
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Ziua muncii
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20200601@kayaposoft.com
+DTSTART;VALUE=DATE:20200601
+DTEND;VALUE=DATE:20200602
+SUMMARY:Ziua Copilului
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20200607@kayaposoft.com
+DTSTART;VALUE=DATE:20200607
+DTEND;VALUE=DATE:20200608
+SUMMARY:Rusaliile
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20200608@kayaposoft.com
+DTSTART;VALUE=DATE:20200608
+DTEND;VALUE=DATE:20200609
+SUMMARY:Doua zi de Rusaliile
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20200815@kayaposoft.com
+DTSTART;VALUE=DATE:20200815
+DTEND;VALUE=DATE:20200816
+SUMMARY:Adormirea Maicii Domnului/Sfânta Maria Mare
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20201130@kayaposoft.com
+DTSTART;VALUE=DATE:20201130
+DTEND;VALUE=DATE:20201201
+SUMMARY:Sfântul Andrei
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20201201@kayaposoft.com
+DTSTART;VALUE=DATE:20201201
+DTEND;VALUE=DATE:20201202
+SUMMARY:Ziua Națională/Marea Unire
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Crăciunul
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-rou-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:Crăciunul
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/russia.ics b/app/src/main/assets/russia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..af3995cb6662dd38ba149d3e3dbd221e3295ae58
--- /dev/null
+++ b/app/src/main/assets/russia.ics
@@ -0,0 +1,74 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Новый год
+UID:8147ef1b-8301-4ea8-b712-90a394f647a3
+DTSTART;VALUE=DATE:20100101
+DTEND;VALUE=DATE:20100102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Новогодние каникулы
+UID:b3408b45-b00a-4e23-b40a-57760a2e6bd1
+DTSTART;VALUE=DATE:20100102
+DTEND;VALUE=DATE:20100106
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Рождество Христово
+UID:49660752-db14-42f7-bfa4-bd264111e513
+DTSTART;VALUE=DATE:20100107
+DTEND;VALUE=DATE:20100108
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:День защитника Отечества
+UID:14cd5330-c5d4-4580-a2d5-05986920c48e
+DTSTART;VALUE=DATE:20100223
+DTEND;VALUE=DATE:20100224
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Международный женский день
+UID:4c8df85c-86ac-46cf-b271-877c02166e9e
+DTSTART;VALUE=DATE:20100308
+DTEND;VALUE=DATE:20100309
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Праздник весны и труда
+UID:71c1345a-04fe-480f-a134-f5b9bed0f807
+DTSTART;VALUE=DATE:20100501
+DTEND;VALUE=DATE:20100502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:День Победы
+UID:593ebbe1-cce3-4b01-9979-3578b3b3b7ec
+DTSTART;VALUE=DATE:20100509
+DTEND;VALUE=DATE:20100510
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:День России
+UID:fc0d48b2-41d8-4993-83eb-6e9fdbd4741a
+DTSTART;VALUE=DATE:20100612
+DTEND;VALUE=DATE:20100613
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:День народного единства
+UID:8fb6d2cc-728c-4e99-99fc-83757d05f359
+DTSTART;VALUE=DATE:20101104
+DTEND;VALUE=DATE:20101105
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/serbia.ics b/app/src/main/assets/serbia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..21bcf277f1ea69ee17a725bb5c77f3d58fcc6664
--- /dev/null
+++ b/app/src/main/assets/serbia.ics
@@ -0,0 +1,247 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-srb-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20180102@kayaposoft.com
+DTSTART;VALUE=DATE:20180102
+DTEND;VALUE=DATE:20180103
+SUMMARY:Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20180107@kayaposoft.com
+DTSTART;VALUE=DATE:20180107
+DTEND;VALUE=DATE:20180108
+SUMMARY:Božić
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20180215@kayaposoft.com
+DTSTART;VALUE=DATE:20180215
+DTEND;VALUE=DATE:20180216
+SUMMARY:Dan državnosti Srbije
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20180216@kayaposoft.com
+DTSTART;VALUE=DATE:20180216
+DTEND;VALUE=DATE:20180217
+SUMMARY:Dan državnosti Srbije
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20180406@kayaposoft.com
+DTSTART;VALUE=DATE:20180406
+DTEND;VALUE=DATE:20180407
+SUMMARY:Veliki petak
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20180408@kayaposoft.com
+DTSTART;VALUE=DATE:20180408
+DTEND;VALUE=DATE:20180409
+SUMMARY:Vaskrs
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20180409@kayaposoft.com
+DTSTART;VALUE=DATE:20180409
+DTEND;VALUE=DATE:20180410
+SUMMARY:Vaskrsni ponedeljak
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Praznik rada
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20180502@kayaposoft.com
+DTSTART;VALUE=DATE:20180502
+DTEND;VALUE=DATE:20180503
+SUMMARY:Praznik rada
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20181111@kayaposoft.com
+DTSTART;VALUE=DATE:20181111
+DTEND;VALUE=DATE:20181112
+SUMMARY:Dan primirja
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20181112@kayaposoft.com
+DTSTART;VALUE=DATE:20181112
+DTEND;VALUE=DATE:20181113
+SUMMARY:Dan primirja
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20190102@kayaposoft.com
+DTSTART;VALUE=DATE:20190102
+DTEND;VALUE=DATE:20190103
+SUMMARY:Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20190107@kayaposoft.com
+DTSTART;VALUE=DATE:20190107
+DTEND;VALUE=DATE:20190108
+SUMMARY:Božić
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20190215@kayaposoft.com
+DTSTART;VALUE=DATE:20190215
+DTEND;VALUE=DATE:20190216
+SUMMARY:Dan državnosti Srbije
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20190216@kayaposoft.com
+DTSTART;VALUE=DATE:20190216
+DTEND;VALUE=DATE:20190217
+SUMMARY:Dan državnosti Srbije
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20190426@kayaposoft.com
+DTSTART;VALUE=DATE:20190426
+DTEND;VALUE=DATE:20190427
+SUMMARY:Veliki petak
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20190428@kayaposoft.com
+DTSTART;VALUE=DATE:20190428
+DTEND;VALUE=DATE:20190429
+SUMMARY:Vaskrs
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20190429@kayaposoft.com
+DTSTART;VALUE=DATE:20190429
+DTEND;VALUE=DATE:20190430
+SUMMARY:Vaskrsni ponedeljak
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Praznik rada
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20190502@kayaposoft.com
+DTSTART;VALUE=DATE:20190502
+DTEND;VALUE=DATE:20190503
+SUMMARY:Praznik rada
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20191111@kayaposoft.com
+DTSTART;VALUE=DATE:20191111
+DTEND;VALUE=DATE:20191112
+SUMMARY:Dan primirja
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200102@kayaposoft.com
+DTSTART;VALUE=DATE:20200102
+DTEND;VALUE=DATE:20200103
+SUMMARY:Nova Godina
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200107@kayaposoft.com
+DTSTART;VALUE=DATE:20200107
+DTEND;VALUE=DATE:20200108
+SUMMARY:Božić
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200215@kayaposoft.com
+DTSTART;VALUE=DATE:20200215
+DTEND;VALUE=DATE:20200216
+SUMMARY:Dan državnosti Srbije
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200216@kayaposoft.com
+DTSTART;VALUE=DATE:20200216
+DTEND;VALUE=DATE:20200217
+SUMMARY:Dan državnosti Srbije
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200217@kayaposoft.com
+DTSTART;VALUE=DATE:20200217
+DTEND;VALUE=DATE:20200218
+SUMMARY:Dan državnosti Srbije
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200417@kayaposoft.com
+DTSTART;VALUE=DATE:20200417
+DTEND;VALUE=DATE:20200418
+SUMMARY:Veliki petak
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200419@kayaposoft.com
+DTSTART;VALUE=DATE:20200419
+DTEND;VALUE=DATE:20200420
+SUMMARY:Vaskrs
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200420@kayaposoft.com
+DTSTART;VALUE=DATE:20200420
+DTEND;VALUE=DATE:20200421
+SUMMARY:Vaskrsni ponedeljak
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Praznik rada
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20200502@kayaposoft.com
+DTSTART;VALUE=DATE:20200502
+DTEND;VALUE=DATE:20200503
+SUMMARY:Praznik rada
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-srb-20201111@kayaposoft.com
+DTSTART;VALUE=DATE:20201111
+DTEND;VALUE=DATE:20201112
+SUMMARY:Dan primirja
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/slovakia.ics b/app/src/main/assets/slovakia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..8ada0f07a80e0ff0ecf5d786044af2bad7998ffb
--- /dev/null
+++ b/app/src/main/assets/slovakia.ics
@@ -0,0 +1,148 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Veľký piatok
+UID:1fcdec9f-fda5-4918-bcd5-5f67e883a811
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Veľkonočný pondelok
+UID:b101f4bd-13e3-4f61-8ac5-35e4950d67d1
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Veľký piatok
+UID:e789799a-2019-4844-95dd-a4ac7ee8e9d7
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Veľkonočný pondelok
+UID:1fdff3c8-b923-49f8-89fb-f9531b1172bd
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Veľký piatok
+UID:5475d967-dcb3-4ae1-a50e-4e6a4759ac18
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Veľkonočný pondelok
+UID:ef627f01-aa4d-4a64-848d-35886fa16823
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Deň vzniku Slovenskej republiky
+UID:9911fd75-1e7d-4706-bd0e-93331c730845
+DTSTART;VALUE=DATE:20090101
+DTEND;VALUE=DATE:20090102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Zjavenie Pána (Traja králi)
+UID:e0b6a4ac-7cdf-4066-a38f-2ddefc2cb575
+DTSTART;VALUE=DATE:20090106
+DTEND;VALUE=DATE:20090107
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sviatok práce
+UID:fe978744-bdbb-4909-8c56-c5cc9328fcbc
+DTSTART;VALUE=DATE:20090501
+DTEND;VALUE=DATE:20090502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Deň víťazstva nad fašizmom
+UID:55a06b57-4fa1-4806-948d-9f2680629887
+DTSTART;VALUE=DATE:20090508
+DTEND;VALUE=DATE:20090509
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sviatok svätého Cyrila a Metoda
+UID:68968cc8-6a5d-48f2-a4c4-a67e9a2ace6c
+DTSTART;VALUE=DATE:20090705
+DTEND;VALUE=DATE:20090706
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Výročie Slovenského národného povstania
+UID:8efce7ee-c908-4936-b56a-d27c2fe832f1
+DTSTART;VALUE=DATE:20090829
+DTEND;VALUE=DATE:20090830
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Deň ústavy Slovenskej republiky
+UID:7699b865-1281-4317-afc1-3f3de2bb86a8
+DTSTART;VALUE=DATE:20090901
+DTEND;VALUE=DATE:20090902
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sedembolestná Panna Mária
+UID:3f64a00a-b019-4d0d-8b60-d149b1d94541
+DTSTART;VALUE=DATE:20090915
+DTEND;VALUE=DATE:20090916
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sviatok všetkých svätých
+UID:218c5295-4c5b-4bbf-9140-6a97dac18b27
+DTSTART;VALUE=DATE:20091101
+DTEND;VALUE=DATE:20091102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Deň boja za slobodu a demokraciu
+UID:1d2f04cf-4e56-40c9-b0ef-41f6950a7949
+DTSTART;VALUE=DATE:20091117
+DTEND;VALUE=DATE:20091118
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Štedrý deň
+UID:db65a619-2aec-4d51-9ab4-df1038d0fe38
+DTSTART;VALUE=DATE:20091224
+DTEND;VALUE=DATE:20091225
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Prvý sviatok vianočný
+UID:8efbe13f-9b14-4134-86da-bdfd65cf9142
+DTSTART;VALUE=DATE:20091225
+DTEND;VALUE=DATE:20091226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Druhý sviatok vianočný
+UID:f5ec85a9-a3f5-4a98-ad09-1e7909e020a0
+DTSTART;VALUE=DATE:20091226
+DTEND;VALUE=DATE:20091227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/slovenia.ics b/app/src/main/assets/slovenia.ics
new file mode 100644
index 0000000000000000000000000000000000000000..6d4d53231c372c530113861c94196871eec196ff
--- /dev/null
+++ b/app/src/main/assets/slovenia.ics
@@ -0,0 +1,242 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Binkoštna nedelja
+UID:3j0fv9k09cfs3ci62jquq5ef18@google.com
+DTSTART;VALUE=DATE:20170604
+DTEND;VALUE=DATE:20170605
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velika noč
+UID:rdg4p44inratsnpdsnudttt64k@google.com
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velikonočni ponedeljek
+UID:dcovu496cqm18pmlb3vpblchd4@google.com
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Binkoštna nedelja
+UID:jma36q86cej5kvlr6reh9chd3c@google.com
+DTSTART;VALUE=DATE:20180513
+DTEND;VALUE=DATE:20180514
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velika noč
+UID:g036oqatsh2qge7pp1tqk39kt4@google.com
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velikonočni ponedeljek
+UID:uvn903phpr9a78mubfbvkotqoc@google.com
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Binkoštna nedelja
+UID:586i4921c7l17krge67edhei7o@google.com
+DTSTART;VALUE=DATE:20190609
+DTEND;VALUE=DATE:20190610
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velika noč
+UID:l3nvpcp9ltdsvv5a6l7im9t418@google.com
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velikonočni ponedeljek
+UID:o9hni0if1p6glqt98vp04cbjq0@google.com
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Binkoštna nedelja
+UID:m7snnbbooedsd1t4uv9l5hg7qk@google.com
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velika noč
+UID:p7ihuamcjitl82s1nuljgbctvg@google.com
+DTSTART;VALUE=DATE:20210404
+DTEND;VALUE=DATE:20210405
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velikonočni ponedeljek
+UID:c0ecteedj3oa0akemjdgoqh56o@google.com
+DTSTART;VALUE=DATE:20210405
+DTEND;VALUE=DATE:20210406
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Binkoštna nedelja
+UID:1piq40b6o4e2rl31vrkck7220k@google.com
+DTSTART;VALUE=DATE:20210523
+DTEND;VALUE=DATE:20210524
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velika noč
+UID:32uj31i8c7dv8r6dr3kpb0lusg@google.com
+DTSTART;VALUE=DATE:20220417
+DTEND;VALUE=DATE:20220418
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Velikonočni ponedeljek
+UID:5qig9mkhb1915fakmc78hoqqmg@google.com
+DTSTART;VALUE=DATE:20220418
+DTEND;VALUE=DATE:20220419
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Binkoštna nedelja
+UID:o7nn4ijg1tpbg7t35ppgqhfub4@google.com
+DTSTART;VALUE=DATE:20220605
+DTEND;VALUE=DATE:20220606
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Novo leto
+UID:ldi7t0tg5hqvltafhjjti4e8hk@google.com
+DTSTART;VALUE=DATE:20100101
+DTEND;VALUE=DATE:20100102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Prešernov dan\, slovenski kulturni praznik
+UID:p5uc4dan8aoqpm3gvh93si61t4@google.com
+DTSTART;VALUE=DATE:20100208
+DTEND;VALUE=DATE:20100209
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dan upora proti okupatorju
+UID:3fb9ohmo2i9vnd3p0d9lvr00pg@google.com
+DTSTART;VALUE=DATE:20100427
+DTEND;VALUE=DATE:20100428
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Praznik dela
+UID:0qfh4huviff4fsjfl0igdoe09c@google.com
+DTSTART;VALUE=DATE:20100501
+DTEND;VALUE=DATE:20100502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Praznik dela
+UID:gnkff09qh3pmqnacomnl4707qg@google.com
+DTSTART;VALUE=DATE:20100502
+DTEND;VALUE=DATE:20100503
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dan Primoža Trubarja
+UID:tq563529cuss0ppovm3v2ostpo@google.com
+DTSTART;VALUE=DATE:20100608
+DTEND;VALUE=DATE:20100609
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dan državnosti
+UID:lbtu1lctcn3gnfn9ev9b8bm024@google.com
+DTSTART;VALUE=DATE:20100625
+DTEND;VALUE=DATE:20100626
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Marijino vnebovzetje
+UID:8kl8k39cf3i9eu03440d1rh0uk@google.com
+DTSTART;VALUE=DATE:20100815
+DTEND;VALUE=DATE:20100816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dan reformacije
+UID:e30lkb4539u2srjdr6bon4let8@google.com
+DTSTART;VALUE=DATE:20101031
+DTEND;VALUE=DATE:20101101
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dan spomina na mrtve
+UID:s4u3d3ar3dui39i4ed932nkmgo@google.com
+DTSTART;VALUE=DATE:20101101
+DTEND;VALUE=DATE:20101102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Božič
+UID:65m84vf53e6ufnnv9enrh1i0f8@google.com
+DTSTART;VALUE=DATE:20101225
+DTEND;VALUE=DATE:20101226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dan samostojnosti in enotnosti
+UID:jlfnv6umgcv6am66hrmr60i72o@google.com
+DTSTART;VALUE=DATE:20101226
+DTEND;VALUE=DATE:20101227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Združitev prekmurskih Slovencev z matičnim narodom
+UID:9inhlge248fv3h1n995q17l70k@google.com
+DTSTART;VALUE=DATE:20120817
+DTEND;VALUE=DATE:20120818
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dan vrnitve primorske k matični domovini
+UID:gflm21jqavr1dp2301spm85mn4@google.com
+DTSTART;VALUE=DATE:20120915
+DTEND;VALUE=DATE:20120916
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dan Rudolfa Maistra
+UID:3eugbag23jpapnku28r8snalu8@google.com
+DTSTART;VALUE=DATE:20121123
+DTEND;VALUE=DATE:20121124
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Dan suverenosti
+UID:3e7dd1e5-3f0a-41ab-a869-3f9464dc8231
+DTSTART;VALUE=DATE:20151025
+DTEND;VALUE=DATE:20151026
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/southafrica.ics b/app/src/main/assets/southafrica.ics
new file mode 100644
index 0000000000000000000000000000000000000000..071d0597062635c3ddde5fdbdfb437245d892841
--- /dev/null
+++ b/app/src/main/assets/southafrica.ics
@@ -0,0 +1,275 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-zaf-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:New Year's Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20180321@kayaposoft.com
+DTSTART;VALUE=DATE:20180321
+DTEND;VALUE=DATE:20180322
+SUMMARY:Human Rights Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20180330@kayaposoft.com
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+SUMMARY:Good Friday
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20180402@kayaposoft.com
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+SUMMARY:Family Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20180427@kayaposoft.com
+DTSTART;VALUE=DATE:20180427
+DTEND;VALUE=DATE:20180428
+SUMMARY:Freedom Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Workers' Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20180616@kayaposoft.com
+DTSTART;VALUE=DATE:20180616
+DTEND;VALUE=DATE:20180617
+SUMMARY:Youth Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20180809@kayaposoft.com
+DTSTART;VALUE=DATE:20180809
+DTEND;VALUE=DATE:20180810
+SUMMARY:National Women's Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20180924@kayaposoft.com
+DTSTART;VALUE=DATE:20180924
+DTEND;VALUE=DATE:20180925
+SUMMARY:Heritage Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20181216@kayaposoft.com
+DTSTART;VALUE=DATE:20181216
+DTEND;VALUE=DATE:20181217
+SUMMARY:Day of Reconciliation
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20181217@kayaposoft.com
+DTSTART;VALUE=DATE:20181217
+DTEND;VALUE=DATE:20181218
+SUMMARY:Day of Reconciliation
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Christmas Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:Day of Goodwill
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:New Year's Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20190321@kayaposoft.com
+DTSTART;VALUE=DATE:20190321
+DTEND;VALUE=DATE:20190322
+SUMMARY:Human Rights Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20190419@kayaposoft.com
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+SUMMARY:Good Friday
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20190422@kayaposoft.com
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+SUMMARY:Family Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20190427@kayaposoft.com
+DTSTART;VALUE=DATE:20190427
+DTEND;VALUE=DATE:20190428
+SUMMARY:Freedom Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Workers' Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20190616@kayaposoft.com
+DTSTART;VALUE=DATE:20190616
+DTEND;VALUE=DATE:20190617
+SUMMARY:Youth Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20190617@kayaposoft.com
+DTSTART;VALUE=DATE:20190617
+DTEND;VALUE=DATE:20190618
+SUMMARY:Youth Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20190809@kayaposoft.com
+DTSTART;VALUE=DATE:20190809
+DTEND;VALUE=DATE:20190810
+SUMMARY:National Women's Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20190924@kayaposoft.com
+DTSTART;VALUE=DATE:20190924
+DTEND;VALUE=DATE:20190925
+SUMMARY:Heritage Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20191216@kayaposoft.com
+DTSTART;VALUE=DATE:20191216
+DTEND;VALUE=DATE:20191217
+SUMMARY:Day of Reconciliation
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Christmas Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:Day of Goodwill
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:New Year's Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20200321@kayaposoft.com
+DTSTART;VALUE=DATE:20200321
+DTEND;VALUE=DATE:20200322
+SUMMARY:Human Rights Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20200410@kayaposoft.com
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+SUMMARY:Good Friday
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20200413@kayaposoft.com
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+SUMMARY:Family Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20200427@kayaposoft.com
+DTSTART;VALUE=DATE:20200427
+DTEND;VALUE=DATE:20200428
+SUMMARY:Freedom Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Workers' Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20200616@kayaposoft.com
+DTSTART;VALUE=DATE:20200616
+DTEND;VALUE=DATE:20200617
+SUMMARY:Youth Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20200809@kayaposoft.com
+DTSTART;VALUE=DATE:20200809
+DTEND;VALUE=DATE:20200810
+SUMMARY:National Women's Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20200810@kayaposoft.com
+DTSTART;VALUE=DATE:20200810
+DTEND;VALUE=DATE:20200811
+SUMMARY:National Women's Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20200924@kayaposoft.com
+DTSTART;VALUE=DATE:20200924
+DTEND;VALUE=DATE:20200925
+SUMMARY:Heritage Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20201216@kayaposoft.com
+DTSTART;VALUE=DATE:20201216
+DTEND;VALUE=DATE:20201217
+SUMMARY:Day of Reconciliation
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Christmas Day
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-zaf-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:Day of Goodwill
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/southkorea.ics b/app/src/main/assets/southkorea.ics
new file mode 100644
index 0000000000000000000000000000000000000000..014e7487d859f698c1b9f61ee071d0927ab76f1d
--- /dev/null
+++ b/app/src/main/assets/southkorea.ics
@@ -0,0 +1,163 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:추석(한가위) Harvest Festival
+UID:aa7b098a-6a8f-4fd2-88bc-14e7b5c84c39
+DTSTART;VALUE=DATE:20171004
+DTEND;VALUE=DATE:20171005
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:설날 Lunar New Year's Day
+UID:61054408-a699-4c02-a716-175e846ce4a6
+DTSTART;VALUE=DATE:20180216
+DTEND;VALUE=DATE:20180217
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:추석(한가위) Harvest Festival
+UID:fc550182-bfdb-49b9-afb8-9c4ec7fb17fd
+DTSTART;VALUE=DATE:20180924
+DTEND;VALUE=DATE:20180925
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:설날 Lunar New Year's Day
+UID:3d064a26-70f2-431a-985a-ffd27be9e210
+DTSTART;VALUE=DATE:20190205
+DTEND;VALUE=DATE:20190206
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:추석(한가위) Harvest Festival
+UID:d7e82f23-c621-4c91-aef5-db5bbc2a8967
+DTSTART;VALUE=DATE:20190913
+DTEND;VALUE=DATE:20190914
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:설날 Lunar New Year's Day
+UID:45772bb7-5f27-40a4-9b40-e2c17858705c
+DTSTART;VALUE=DATE:20200125
+DTEND;VALUE=DATE:20200126
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:추석(한가위) Harvest Festival
+UID:14bd697c-a319-47fd-9abc-fdff74be58e5
+DTSTART;VALUE=DATE:20201001
+DTEND;VALUE=DATE:20201002
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:신정 New Year's Day
+UID:63cdd0c5-dc38-4875-bd97-5ddcb72b6c7b
+DTSTART;VALUE=DATE:20000101
+DTEND;VALUE=DATE:20000102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:삼일절 Independence Day
+UID:2705d177-c4a1-4a09-a5eb-9637b65bb512
+DTSTART;VALUE=DATE:20000301
+DTEND;VALUE=DATE:20000302
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:식목일 Arbor Day
+UID:5ae39a0f-5ef9-44d9-9dd5-e90049578e07
+DTSTART;VALUE=DATE:20000405
+DTEND;VALUE=DATE:20000406
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:어린이 날 Children's Day
+UID:5a0c39c0-da3b-407d-824b-890c6b82bd95
+DTSTART;VALUE=DATE:20000505
+DTEND;VALUE=DATE:20000506
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:어버이 날 Paren't Day
+UID:741d7127-995f-43e0-a014-04280dcbb661
+DTSTART;VALUE=DATE:20000510
+DTEND;VALUE=DATE:20000511
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:스승의 날 Teacher's Day
+UID:5309e45c-acca-4b4f-b7c4-fe7b3ddd545f
+DTSTART;VALUE=DATE:20000515
+DTEND;VALUE=DATE:20000516
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:현충일 Memorial Day
+UID:c67d164c-c91c-4b46-a0fa-bff756119cde
+DTSTART;VALUE=DATE:20000606
+DTEND;VALUE=DATE:20000607
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:6-25 사변일 6/25 War Memorial
+UID:c5907e9d-4314-423f-9441-d7309d39db45
+DTSTART;VALUE=DATE:20000625
+DTEND;VALUE=DATE:20000626
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:제헌절 Constitution Day
+UID:4f97c701-816b-4c23-a71e-13d2d2419c8f
+DTSTART;VALUE=DATE:20000717
+DTEND;VALUE=DATE:20000718
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:광복절 Liberation Day
+UID:1aba5d05-a8a7-4253-a6d2-66665bd2490d
+DTSTART;VALUE=DATE:20000815
+DTEND;VALUE=DATE:20000816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:국군의 날 Armed Forces Day
+UID:99c12465-6366-4c9e-99c8-8635969cc7ee
+DTSTART;VALUE=DATE:20001001
+DTEND;VALUE=DATE:20001002
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:개천절 Foundation Day
+UID:220f5ee6-10a6-4227-87ca-197628adb976
+DTSTART;VALUE=DATE:20001003
+DTEND;VALUE=DATE:20001004
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:한글날 Korean Language Day
+UID:a73ddfb4-c27f-4861-a92f-040e18a9c29c
+DTSTART;VALUE=DATE:20001009
+DTEND;VALUE=DATE:20001010
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:기독탄신일(성탄절) Christmas Day
+UID:e72416e0-706d-493f-b134-a35ad2700de4
+DTSTART;VALUE=DATE:20001225
+DTEND;VALUE=DATE:20001226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/spain.ics b/app/src/main/assets/spain.ics
new file mode 100644
index 0000000000000000000000000000000000000000..796e1d7f9bc89a29123416eaf2997d4858b1bf12
--- /dev/null
+++ b/app/src/main/assets/spain.ics
@@ -0,0 +1,179 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Día de las Letras Gallegas
+UID:24e9dd43-324a-4e80-95fc-28a90764f837
+DTSTART;VALUE=DATE:20170517
+DTEND;VALUE=DATE:20170518
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de Canarias
+UID:6d2b98aa-9f4f-4895-885d-bf10054a11b3
+DTSTART;VALUE=DATE:20170530
+DTEND;VALUE=DATE:20170531
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de Castilla-La Mancha
+UID:76976e48-3b3c-4977-9672-5c3a99c73eb7
+DTSTART;VALUE=DATE:20170531
+DTEND;VALUE=DATE:20170601
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de la Región de Murcia / Día de La Rioja
+UID:f5af0948-f354-4544-af70-b7f8693aafca
+DTSTART;VALUE=DATE:20170609
+DTEND;VALUE=DATE:20170610
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Corpus Christi (Castilla-La Mancha)
+UID:81a5c414-1a33-4b5c-b5fb-8f27fb33474b
+DTSTART;VALUE=DATE:20170615
+DTEND;VALUE=DATE:20170616
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:San Juan (Cataluña)
+UID:8fbf9ead-7211-4c34-a1b4-38b591d05bc6
+DTSTART;VALUE=DATE:20170624
+DTEND;VALUE=DATE:20170625
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Santiago Apostol (Galicia\, Navarra y País Vasco)
+UID:dec5519a-dfa2-44c1-a407-b792ab9c7f6f
+DTSTART;VALUE=DATE:20170725
+DTEND;VALUE=DATE:20170726
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de las Instituciones de Cantabria
+UID:13e2996c-c0be-4a9a-8fcc-f059d504d2bd
+DTSTART;VALUE=DATE:20170728
+DTEND;VALUE=DATE:20170729
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fiesta del Sacrificio (Melilla) / Festividad de la Pascua del Sacrificio
+UID:bd94c628-7821-406a-a7bb-023a8d3f905b
+DTSTART;VALUE=DATE:20170901
+DTEND;VALUE=DATE:20170902
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de Ceuta
+UID:fd20c4a6-9772-44e7-8358-1905de09838d
+DTSTART;VALUE=DATE:20170902
+DTEND;VALUE=DATE:20170903
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de Asturias / Día de Extremadura
+UID:b9a48863-bc20-4f8d-9138-dd210c1a5549
+DTSTART;VALUE=DATE:20170908
+DTEND;VALUE=DATE:20170909
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fiesta Nacional de Cataluña
+UID:18b58278-b56a-4526-be09-783c788fe877
+DTSTART;VALUE=DATE:20170911
+DTEND;VALUE=DATE:20170912
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Festividad de la Bien Aparecida (Cantabria)
+UID:c4fba847-fa22-4dc6-aa61-021c959140ee
+DTSTART;VALUE=DATE:20170915
+DTEND;VALUE=DATE:20170916
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de la Comunitat Valenciana
+UID:f8e1a94a-cfab-499c-81a0-d2820c5c0f46
+DTSTART;VALUE=DATE:20171009
+DTEND;VALUE=DATE:20171010
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:San Esteban (Cataluña)
+UID:29e5a18b-f926-4203-a733-e5502b5c5538
+DTSTART;VALUE=DATE:20171226
+DTEND;VALUE=DATE:20171227
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Año Nuevo
+UID:414d6a02-bc49-4b9a-b091-7a81c58f2678
+DTSTART;VALUE=DATE:20070101
+DTEND;VALUE=DATE:20070102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Epifanía del Señor
+UID:7b533510-68f9-432f-a219-797d3b09dd72
+DTSTART;VALUE=DATE:20070106
+DTEND;VALUE=DATE:20070107
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fiesta del Trabajo
+UID:083e8117-7787-45e8-a73d-4e1d3bc08398
+DTSTART;VALUE=DATE:20070501
+DTEND;VALUE=DATE:20070502
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Asunción de la Virgen
+UID:0c035021-76c7-481f-a658-b04af1c6ada4
+DTSTART;VALUE=DATE:20070815
+DTEND;VALUE=DATE:20070816
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Fiesta Nacional de España
+UID:541e9a67-0f90-4d5c-acf3-bd2a13e86cb2
+DTSTART;VALUE=DATE:20071012
+DTEND;VALUE=DATE:20071013
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Todos los Santos
+UID:a95ca284-04fd-4234-8dda-4f419fabf4b0
+DTSTART;VALUE=DATE:20071101
+DTEND;VALUE=DATE:20071102
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Día de la Constitución Española
+UID:a19435c4-581d-45a1-afea-0097df54856f
+DTSTART;VALUE=DATE:20071206
+DTEND;VALUE=DATE:20071207
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:La Inmaculada Concepción
+UID:ebd6d0e2-3612-4b8d-ac96-ed09ca0680cc
+DTSTART;VALUE=DATE:20071208
+DTEND;VALUE=DATE:20071209
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Natividad del Señor
+UID:be1f3759-4273-43f8-8afd-fb7af952ae1a
+DTSTART;VALUE=DATE:20071225
+DTEND;VALUE=DATE:20071226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/sweden.ics b/app/src/main/assets/sweden.ics
new file mode 100644
index 0000000000000000000000000000000000000000..1f264457cfb3984bf4b41714fa6cbf2cb4d7a363
--- /dev/null
+++ b/app/src/main/assets/sweden.ics
@@ -0,0 +1,275 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-swe-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Nyårsdagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20180106@kayaposoft.com
+DTSTART;VALUE=DATE:20180106
+DTEND;VALUE=DATE:20180107
+SUMMARY:Trettondagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20180330@kayaposoft.com
+DTSTART;VALUE=DATE:20180330
+DTEND;VALUE=DATE:20180331
+SUMMARY:Långfredagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20180401@kayaposoft.com
+DTSTART;VALUE=DATE:20180401
+DTEND;VALUE=DATE:20180402
+SUMMARY:Påskdagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20180402@kayaposoft.com
+DTSTART;VALUE=DATE:20180402
+DTEND;VALUE=DATE:20180403
+SUMMARY:Annandag påsk
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:Första maj
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20180510@kayaposoft.com
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180511
+SUMMARY:Kristi himmelfärds dag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20180520@kayaposoft.com
+DTSTART;VALUE=DATE:20180520
+DTEND;VALUE=DATE:20180521
+SUMMARY:Pingstdagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20180606@kayaposoft.com
+DTSTART;VALUE=DATE:20180606
+DTEND;VALUE=DATE:20180607
+SUMMARY:Sveriges nationaldag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20180623@kayaposoft.com
+DTSTART;VALUE=DATE:20180623
+DTEND;VALUE=DATE:20180624
+SUMMARY:Midsommardagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20181103@kayaposoft.com
+DTSTART;VALUE=DATE:20181103
+DTEND;VALUE=DATE:20181104
+SUMMARY:Alla helgons dag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Juldagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20181226@kayaposoft.com
+DTSTART;VALUE=DATE:20181226
+DTEND;VALUE=DATE:20181227
+SUMMARY:Annandag jul
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Nyårsdagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20190106@kayaposoft.com
+DTSTART;VALUE=DATE:20190106
+DTEND;VALUE=DATE:20190107
+SUMMARY:Trettondagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20190419@kayaposoft.com
+DTSTART;VALUE=DATE:20190419
+DTEND;VALUE=DATE:20190420
+SUMMARY:Långfredagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20190421@kayaposoft.com
+DTSTART;VALUE=DATE:20190421
+DTEND;VALUE=DATE:20190422
+SUMMARY:Påskdagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20190422@kayaposoft.com
+DTSTART;VALUE=DATE:20190422
+DTEND;VALUE=DATE:20190423
+SUMMARY:Annandag påsk
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:Första maj
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20190530@kayaposoft.com
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190531
+SUMMARY:Kristi himmelfärds dag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20190606@kayaposoft.com
+DTSTART;VALUE=DATE:20190606
+DTEND;VALUE=DATE:20190607
+SUMMARY:Sveriges nationaldag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20190609@kayaposoft.com
+DTSTART;VALUE=DATE:20190609
+DTEND;VALUE=DATE:20190610
+SUMMARY:Pingstdagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20190622@kayaposoft.com
+DTSTART;VALUE=DATE:20190622
+DTEND;VALUE=DATE:20190623
+SUMMARY:Midsommardagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20191102@kayaposoft.com
+DTSTART;VALUE=DATE:20191102
+DTEND;VALUE=DATE:20191103
+SUMMARY:Alla helgons dag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Juldagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20191226@kayaposoft.com
+DTSTART;VALUE=DATE:20191226
+DTEND;VALUE=DATE:20191227
+SUMMARY:Annandag jul
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Nyårsdagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20200106@kayaposoft.com
+DTSTART;VALUE=DATE:20200106
+DTEND;VALUE=DATE:20200107
+SUMMARY:Trettondagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20200410@kayaposoft.com
+DTSTART;VALUE=DATE:20200410
+DTEND;VALUE=DATE:20200411
+SUMMARY:Långfredagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20200412@kayaposoft.com
+DTSTART;VALUE=DATE:20200412
+DTEND;VALUE=DATE:20200413
+SUMMARY:Påskdagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20200413@kayaposoft.com
+DTSTART;VALUE=DATE:20200413
+DTEND;VALUE=DATE:20200414
+SUMMARY:Annandag påsk
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:Första maj
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20200521@kayaposoft.com
+DTSTART;VALUE=DATE:20200521
+DTEND;VALUE=DATE:20200522
+SUMMARY:Kristi himmelfärds dag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20200531@kayaposoft.com
+DTSTART;VALUE=DATE:20200531
+DTEND;VALUE=DATE:20200601
+SUMMARY:Pingstdagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20200606@kayaposoft.com
+DTSTART;VALUE=DATE:20200606
+DTEND;VALUE=DATE:20200607
+SUMMARY:Sveriges nationaldag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20200620@kayaposoft.com
+DTSTART;VALUE=DATE:20200620
+DTEND;VALUE=DATE:20200621
+SUMMARY:Midsommardagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20201031@kayaposoft.com
+DTSTART;VALUE=DATE:20201031
+DTEND;VALUE=DATE:20201101
+SUMMARY:Alla helgons dag
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Juldagen
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-swe-20201226@kayaposoft.com
+DTSTART;VALUE=DATE:20201226
+DTEND;VALUE=DATE:20201227
+SUMMARY:Annandag jul
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/switzerland.ics b/app/src/main/assets/switzerland.ics
new file mode 100644
index 0000000000000000000000000000000000000000..1d8435abee21781adc003da9869b1fc1c37cda15
--- /dev/null
+++ b/app/src/main/assets/switzerland.ics
@@ -0,0 +1,219 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:Christmas holidays
+DTSTART;VALUE=DATE:20161226
+DTEND;VALUE=DATE:20170107
+UID:ferien2017-420642-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sport holiday
+DTSTART;VALUE=DATE:20170213
+DTEND;VALUE=DATE:20170225
+UID:ferien2017-245772-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter holidays
+DTSTART;VALUE=DATE:20170413
+DTEND;VALUE=DATE:20170418
+UID:ferien2017-420643-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Spring time holidays
+DTSTART;VALUE=DATE:20170418
+DTEND;VALUE=DATE:20170429
+UID:ferien2017-420644-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Labour Day
+DTSTART;VALUE=DATE:20170501
+DTEND;VALUE=DATE:20170501
+UID:ferien2017-420645-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension Day
+DTSTART;VALUE=DATE:20170525
+DTEND;VALUE=DATE:20170529
+UID:ferien2017-420646-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Whit Monday
+DTSTART;VALUE=DATE:20170605
+DTEND;VALUE=DATE:20170605
+UID:ferien2017-420647-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Summer holidays
+DTSTART;VALUE=DATE:20170717
+DTEND;VALUE=DATE:20170819
+UID:ferien2017-245774-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Knabenschiessen
+DTSTART;VALUE=DATE:20170911
+DTEND;VALUE=DATE:20170911
+UID:ferien2017-453610-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Autumn holidays
+DTSTART;VALUE=DATE:20171009
+DTEND;VALUE=DATE:20171021
+UID:ferien2017-245775-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas holidays
+DTSTART;VALUE=DATE:20171225
+DTEND;VALUE=DATE:20180106
+UID:ferien2017-453611-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sport holiday
+DTSTART;VALUE=DATE:20180212
+DTEND;VALUE=DATE:20180224
+UID:ferien2018-245776-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter holidays
+DTSTART;VALUE=DATE:20180329
+DTEND;VALUE=DATE:20180403
+UID:ferien2018-453612-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sechseläuten
+DTSTART;VALUE=DATE:20180416
+DTEND;VALUE=DATE:20180416
+UID:ferien2018-453613-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Spring time holidays
+DTSTART;VALUE=DATE:20180423
+DTEND;VALUE=DATE:20180505
+UID:ferien2018-245777-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension Day
+DTSTART;VALUE=DATE:20180510
+DTEND;VALUE=DATE:20180514
+UID:ferien2018-453614-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Whit Monday
+DTSTART;VALUE=DATE:20180521
+DTEND;VALUE=DATE:20180521
+UID:ferien2018-453615-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Summer holidays
+DTSTART;VALUE=DATE:20180716
+DTEND;VALUE=DATE:20180818
+UID:ferien2018-245778-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Knabenschiessen
+DTSTART;VALUE=DATE:20180910
+DTEND;VALUE=DATE:20180910
+UID:ferien2018-453616-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Autumn holidays
+DTSTART;VALUE=DATE:20181008
+DTEND;VALUE=DATE:20181020
+UID:ferien2018-245779-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas holidays
+DTSTART;VALUE=DATE:20181224
+DTEND;VALUE=DATE:20190105
+UID:ferien2018-453617-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sport holiday
+DTSTART;VALUE=DATE:20190211
+DTEND;VALUE=DATE:20190223
+UID:ferien2019-245780-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Sechseläuten
+DTSTART;VALUE=DATE:20190408
+DTEND;VALUE=DATE:20190408
+UID:ferien2019-453618-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Easter holidays
+DTSTART;VALUE=DATE:20190418
+DTEND;VALUE=DATE:20190423
+UID:ferien2019-453619-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Spring time holidays
+DTSTART;VALUE=DATE:20190423
+DTEND;VALUE=DATE:20190504
+UID:ferien2019-453620-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Ascension Day
+DTSTART;VALUE=DATE:20190530
+DTEND;VALUE=DATE:20190603
+UID:ferien2019-453621-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Whit Monday
+DTSTART;VALUE=DATE:20190610
+DTEND;VALUE=DATE:20190610
+UID:ferien2019-453622-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Summer holidays
+DTSTART;VALUE=DATE:20190715
+DTEND;VALUE=DATE:20190817
+UID:ferien2019-245782-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Knabenschiessen
+DTSTART;VALUE=DATE:20190909
+DTEND;VALUE=DATE:20190909
+UID:ferien2019-453623-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Autumn holidays
+DTSTART;VALUE=DATE:20191007
+DTEND;VALUE=DATE:20191019
+UID:ferien2019-245783-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas holidays
+DTSTART;VALUE=DATE:20191223
+DTEND;VALUE=DATE:20200104
+UID:ferien2019-453624-fcal.ch
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/ukraine.ics b/app/src/main/assets/ukraine.ics
new file mode 100644
index 0000000000000000000000000000000000000000..b81e45a4a1c934f43550102d77b4a4fd1ea5b1e2
--- /dev/null
+++ b/app/src/main/assets/ukraine.ics
@@ -0,0 +1,316 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+UID:enrico-ukr-20180101@kayaposoft.com
+DTSTART;VALUE=DATE:20180101
+DTEND;VALUE=DATE:20180102
+SUMMARY:Новий Рік
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180108@kayaposoft.com
+DTSTART;VALUE=DATE:20180108
+DTEND;VALUE=DATE:20180109
+SUMMARY:Різдво
+DESCRIPTION:Holiday in lieu of 7 Jan 2018
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180308@kayaposoft.com
+DTSTART;VALUE=DATE:20180308
+DTEND;VALUE=DATE:20180309
+SUMMARY:Міжнародний жіночий день
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180309@kayaposoft.com
+DTSTART;VALUE=DATE:20180309
+DTEND;VALUE=DATE:20180310
+SUMMARY:Свято
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180408@kayaposoft.com
+DTSTART;VALUE=DATE:20180408
+DTEND;VALUE=DATE:20180409
+SUMMARY:Пасха
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180409@kayaposoft.com
+DTSTART;VALUE=DATE:20180409
+DTEND;VALUE=DATE:20180410
+SUMMARY:Пасха
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180430@kayaposoft.com
+DTSTART;VALUE=DATE:20180430
+DTEND;VALUE=DATE:20180501
+SUMMARY:Свято
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180501@kayaposoft.com
+DTSTART;VALUE=DATE:20180501
+DTEND;VALUE=DATE:20180502
+SUMMARY:День праці (День міжнародної солідарності трудящих)
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180509@kayaposoft.com
+DTSTART;VALUE=DATE:20180509
+DTEND;VALUE=DATE:20180510
+SUMMARY:День перемоги над нацизмом у Другій світовій війні
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180527@kayaposoft.com
+DTSTART;VALUE=DATE:20180527
+DTEND;VALUE=DATE:20180528
+SUMMARY:Трійця
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180528@kayaposoft.com
+DTSTART;VALUE=DATE:20180528
+DTEND;VALUE=DATE:20180529
+SUMMARY:Трійця
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180628@kayaposoft.com
+DTSTART;VALUE=DATE:20180628
+DTEND;VALUE=DATE:20180629
+SUMMARY:День Конституції
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180629@kayaposoft.com
+DTSTART;VALUE=DATE:20180629
+DTEND;VALUE=DATE:20180630
+SUMMARY:Свято
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20180824@kayaposoft.com
+DTSTART;VALUE=DATE:20180824
+DTEND;VALUE=DATE:20180825
+SUMMARY:День Незалежності
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20181015@kayaposoft.com
+DTSTART;VALUE=DATE:20181015
+DTEND;VALUE=DATE:20181016
+SUMMARY:День захисника України
+DESCRIPTION:Holiday in lieu of 14 Oct 2018
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20181224@kayaposoft.com
+DTSTART;VALUE=DATE:20181224
+DTEND;VALUE=DATE:20181225
+SUMMARY:Свято
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20181225@kayaposoft.com
+DTSTART;VALUE=DATE:20181225
+DTEND;VALUE=DATE:20181226
+SUMMARY:Різдво
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20181231@kayaposoft.com
+DTSTART;VALUE=DATE:20181231
+DTEND;VALUE=DATE:20190101
+SUMMARY:Свято
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190101@kayaposoft.com
+DTSTART;VALUE=DATE:20190101
+DTEND;VALUE=DATE:20190102
+SUMMARY:Новий Рік
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190107@kayaposoft.com
+DTSTART;VALUE=DATE:20190107
+DTEND;VALUE=DATE:20190108
+SUMMARY:Різдво
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190308@kayaposoft.com
+DTSTART;VALUE=DATE:20190308
+DTEND;VALUE=DATE:20190309
+SUMMARY:Міжнародний жіночий день
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190428@kayaposoft.com
+DTSTART;VALUE=DATE:20190428
+DTEND;VALUE=DATE:20190429
+SUMMARY:Пасха
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190429@kayaposoft.com
+DTSTART;VALUE=DATE:20190429
+DTEND;VALUE=DATE:20190430
+SUMMARY:Пасха
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190501@kayaposoft.com
+DTSTART;VALUE=DATE:20190501
+DTEND;VALUE=DATE:20190502
+SUMMARY:День праці (День міжнародної солідарності трудящих)
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190509@kayaposoft.com
+DTSTART;VALUE=DATE:20190509
+DTEND;VALUE=DATE:20190510
+SUMMARY:День перемоги над нацизмом у Другій світовій війні
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190616@kayaposoft.com
+DTSTART;VALUE=DATE:20190616
+DTEND;VALUE=DATE:20190617
+SUMMARY:Трійця
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190617@kayaposoft.com
+DTSTART;VALUE=DATE:20190617
+DTEND;VALUE=DATE:20190618
+SUMMARY:Трійця
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190628@kayaposoft.com
+DTSTART;VALUE=DATE:20190628
+DTEND;VALUE=DATE:20190629
+SUMMARY:День Конституції
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20190826@kayaposoft.com
+DTSTART;VALUE=DATE:20190826
+DTEND;VALUE=DATE:20190827
+SUMMARY:День Незалежності
+DESCRIPTION:Holiday in lieu of 24 Aug 2019
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20191014@kayaposoft.com
+DTSTART;VALUE=DATE:20191014
+DTEND;VALUE=DATE:20191015
+SUMMARY:День захисника України
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20191225@kayaposoft.com
+DTSTART;VALUE=DATE:20191225
+DTEND;VALUE=DATE:20191226
+SUMMARY:Різдво
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200101@kayaposoft.com
+DTSTART;VALUE=DATE:20200101
+DTEND;VALUE=DATE:20200102
+SUMMARY:Новий Рік
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200107@kayaposoft.com
+DTSTART;VALUE=DATE:20200107
+DTEND;VALUE=DATE:20200108
+SUMMARY:Різдво
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200309@kayaposoft.com
+DTSTART;VALUE=DATE:20200309
+DTEND;VALUE=DATE:20200310
+SUMMARY:Міжнародний жіночий день
+DESCRIPTION:Holiday in lieu of 8 Mar 2020
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200419@kayaposoft.com
+DTSTART;VALUE=DATE:20200419
+DTEND;VALUE=DATE:20200420
+SUMMARY:Пасха
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200420@kayaposoft.com
+DTSTART;VALUE=DATE:20200420
+DTEND;VALUE=DATE:20200421
+SUMMARY:Пасха
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200501@kayaposoft.com
+DTSTART;VALUE=DATE:20200501
+DTEND;VALUE=DATE:20200502
+SUMMARY:День праці (День міжнародної солідарності трудящих)
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200511@kayaposoft.com
+DTSTART;VALUE=DATE:20200511
+DTEND;VALUE=DATE:20200512
+SUMMARY:День перемоги над нацизмом у Другій світовій війні
+DESCRIPTION:Holiday in lieu of 9 May 2020
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200607@kayaposoft.com
+DTSTART;VALUE=DATE:20200607
+DTEND;VALUE=DATE:20200608
+SUMMARY:Трійця
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200608@kayaposoft.com
+DTSTART;VALUE=DATE:20200608
+DTEND;VALUE=DATE:20200609
+SUMMARY:Трійця
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200629@kayaposoft.com
+DTSTART;VALUE=DATE:20200629
+DTEND;VALUE=DATE:20200630
+SUMMARY:День Конституції
+DESCRIPTION:Holiday in lieu of 28 Jun 2020
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20200824@kayaposoft.com
+DTSTART;VALUE=DATE:20200824
+DTEND;VALUE=DATE:20200825
+SUMMARY:День Незалежності
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20201014@kayaposoft.com
+DTSTART;VALUE=DATE:20201014
+DTEND;VALUE=DATE:20201015
+SUMMARY:День захисника України
+STATUS:CONFIRMED
+END:VEVENT
+BEGIN:VEVENT
+UID:enrico-ukr-20201225@kayaposoft.com
+DTSTART;VALUE=DATE:20201225
+DTEND;VALUE=DATE:20201226
+SUMMARY:Різдво
+STATUS:CONFIRMED
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/unitedkingdom.ics b/app/src/main/assets/unitedkingdom.ics
new file mode 100644
index 0000000000000000000000000000000000000000..c66c6a5e2b4ed322084e851e73fda9a37d914084
--- /dev/null
+++ b/app/src/main/assets/unitedkingdom.ics
@@ -0,0 +1,74 @@
+BEGIN:VCALENDAR
+BEGIN:VEVENT
+SUMMARY:New Year's Day
+UID:4694f46a-aef0-49a0-a8eb-44ab6531e0d9
+DTSTART;VALUE=DATE:20170102
+DTEND;VALUE=DATE:20170103
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. David's Day
+UID:a08053d8-530b-4025-8edf-81c88d05fe84
+DTSTART;VALUE=DATE:20100301
+DTEND;VALUE=DATE:20100302
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:St. George's Day
+UID:b58227e2-7f9d-4571-afa5-0ae93192d10e
+DTSTART;VALUE=DATE:20100423
+DTEND;VALUE=DATE:20100424
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Early May Bank Holiday
+UID:21626542-636f-43d7-8fa9-bad05bb82dca
+DTSTART;VALUE=DATE:20100503
+DTEND;VALUE=DATE:20100504
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Summer Bank Holiday
+UID:5dac6a63-e519-4ad1-a687-2fd5fccb4656
+DTSTART;VALUE=DATE:20100802
+DTEND;VALUE=DATE:20100803
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Summer Bank Holiday
+UID:3d37b115-f0fa-4456-98c9-3b18cfffb47d
+DTSTART;VALUE=DATE:20170828
+DTEND;VALUE=DATE:20170829
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:BST ends
+UID:8eb163f3-6d42-494e-9e7c-747619cf965f
+DTSTART:20101031T000000Z
+DTEND:20101031T020000Z
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Christmas Day
+UID:436a5833-73a8-4b78-87f3-ad0db20b018f
+DTSTART;VALUE=DATE:20101225
+DTEND;VALUE=DATE:20101226
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+SUMMARY:Boxing Day
+UID:07180b7b-fed1-4a59-bff0-619056033b1a
+DTSTART;VALUE=DATE:20101226
+DTEND;VALUE=DATE:20101227
+STATUS:CONFIRMED
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/assets/unitedstates.ics b/app/src/main/assets/unitedstates.ics
new file mode 100644
index 0000000000000000000000000000000000000000..2cfb4f0603c47f5942def8dfb9b4d3df1c84cee3
--- /dev/null
+++ b/app/src/main/assets/unitedstates.ics
@@ -0,0 +1,83 @@
+BEGIN:VCALENDAR
+VERSION:2.0
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20170101
+DTEND;VALUE=DATE:20170102
+UID:5a4b1ab2e4a3b@calendarlabs.com
+STATUS:CONFIRMED
+SUMMARY:New Year's Day
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20170116
+DTEND;VALUE=DATE:20170117
+UID:5a4b1ab2e4b97@calendarlabs.com
+STATUS:CONFIRMED
+SUMMARY:M L King Day
+RRULE:FREQ=YEARLY;INTERVAL=1;BYMONTH=1;BYDAY=3MO
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20170220
+DTEND;VALUE=DATE:20170221
+UID:5a4b1ab2e4c77@calendarlabs.com
+STATUS:CONFIRMED
+SUMMARY:Presidents' Day
+RRULE:FREQ=YEARLY;BYMONTH=2;BYDAY=3MO
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20170529
+DTEND;VALUE=DATE:20170530
+UID:5a4b1ab2e4e43@calendarlabs.com
+STATUS:CONFIRMED
+SUMMARY:Memorial Day
+RRULE:FREQ=YEARLY;BYMONTH=5;BYDAY=-1MO
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20170704
+DTEND;VALUE=DATE:20170705
+UID:5a4b1ab2e4f3d@calendarlabs.com
+STATUS:CONFIRMED
+SUMMARY:Independence Day
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20170904
+DTEND;VALUE=DATE:20170905
+UID:5a4b1ab2e4fd4@calendarlabs.com
+STATUS:CONFIRMED
+SUMMARY:Labor Day
+RRULE:FREQ=YEARLY;BYMONTH=9;BYDAY=1MO
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20171009
+DTEND;VALUE=DATE:20171010
+UID:5a4b1ab2e502a@calendarlabs.com
+STATUS:CONFIRMED
+SUMMARY:Columbus Day
+RRULE:FREQ=YEARLY;BYMONTH=10;BYDAY=2MO
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20171111
+DTEND;VALUE=DATE:20171112
+UID:5a4b1ab2e515a@calendarlabs.com
+STATUS:CONFIRMED
+SUMMARY:Veterans Day
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20171123
+DTEND;VALUE=DATE:20171124
+UID:5a4b1ab2e51ca@calendarlabs.com
+STATUS:CONFIRMED
+SUMMARY:Thanksgiving Day
+RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=4TH
+END:VEVENT
+BEGIN:VEVENT
+DTSTART;VALUE=DATE:20171225
+DTEND;VALUE=DATE:20171226
+UID:5a4b1ab2e5265@calendarlabs.com
+STATUS:CONFIRMED
+SUMMARY:Christmas
+RRULE:FREQ=YEARLY;INTERVAL=1
+END:VEVENT
+END:VCALENDAR
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/App.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/App.kt
new file mode 100644
index 0000000000000000000000000000000000000000..382012eaadb1ef50a0c72714160c8117f45022ef
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/App.kt
@@ -0,0 +1,21 @@
+package com.simplemobiletools.calendar
+
+import android.support.multidex.MultiDexApplication
+import com.facebook.stetho.Stetho
+import com.simplemobiletools.commons.extensions.checkUseEnglish
+import com.squareup.leakcanary.LeakCanary
+
+class App : MultiDexApplication() {
+    override fun onCreate() {
+        super.onCreate()
+        if (BuildConfig.DEBUG) {
+            if (LeakCanary.isInAnalyzerProcess(this)) {
+                return
+            }
+            LeakCanary.install(this)
+            Stetho.initializeWithDefaults(this)
+        }
+
+        checkUseEnglish()
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/EventActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/EventActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f2bc8cdc6a5cd4962d0931919c1ff402d4dcb7b0
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/EventActivity.kt
@@ -0,0 +1,873 @@
+package com.simplemobiletools.calendar.activities
+
+import android.annotation.SuppressLint
+import android.app.DatePickerDialog
+import android.app.TimePickerDialog
+import android.content.Intent
+import android.net.Uri
+import android.os.Bundle
+import android.text.method.LinkMovementMethod
+import android.view.Menu
+import android.view.MenuItem
+import android.view.WindowManager
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.dialogs.*
+import com.simplemobiletools.calendar.extensions.*
+import com.simplemobiletools.calendar.helpers.*
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.models.CalDAVCalendar
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.commons.dialogs.RadioGroupDialog
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.*
+import com.simplemobiletools.commons.models.RadioItem
+import kotlinx.android.synthetic.main.activity_event.*
+import org.joda.time.DateTime
+import java.util.*
+import java.util.regex.Pattern
+
+class EventActivity : SimpleActivity() {
+    private val LAT_LON_PATTERN = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)([,;])\\s*[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)\$"
+    private var mReminder1Minutes = 0
+    private var mReminder2Minutes = 0
+    private var mReminder3Minutes = 0
+    private var mRepeatInterval = 0
+    private var mRepeatLimit = 0
+    private var mRepeatRule = 0
+    private var mEventTypeId = DBHelper.REGULAR_EVENT_TYPE_ID
+    private var mDialogTheme = 0
+    private var mEventOccurrenceTS = 0
+    private var mEventCalendarId = STORED_LOCALLY_ONLY
+    private var wasActivityInitialized = false
+
+    lateinit var mEventStartDateTime: DateTime
+    lateinit var mEventEndDateTime: DateTime
+    lateinit var mEvent: Event
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_event)
+
+        supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_cross)
+        val intent = intent ?: return
+        mDialogTheme = getDialogTheme()
+
+        val eventId = intent.getIntExtra(EVENT_ID, 0)
+        val event = dbHelper.getEventWithId(eventId)
+
+        if (eventId != 0 && event == null) {
+            finish()
+            return
+        }
+
+        val localEventType = dbHelper.getEventType(config.lastUsedLocalEventTypeId)
+        if (localEventType == null || localEventType.caldavCalendarId != 0) {
+            config.lastUsedLocalEventTypeId = DBHelper.REGULAR_EVENT_TYPE_ID
+        }
+
+        mEventTypeId = config.lastUsedLocalEventTypeId
+
+        if (event != null) {
+            mEvent = event
+            mEventOccurrenceTS = intent.getIntExtra(EVENT_OCCURRENCE_TS, 0)
+            setupEditEvent()
+
+            if (intent.getBooleanExtra(IS_DUPLICATE_INTENT, false)) {
+                mEvent.id = 0
+            }
+        } else {
+            mEvent = Event()
+            mReminder1Minutes = config.defaultReminderMinutes
+            mReminder2Minutes = config.defaultReminderMinutes3
+            mReminder3Minutes = config.defaultReminderMinutes2
+            setupNewEvent()
+        }
+
+        checkReminderTexts()
+        updateRepetitionText()
+        updateStartTexts()
+        updateEndTexts()
+        updateEventType()
+        updateCalDAVCalendar()
+
+        event_show_on_map.setOnClickListener { showOnMap() }
+        event_start_date.setOnClickListener { setupStartDate() }
+        event_start_time.setOnClickListener { setupStartTime() }
+        event_end_date.setOnClickListener { setupEndDate() }
+        event_end_time.setOnClickListener { setupEndTime() }
+
+        event_all_day.setOnCheckedChangeListener { compoundButton, isChecked -> toggleAllDay(isChecked) }
+        event_repetition.setOnClickListener { showRepeatIntervalDialog() }
+        event_repetition_rule_holder.setOnClickListener { showRepetitionRuleDialog() }
+        event_repetition_limit_holder.setOnClickListener { showRepetitionTypePicker() }
+
+        event_reminder_1.setOnClickListener { showReminder1Dialog() }
+        event_reminder_2.setOnClickListener { showReminder2Dialog() }
+        event_reminder_3.setOnClickListener { showReminder3Dialog() }
+
+        event_type_holder.setOnClickListener { showEventTypeDialog() }
+
+        if (mEvent.flags and FLAG_ALL_DAY != 0)
+            event_all_day.toggle()
+
+        updateTextColors(event_scrollview)
+        updateIconColors()
+        wasActivityInitialized = true
+    }
+
+    override fun onCreateOptionsMenu(menu: Menu): Boolean {
+        menuInflater.inflate(R.menu.menu_event, menu)
+        if (wasActivityInitialized) {
+            menu.findItem(R.id.delete).isVisible = mEvent.id != 0
+            menu.findItem(R.id.share).isVisible = mEvent.id != 0
+            menu.findItem(R.id.duplicate).isVisible = mEvent.id != 0
+        }
+        return true
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem): Boolean {
+        when (item.itemId) {
+            R.id.save -> saveEvent()
+            R.id.delete -> deleteEvent()
+            R.id.duplicate -> duplicateEvent()
+            R.id.share -> shareEvent()
+            else -> return super.onOptionsItemSelected(item)
+        }
+        return true
+    }
+
+    private fun setupEditEvent() {
+        val realStart = if (mEventOccurrenceTS == 0) mEvent.startTS else mEventOccurrenceTS
+        val duration = mEvent.endTS - mEvent.startTS
+        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_HIDDEN)
+        supportActionBar?.title = resources.getString(R.string.edit_event)
+        mEventStartDateTime = Formatter.getDateTimeFromTS(realStart)
+        mEventEndDateTime = Formatter.getDateTimeFromTS(realStart + duration)
+        event_title.setText(mEvent.title)
+        event_location.setText(mEvent.location)
+        event_description.setText(mEvent.description)
+        event_description.movementMethod = LinkMovementMethod.getInstance()
+
+        mReminder1Minutes = mEvent.reminder1Minutes
+        mReminder2Minutes = mEvent.reminder2Minutes
+        mReminder3Minutes = mEvent.reminder3Minutes
+        mRepeatInterval = mEvent.repeatInterval
+        mRepeatLimit = mEvent.repeatLimit
+        mRepeatRule = mEvent.repeatRule
+        mEventTypeId = mEvent.eventType
+        mEventCalendarId = mEvent.getCalDAVCalendarId()
+        checkRepeatTexts(mRepeatInterval)
+    }
+
+    private fun setupNewEvent() {
+        window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_VISIBLE)
+        supportActionBar?.title = resources.getString(R.string.new_event)
+        val isLastCaldavCalendarOK = config.caldavSync && config.getSyncedCalendarIdsAsList().contains(config.lastUsedCaldavCalendarId.toString())
+        mEventCalendarId = if (isLastCaldavCalendarOK) config.lastUsedCaldavCalendarId else STORED_LOCALLY_ONLY
+
+        if (intent.action == Intent.ACTION_EDIT || intent.action == Intent.ACTION_INSERT) {
+            val startTS = (intent.getLongExtra("beginTime", System.currentTimeMillis()) / 1000).toInt()
+            mEventStartDateTime = Formatter.getDateTimeFromTS(startTS)
+
+            val endTS = (intent.getLongExtra("endTime", System.currentTimeMillis()) / 1000).toInt()
+            mEventEndDateTime = Formatter.getDateTimeFromTS(endTS)
+
+            event_title.setText(intent.getStringExtra("title"))
+            event_location.setText(intent.getStringExtra("eventLocation"))
+            event_description.setText(intent.getStringExtra("description"))
+            event_description.movementMethod = LinkMovementMethod.getInstance()
+        } else {
+            val startTS = intent.getIntExtra(NEW_EVENT_START_TS, 0)
+            val dateTime = Formatter.getDateTimeFromTS(startTS)
+            mEventStartDateTime = dateTime
+
+            val addHours = if (intent.getBooleanExtra(NEW_EVENT_SET_HOUR_DURATION, false)) 1 else 0
+            mEventEndDateTime = mEventStartDateTime.plusHours(addHours)
+        }
+    }
+
+    private fun showReminder1Dialog() {
+        showPickSecondsDialogHelper(mReminder1Minutes) {
+            mReminder1Minutes = if (it <= 0) it else it / 60
+            checkReminderTexts()
+        }
+    }
+
+    private fun showReminder2Dialog() {
+        showPickSecondsDialogHelper(mReminder2Minutes) {
+            mReminder2Minutes = if (it <= 0) it else it / 60
+            checkReminderTexts()
+        }
+    }
+
+    private fun showReminder3Dialog() {
+        showPickSecondsDialogHelper(mReminder3Minutes) {
+            mReminder3Minutes = if (it <= 0) it else it / 60
+            checkReminderTexts()
+        }
+    }
+
+    private fun showRepeatIntervalDialog() {
+        showEventRepeatIntervalDialog(mRepeatInterval) {
+            setRepeatInterval(it)
+        }
+    }
+
+    private fun setRepeatInterval(interval: Int) {
+        mRepeatInterval = interval
+        updateRepetitionText()
+        checkRepeatTexts(interval)
+
+        when {
+            mRepeatInterval.isXWeeklyRepetition() -> setRepeatRule(Math.pow(2.0, (mEventStartDateTime.dayOfWeek - 1).toDouble()).toInt())
+            mRepeatInterval.isXMonthlyRepetition() -> setRepeatRule(REPEAT_SAME_DAY)
+            mRepeatInterval.isXYearlyRepetition() -> setRepeatRule(REPEAT_SAME_DAY)
+        }
+    }
+
+    private fun checkRepeatTexts(limit: Int) {
+        event_repetition_limit_holder.beGoneIf(limit == 0)
+        checkRepetitionLimitText()
+
+        event_repetition_rule_holder.beVisibleIf(mRepeatInterval.isXWeeklyRepetition() || mRepeatInterval.isXMonthlyRepetition() || mRepeatInterval.isXYearlyRepetition())
+        checkRepetitionRuleText()
+    }
+
+    private fun showRepetitionTypePicker() {
+        hideKeyboard()
+        RepeatLimitTypePickerDialog(this, mRepeatLimit, mEventStartDateTime.seconds()) {
+            setRepeatLimit(it)
+        }
+    }
+
+    private fun setRepeatLimit(limit: Int) {
+        mRepeatLimit = limit
+        checkRepetitionLimitText()
+    }
+
+    private fun checkRepetitionLimitText() {
+        event_repetition_limit.text = when {
+            mRepeatLimit == 0 -> {
+                event_repetition_limit_label.text = getString(R.string.repeat)
+                resources.getString(R.string.forever)
+            }
+            mRepeatLimit > 0 -> {
+                event_repetition_limit_label.text = getString(R.string.repeat_till)
+                val repeatLimitDateTime = Formatter.getDateTimeFromTS(mRepeatLimit)
+                Formatter.getFullDate(applicationContext, repeatLimitDateTime)
+            }
+            else -> {
+                event_repetition_limit_label.text = getString(R.string.repeat)
+                "${-mRepeatLimit} ${getString(R.string.times)}"
+            }
+        }
+    }
+
+    private fun showRepetitionRuleDialog() {
+        hideKeyboard()
+        when {
+            mRepeatInterval.isXWeeklyRepetition() -> RepeatRuleWeeklyDialog(this, mRepeatRule) {
+                setRepeatRule(it)
+            }
+            mRepeatInterval.isXMonthlyRepetition() -> {
+                val items = getAvailableMonthlyRepetitionRules()
+                RadioGroupDialog(this, items, mRepeatRule) {
+                    setRepeatRule(it as Int)
+                }
+            }
+            mRepeatInterval.isXYearlyRepetition() -> {
+                val items = getAvailableYearlyRepetitionRules()
+                RadioGroupDialog(this, items, mRepeatRule) {
+                    setRepeatRule(it as Int)
+                }
+            }
+        }
+    }
+
+    private fun getAvailableMonthlyRepetitionRules(): ArrayList<RadioItem> {
+        val items = arrayListOf(RadioItem(REPEAT_SAME_DAY, getString(R.string.repeat_on_the_same_day_monthly)))
+
+        // split Every Last Sunday and Every Fourth Sunday of the month, if the month has 4 sundays
+        if (isLastWeekDayOfMonth()) {
+            val order = (mEventStartDateTime.dayOfMonth - 1) / 7 + 1
+            if (order == 4) {
+                items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY)))
+                items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
+            } else if (order == 5) {
+                items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
+            }
+        } else {
+            items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayString(true, REPEAT_ORDER_WEEKDAY)))
+        }
+
+        if (isLastDayOfTheMonth()) {
+            items.add(RadioItem(REPEAT_LAST_DAY, getString(R.string.repeat_on_the_last_day_monthly)))
+        }
+        return items
+    }
+
+    private fun getAvailableYearlyRepetitionRules(): ArrayList<RadioItem> {
+        val items = arrayListOf(RadioItem(REPEAT_SAME_DAY, getString(R.string.repeat_on_the_same_day_yearly)))
+
+        if (isLastWeekDayOfMonth()) {
+            val order = (mEventStartDateTime.dayOfMonth - 1) / 7 + 1
+            if (order == 4) {
+                items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY)))
+                items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
+            } else if (order == 5) {
+                items.add(RadioItem(REPEAT_ORDER_WEEKDAY_USE_LAST, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY_USE_LAST)))
+            }
+        } else {
+            items.add(RadioItem(REPEAT_ORDER_WEEKDAY, getRepeatXthDayInMonthString(true, REPEAT_ORDER_WEEKDAY)))
+        }
+
+        return items
+    }
+
+    private fun isLastDayOfTheMonth() = mEventStartDateTime.dayOfMonth == mEventStartDateTime.dayOfMonth().withMaximumValue().dayOfMonth
+
+    private fun isLastWeekDayOfMonth() = mEventStartDateTime.monthOfYear != mEventStartDateTime.plusDays(7).monthOfYear
+
+    private fun getRepeatXthDayString(includeBase: Boolean, repeatRule: Int): String {
+        val dayOfWeek = mEventStartDateTime.dayOfWeek
+        val base = getBaseString(dayOfWeek)
+        val order = getOrderString(repeatRule)
+        val dayString = getDayString(dayOfWeek)
+        return if (includeBase) {
+            "$base $order $dayString"
+        } else {
+            val everyString = getString(if (isMaleGender(mEventStartDateTime.dayOfWeek)) R.string.every_m else R.string.every_f)
+            "$everyString $order $dayString"
+        }
+    }
+
+    private fun getBaseString(day: Int): String {
+        return getString(if (isMaleGender(day)) {
+            R.string.repeat_every_m
+        } else {
+            R.string.repeat_every_f
+        })
+    }
+
+    private fun isMaleGender(day: Int) = day == 1 || day == 2 || day == 4 || day == 5
+
+    private fun getOrderString(repeatRule: Int): String {
+        val dayOfMonth = mEventStartDateTime.dayOfMonth
+        var order = (dayOfMonth - 1) / 7 + 1
+        if (order == 4 && isLastWeekDayOfMonth() && repeatRule == REPEAT_ORDER_WEEKDAY_USE_LAST) {
+            order = -1
+        }
+
+        val isMale = isMaleGender(mEventStartDateTime.dayOfWeek)
+        return getString(when (order) {
+            1 -> if (isMale) R.string.first_m else R.string.first_f
+            2 -> if (isMale) R.string.second_m else R.string.second_f
+            3 -> if (isMale) R.string.third_m else R.string.third_f
+            4 -> if (isMale) R.string.fourth_m else R.string.fourth_f
+            else -> if (isMale) R.string.last_m else R.string.last_f
+        })
+    }
+
+    private fun getDayString(day: Int): String {
+        return getString(when (day) {
+            1 -> R.string.monday_alt
+            2 -> R.string.tuesday_alt
+            3 -> R.string.wednesday_alt
+            4 -> R.string.thursday_alt
+            5 -> R.string.friday_alt
+            6 -> R.string.saturday_alt
+            else -> R.string.sunday_alt
+        })
+    }
+
+    private fun getRepeatXthDayInMonthString(includeBase: Boolean, repeatRule: Int): String {
+        val weekDayString = getRepeatXthDayString(includeBase, repeatRule)
+        val monthString = resources.getStringArray(R.array.in_months)[mEventStartDateTime.monthOfYear - 1]
+        return "$weekDayString $monthString"
+    }
+
+    private fun setRepeatRule(rule: Int) {
+        mRepeatRule = rule
+        checkRepetitionRuleText()
+        if (rule == 0) {
+            setRepeatInterval(0)
+        }
+    }
+
+    private fun checkRepetitionRuleText() {
+        when {
+            mRepeatInterval.isXWeeklyRepetition() -> {
+                event_repetition_rule.text = if (mRepeatRule == EVERY_DAY_BIT) getString(R.string.every_day) else getSelectedDaysString(mRepeatRule)
+            }
+            mRepeatInterval.isXMonthlyRepetition() -> {
+                val repeatString = if (mRepeatRule == REPEAT_ORDER_WEEKDAY_USE_LAST || mRepeatRule == REPEAT_ORDER_WEEKDAY)
+                    R.string.repeat else R.string.repeat_on
+
+                event_repetition_rule_label.text = getString(repeatString)
+                event_repetition_rule.text = getMonthlyRepetitionRuleText()
+            }
+            mRepeatInterval.isXYearlyRepetition() -> {
+                val repeatString = if (mRepeatRule == REPEAT_ORDER_WEEKDAY_USE_LAST || mRepeatRule == REPEAT_ORDER_WEEKDAY)
+                    R.string.repeat else R.string.repeat_on
+
+                event_repetition_rule_label.text = getString(repeatString)
+                event_repetition_rule.text = getYearlyRepetitionRuleText()
+            }
+        }
+    }
+
+    private fun getMonthlyRepetitionRuleText() = when (mRepeatRule) {
+        REPEAT_SAME_DAY -> getString(R.string.the_same_day)
+        REPEAT_LAST_DAY -> getString(R.string.the_last_day)
+        else -> getRepeatXthDayString(false, mRepeatRule)
+    }
+
+    private fun getYearlyRepetitionRuleText() = when (mRepeatRule) {
+        REPEAT_SAME_DAY -> getString(R.string.the_same_day)
+        else -> getRepeatXthDayInMonthString(false, mRepeatRule)
+    }
+
+    private fun showEventTypeDialog() {
+        hideKeyboard()
+        SelectEventTypeDialog(this, mEventTypeId, false) {
+            mEventTypeId = it.id
+            updateEventType()
+        }
+    }
+
+    private fun checkReminderTexts() {
+        updateReminder1Text()
+        updateReminder2Text()
+        updateReminder3Text()
+    }
+
+    private fun updateReminder1Text() {
+        event_reminder_1.text = getFormattedMinutes(mReminder1Minutes)
+        if (mReminder1Minutes == REMINDER_OFF) {
+            mReminder2Minutes = REMINDER_OFF
+            mReminder3Minutes = REMINDER_OFF
+        }
+    }
+
+    private fun updateReminder2Text() {
+        event_reminder_2.apply {
+            beGoneIf(mReminder1Minutes == REMINDER_OFF)
+            if (mReminder2Minutes == REMINDER_OFF) {
+                text = resources.getString(R.string.add_another_reminder)
+                alpha = 0.4f
+                mReminder3Minutes = REMINDER_OFF
+            } else {
+                text = getFormattedMinutes(mReminder2Minutes)
+                alpha = 1f
+            }
+        }
+    }
+
+    private fun updateReminder3Text() {
+        event_reminder_3.apply {
+            beGoneIf(mReminder2Minutes == REMINDER_OFF || mReminder1Minutes == REMINDER_OFF)
+            if (mReminder3Minutes == REMINDER_OFF) {
+                text = resources.getString(R.string.add_another_reminder)
+                alpha = 0.4f
+            } else {
+                text = getFormattedMinutes(mReminder3Minutes)
+                alpha = 1f
+            }
+        }
+    }
+
+    private fun updateRepetitionText() {
+        event_repetition.text = getRepetitionText(mRepeatInterval)
+    }
+
+    private fun updateEventType() {
+        val eventType = dbHelper.getEventType(mEventTypeId)
+        if (eventType != null) {
+            event_type.text = eventType.title
+            event_type_color.setFillWithStroke(eventType.color, config.backgroundColor)
+        }
+    }
+
+    private fun updateCalDAVCalendar() {
+        if (config.caldavSync) {
+            event_caldav_calendar_image.beVisible()
+            event_caldav_calendar_holder.beVisible()
+            event_caldav_calendar_divider.beVisible()
+
+            val calendars = CalDAVHandler(applicationContext).getCalDAVCalendars(this).filter {
+                it.canWrite() && config.getSyncedCalendarIdsAsList().contains(it.id.toString())
+            }
+            updateCurrentCalendarInfo(if (mEventCalendarId == STORED_LOCALLY_ONLY) null else getCalendarWithId(calendars, getCalendarId()))
+
+            event_caldav_calendar_holder.setOnClickListener {
+                hideKeyboard()
+                SelectEventCalendarDialog(this, calendars, mEventCalendarId) {
+                    if (mEventCalendarId != STORED_LOCALLY_ONLY && it == STORED_LOCALLY_ONLY) {
+                        mEventTypeId = config.lastUsedLocalEventTypeId
+                        updateEventType()
+                    }
+                    mEventCalendarId = it
+                    config.lastUsedCaldavCalendarId = it
+                    updateCurrentCalendarInfo(getCalendarWithId(calendars, it))
+                }
+            }
+        } else {
+            updateCurrentCalendarInfo(null)
+        }
+    }
+
+    private fun getCalendarId() = if (mEvent.source == SOURCE_SIMPLE_CALENDAR) config.lastUsedCaldavCalendarId else mEvent.getCalDAVCalendarId()
+
+    private fun getCalendarWithId(calendars: List<CalDAVCalendar>, calendarId: Int): CalDAVCalendar? =
+            calendars.firstOrNull { it.id == calendarId }
+
+    private fun updateCurrentCalendarInfo(currentCalendar: CalDAVCalendar?) {
+        event_type_image.beVisibleIf(currentCalendar == null)
+        event_type_holder.beVisibleIf(currentCalendar == null)
+        event_caldav_calendar_divider.beVisibleIf(currentCalendar == null)
+        event_caldav_calendar_email.beGoneIf(currentCalendar == null)
+
+        if (currentCalendar == null) {
+            mEventCalendarId = STORED_LOCALLY_ONLY
+            val mediumMargin = resources.getDimension(R.dimen.medium_margin).toInt()
+            event_caldav_calendar_name.apply {
+                text = getString(R.string.store_locally_only)
+                setPadding(paddingLeft, paddingTop, paddingRight, mediumMargin)
+            }
+
+            event_caldav_calendar_holder.apply {
+                setPadding(paddingLeft, mediumMargin, paddingRight, mediumMargin)
+            }
+        } else {
+            event_caldav_calendar_email.text = currentCalendar.accountName
+            event_caldav_calendar_name.apply {
+                text = currentCalendar.displayName
+                setPadding(paddingLeft, paddingTop, paddingRight, resources.getDimension(R.dimen.tiny_margin).toInt())
+            }
+
+            event_caldav_calendar_holder.apply {
+                setPadding(paddingLeft, 0, paddingRight, 0)
+            }
+        }
+    }
+
+    private fun toggleAllDay(isChecked: Boolean) {
+        hideKeyboard()
+        event_start_time.beGoneIf(isChecked)
+        event_end_time.beGoneIf(isChecked)
+    }
+
+    private fun shareEvent() {
+        shareEvents(arrayListOf(mEvent.id))
+    }
+
+    private fun deleteEvent() {
+        DeleteEventDialog(this, arrayListOf(mEvent.id)) {
+            if (it) {
+                dbHelper.deleteEvents(arrayOf(mEvent.id.toString()), true)
+            } else {
+                dbHelper.addEventRepeatException(mEvent.id, mEventOccurrenceTS, true)
+            }
+            finish()
+        }
+    }
+
+    private fun duplicateEvent() {
+        Intent(this, EventActivity::class.java).apply {
+            putExtra(EVENT_ID, mEvent.id)
+            putExtra(EVENT_OCCURRENCE_TS, mEventOccurrenceTS)
+            putExtra(IS_DUPLICATE_INTENT, true)
+            startActivity(this)
+        }
+        finish()
+    }
+
+    private fun saveEvent() {
+        val newTitle = event_title.value
+        if (newTitle.isEmpty()) {
+            toast(R.string.title_empty)
+            event_title.requestFocus()
+            return
+        }
+
+        val newStartTS = mEventStartDateTime.withSecondOfMinute(0).withMillisOfSecond(0).seconds()
+        val newEndTS = mEventEndDateTime.withSecondOfMinute(0).withMillisOfSecond(0).seconds()
+
+        if (newStartTS > newEndTS) {
+            toast(R.string.end_before_start)
+            return
+        }
+
+        val wasRepeatable = mEvent.repeatInterval > 0
+        val oldSource = mEvent.source
+        val newImportId = if (mEvent.id != 0) mEvent.importId else UUID.randomUUID().toString().replace("-", "") + System.currentTimeMillis().toString()
+
+        val newEventType = if (!config.caldavSync || config.lastUsedCaldavCalendarId == 0 || mEventCalendarId == STORED_LOCALLY_ONLY) {
+            mEventTypeId
+        } else {
+            dbHelper.getEventTypeWithCalDAVCalendarId(config.lastUsedCaldavCalendarId)?.id ?: config.lastUsedLocalEventTypeId
+        }
+
+        val newSource = if (!config.caldavSync || config.lastUsedCaldavCalendarId == 0 || mEventCalendarId == STORED_LOCALLY_ONLY) {
+            config.lastUsedLocalEventTypeId = newEventType
+            SOURCE_SIMPLE_CALENDAR
+        } else {
+            "$CALDAV-${config.lastUsedCaldavCalendarId}"
+        }
+
+        val reminders = sortedSetOf(mReminder1Minutes, mReminder2Minutes, mReminder3Minutes).filter { it != REMINDER_OFF }
+        val reminder1 = reminders.getOrElse(0, { REMINDER_OFF })
+        val reminder2 = reminders.getOrElse(1, { REMINDER_OFF })
+        val reminder3 = reminders.getOrElse(2, { REMINDER_OFF })
+
+        config.apply {
+            defaultReminderMinutes = reminder1
+            defaultReminderMinutes2 = reminder2
+            defaultReminderMinutes3 = reminder3
+        }
+
+        mEvent.apply {
+            startTS = newStartTS
+            endTS = newEndTS
+            title = newTitle
+            description = event_description.value
+            reminder1Minutes = reminder1
+            reminder2Minutes = reminder2
+            reminder3Minutes = reminder3
+            repeatInterval = mRepeatInterval
+            importId = newImportId
+            flags = if (event_all_day.isChecked) (mEvent.flags.addBit(FLAG_ALL_DAY)) else (mEvent.flags.removeBit(FLAG_ALL_DAY))
+            repeatLimit = if (repeatInterval == 0) 0 else mRepeatLimit
+            repeatRule = mRepeatRule
+            eventType = newEventType
+            offset = getCurrentOffset()
+            isDstIncluded = TimeZone.getDefault().inDaylightTime(Date())
+            lastUpdated = System.currentTimeMillis()
+            source = newSource
+            location = event_location.value
+        }
+
+        // recreate the event if it was moved in a different CalDAV calendar
+        if (mEvent.id != 0 && oldSource != newSource) {
+            dbHelper.deleteEvents(arrayOf(mEvent.id.toString()), true)
+            mEvent.id = 0
+        }
+
+        storeEvent(wasRepeatable)
+    }
+
+    private fun storeEvent(wasRepeatable: Boolean) {
+        if (mEvent.id == 0) {
+            dbHelper.insert(mEvent, true) {
+                if (DateTime.now().isAfter(mEventStartDateTime.millis)) {
+                    if (mEvent.repeatInterval == 0 && mEvent.getReminders().isNotEmpty()) {
+                        notifyEvent(mEvent)
+                    }
+                } else {
+                    toast(R.string.event_added)
+                }
+
+                finish()
+            }
+        } else {
+            if (mRepeatInterval > 0 && wasRepeatable) {
+                EditRepeatingEventDialog(this) {
+                    if (it) {
+                        dbHelper.update(mEvent, true) {
+                            eventUpdated()
+                        }
+                    } else {
+                        dbHelper.addEventRepeatException(mEvent.id, mEventOccurrenceTS, true)
+                        mEvent.apply {
+                            parentId = id
+                            id = 0
+                            repeatRule = 0
+                            repeatInterval = 0
+                            repeatLimit = 0
+                        }
+
+                        dbHelper.insert(mEvent, true) {
+                            toast(R.string.event_updated)
+                            finish()
+                        }
+                    }
+                }
+            } else {
+                dbHelper.update(mEvent, true) {
+                    eventUpdated()
+                }
+            }
+        }
+    }
+
+    private fun eventUpdated() {
+        toast(R.string.event_updated)
+        finish()
+    }
+
+    private fun updateStartTexts() {
+        updateStartDateText()
+        updateStartTimeText()
+    }
+
+    private fun updateStartDateText() {
+        event_start_date.text = Formatter.getDate(applicationContext, mEventStartDateTime)
+        checkStartEndValidity()
+    }
+
+    private fun updateStartTimeText() {
+        event_start_time.text = Formatter.getTime(this, mEventStartDateTime)
+        checkStartEndValidity()
+    }
+
+    private fun updateEndTexts() {
+        updateEndDateText()
+        updateEndTimeText()
+    }
+
+    private fun updateEndDateText() {
+        event_end_date.text = Formatter.getDate(applicationContext, mEventEndDateTime)
+        checkStartEndValidity()
+    }
+
+    private fun updateEndTimeText() {
+        event_end_time.text = Formatter.getTime(this, mEventEndDateTime)
+        checkStartEndValidity()
+    }
+
+    private fun checkStartEndValidity() {
+        val textColor = if (mEventStartDateTime.isAfter(mEventEndDateTime)) resources.getColor(R.color.red_text) else config.textColor
+        event_end_date.setTextColor(textColor)
+        event_end_time.setTextColor(textColor)
+    }
+
+    private fun showOnMap() {
+        if (event_location.value.isEmpty()) {
+            toast(R.string.please_fill_location)
+            return
+        }
+
+        val pattern = Pattern.compile(LAT_LON_PATTERN)
+        val locationValue = event_location.value
+        val uri = if (pattern.matcher(locationValue).find()) {
+            val delimiter = if (locationValue.contains(';')) ";" else ","
+            val parts = locationValue.split(delimiter)
+            val latitude = parts.first()
+            val longitude = parts.last()
+            Uri.parse("geo:$latitude,$longitude")
+        } else {
+            val location = Uri.encode(locationValue)
+            Uri.parse("geo:0,0?q=$location")
+        }
+
+        val intent = Intent(Intent.ACTION_VIEW, uri)
+        if (intent.resolveActivity(packageManager) != null) {
+            startActivity(intent)
+        } else {
+            toast(R.string.no_app_found)
+        }
+    }
+
+    @SuppressLint("NewApi")
+    private fun setupStartDate() {
+        hideKeyboard()
+        config.backgroundColor.getContrastColor()
+        val datepicker = DatePickerDialog(this, mDialogTheme, startDateSetListener, mEventStartDateTime.year, mEventStartDateTime.monthOfYear - 1,
+                mEventStartDateTime.dayOfMonth)
+
+        if (isLollipopPlus()) {
+            datepicker.datePicker.firstDayOfWeek = if (config.isSundayFirst) Calendar.SUNDAY else Calendar.MONDAY
+        }
+
+        datepicker.show()
+    }
+
+    private fun setupStartTime() {
+        hideKeyboard()
+        TimePickerDialog(this, mDialogTheme, startTimeSetListener, mEventStartDateTime.hourOfDay, mEventStartDateTime.minuteOfHour, config.use24HourFormat).show()
+    }
+
+    @SuppressLint("NewApi")
+    private fun setupEndDate() {
+        hideKeyboard()
+        val datepicker = DatePickerDialog(this, mDialogTheme, endDateSetListener, mEventEndDateTime.year, mEventEndDateTime.monthOfYear - 1,
+                mEventEndDateTime.dayOfMonth)
+
+        if (isLollipopPlus()) {
+            datepicker.datePicker.firstDayOfWeek = if (config.isSundayFirst) Calendar.SUNDAY else Calendar.MONDAY
+        }
+
+        datepicker.show()
+    }
+
+    private fun setupEndTime() {
+        hideKeyboard()
+        TimePickerDialog(this, mDialogTheme, endTimeSetListener, mEventEndDateTime.hourOfDay, mEventEndDateTime.minuteOfHour, config.use24HourFormat).show()
+    }
+
+    private val startDateSetListener = DatePickerDialog.OnDateSetListener { view, year, monthOfYear, dayOfMonth ->
+        dateSet(year, monthOfYear, dayOfMonth, true)
+    }
+
+    private val startTimeSetListener = TimePickerDialog.OnTimeSetListener { view, hourOfDay, minute ->
+        timeSet(hourOfDay, minute, true)
+    }
+
+    private val endDateSetListener = DatePickerDialog.OnDateSetListener { view, year, monthOfYear, dayOfMonth -> dateSet(year, monthOfYear, dayOfMonth, false) }
+
+    private val endTimeSetListener = TimePickerDialog.OnTimeSetListener { view, hourOfDay, minute -> timeSet(hourOfDay, minute, false) }
+
+    private fun dateSet(year: Int, month: Int, day: Int, isStart: Boolean) {
+        if (isStart) {
+            val diff = mEventEndDateTime.seconds() - mEventStartDateTime.seconds()
+
+            mEventStartDateTime = mEventStartDateTime.withDate(year, month + 1, day)
+            updateStartDateText()
+            checkRepeatRule()
+
+            mEventEndDateTime = mEventStartDateTime.plusSeconds(diff)
+            updateEndTexts()
+        } else {
+            mEventEndDateTime = mEventEndDateTime.withDate(year, month + 1, day)
+            updateEndDateText()
+        }
+    }
+
+    private fun timeSet(hours: Int, minutes: Int, isStart: Boolean) {
+        if (isStart) {
+            val diff = mEventEndDateTime.seconds() - mEventStartDateTime.seconds()
+
+            mEventStartDateTime = mEventStartDateTime.withHourOfDay(hours).withMinuteOfHour(minutes)
+            updateStartTimeText()
+
+            mEventEndDateTime = mEventStartDateTime.plusSeconds(diff)
+            updateEndTexts()
+        } else {
+            mEventEndDateTime = mEventEndDateTime.withHourOfDay(hours).withMinuteOfHour(minutes)
+            updateEndTimeText()
+        }
+    }
+
+    private fun checkRepeatRule() {
+        if (mRepeatInterval.isXWeeklyRepetition()) {
+            val day = mRepeatRule
+            if (day == MONDAY_BIT || day == TUESDAY_BIT || day == WEDNESDAY_BIT || day == THURSDAY_BIT || day == FRIDAY_BIT || day == SATURDAY_BIT || day == SUNDAY_BIT) {
+                setRepeatRule(Math.pow(2.0, (mEventStartDateTime.dayOfWeek - 1).toDouble()).toInt())
+            }
+        } else if (mRepeatInterval.isXMonthlyRepetition() || mRepeatInterval.isXYearlyRepetition()) {
+            if (mRepeatRule == REPEAT_LAST_DAY && !isLastDayOfTheMonth())
+                mRepeatRule = REPEAT_SAME_DAY
+            checkRepetitionRuleText()
+        }
+    }
+
+    private fun updateIconColors() {
+        val textColor = config.textColor
+        event_time_image.applyColorFilter(textColor)
+        event_repetition_image.applyColorFilter(textColor)
+        event_reminder_image.applyColorFilter(textColor)
+        event_type_image.applyColorFilter(textColor)
+        event_caldav_calendar_image.applyColorFilter(textColor)
+        event_show_on_map.applyColorFilter(getAdjustedPrimaryColor())
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/MainActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/MainActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..75374d906650e1310264f83f2515e3cd5407cc34
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/MainActivity.kt
@@ -0,0 +1,842 @@
+package com.simplemobiletools.calendar.activities
+
+import android.app.SearchManager
+import android.content.Context
+import android.content.Intent
+import android.content.pm.ActivityInfo
+import android.database.ContentObserver
+import android.database.Cursor
+import android.graphics.drawable.ColorDrawable
+import android.net.Uri
+import android.os.Bundle
+import android.os.Handler
+import android.provider.ContactsContract
+import android.support.v4.view.MenuItemCompat
+import android.support.v7.widget.SearchView
+import android.view.Menu
+import android.view.MenuItem
+import android.widget.Toast
+import com.simplemobiletools.calendar.BuildConfig
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.adapters.EventListAdapter
+import com.simplemobiletools.calendar.dialogs.ExportEventsDialog
+import com.simplemobiletools.calendar.dialogs.FilterEventTypesDialog
+import com.simplemobiletools.calendar.dialogs.ImportEventsDialog
+import com.simplemobiletools.calendar.extensions.*
+import com.simplemobiletools.calendar.fragments.*
+import com.simplemobiletools.calendar.helpers.*
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.calendar.models.ListEvent
+import com.simplemobiletools.commons.dialogs.FilePickerDialog
+import com.simplemobiletools.commons.dialogs.RadioGroupDialog
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.*
+import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
+import com.simplemobiletools.commons.models.FAQItem
+import com.simplemobiletools.commons.models.RadioItem
+import com.simplemobiletools.commons.models.Release
+import kotlinx.android.synthetic.main.activity_main.*
+import org.joda.time.DateTime
+import java.io.FileOutputStream
+import java.text.SimpleDateFormat
+import java.util.*
+import kotlin.collections.ArrayList
+
+class MainActivity : SimpleActivity(), RefreshRecyclerViewListener {
+    private val CALDAV_SYNC_DELAY = 1000L
+
+    private var showCalDAVRefreshToast = false
+    private var mShouldFilterBeVisible = false
+    private var mIsSearchOpen = false
+    private var mLatestSearchQuery = ""
+    private var mCalDAVSyncHandler = Handler()
+    private var mSearchMenuItem: MenuItem? = null
+    private var shouldGoToTodayBeVisible = false
+    private var goToTodayButton: MenuItem? = null
+    private var currentFragments = ArrayList<MyFragmentHolder>()
+
+    private var mStoredTextColor = 0
+    private var mStoredBackgroundColor = 0
+    private var mStoredPrimaryColor = 0
+    private var mStoredDayCode = ""
+    private var mStoredIsSundayFirst = false
+    private var mStoredUse24HourFormat = false
+    private var mStoredDimPastEvents = true
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_main)
+        appLaunched(BuildConfig.APPLICATION_ID)
+
+        // just get a reference to the database to make sure it is created properly
+        dbHelper
+
+        checkWhatsNewDialog()
+        calendar_fab.beVisibleIf(config.storedView != YEARLY_VIEW)
+        calendar_fab.setOnClickListener {
+            launchNewEventIntent(currentFragments.last().getNewEventDayCode())
+        }
+
+        storeStateVariables()
+        if (resources.getBoolean(R.bool.portrait_only)) {
+            requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
+        }
+
+        if (!checkViewIntents()) {
+            return
+        }
+
+        if (!checkOpenIntents()) {
+            updateViewPager()
+        }
+
+        if (!hasPermission(PERMISSION_WRITE_CALENDAR) || !hasPermission(PERMISSION_READ_CALENDAR)) {
+            config.caldavSync = false
+        }
+
+        if (config.caldavSync) {
+            refreshCalDAVCalendars(false)
+        }
+    }
+
+    override fun onResume() {
+        super.onResume()
+        if (mStoredTextColor != config.textColor || mStoredBackgroundColor != config.backgroundColor || mStoredPrimaryColor != config.primaryColor
+                || mStoredDayCode != Formatter.getTodayCode(applicationContext) || mStoredDimPastEvents != config.dimPastEvents) {
+            updateViewPager()
+        }
+
+        dbHelper.getEventTypes {
+            mShouldFilterBeVisible = it.size > 1 || config.displayEventTypes.isEmpty()
+        }
+
+        if (config.storedView == WEEKLY_VIEW) {
+            if (mStoredIsSundayFirst != config.isSundayFirst || mStoredUse24HourFormat != config.use24HourFormat) {
+                updateViewPager()
+            }
+        }
+
+        storeStateVariables()
+        updateWidgets()
+        if (config.storedView != EVENTS_LIST_VIEW) {
+            updateTextColors(calendar_coordinator)
+        }
+        search_placeholder.setTextColor(config.textColor)
+        search_placeholder_2.setTextColor(config.textColor)
+        calendar_fab.setColors(config.textColor, getAdjustedPrimaryColor(), config.backgroundColor)
+        search_holder.background = ColorDrawable(config.backgroundColor)
+    }
+
+    override fun onPause() {
+        super.onPause()
+        storeStateVariables()
+    }
+
+    override fun onStop() {
+        super.onStop()
+        mCalDAVSyncHandler.removeCallbacksAndMessages(null)
+        contentResolver.unregisterContentObserver(calDAVSyncObserver)
+        closeSearch()
+    }
+
+    override fun onCreateOptionsMenu(menu: Menu): Boolean {
+        menuInflater.inflate(R.menu.menu_main, menu)
+        menu.apply {
+            goToTodayButton = findItem(R.id.go_to_today)
+            findItem(R.id.filter).isVisible = mShouldFilterBeVisible
+            findItem(R.id.go_to_today).isVisible = shouldGoToTodayBeVisible && config.storedView != EVENTS_LIST_VIEW
+        }
+
+        setupSearch(menu)
+        return true
+    }
+
+    override fun onPrepareOptionsMenu(menu: Menu?): Boolean {
+        menu!!.apply {
+            findItem(R.id.refresh_caldav_calendars).isVisible = config.caldavSync
+        }
+
+        return true
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem): Boolean {
+        when (item.itemId) {
+            R.id.change_view -> showViewDialog()
+            R.id.go_to_today -> goToToday()
+            R.id.filter -> showFilterDialog()
+            R.id.refresh_caldav_calendars -> refreshCalDAVCalendars(true)
+            R.id.add_holidays -> addHolidays()
+            R.id.add_birthdays -> tryAddBirthdays()
+            R.id.add_anniversaries -> tryAddAnniversaries()
+            R.id.import_events -> tryImportEvents()
+            R.id.export_events -> tryExportEvents()
+            R.id.settings -> launchSettings()
+            R.id.about -> launchAbout()
+            android.R.id.home -> onBackPressed()
+            else -> return super.onOptionsItemSelected(item)
+        }
+        return true
+    }
+
+    override fun onBackPressed() {
+        if (currentFragments.size > 1) {
+            removeTopFragment()
+        } else {
+            super.onBackPressed()
+        }
+    }
+
+    override fun onNewIntent(intent: Intent?) {
+        super.onNewIntent(intent)
+        setIntent(intent)
+        checkOpenIntents()
+        checkViewIntents()
+    }
+
+    private fun storeStateVariables() {
+        config.apply {
+            mStoredIsSundayFirst = isSundayFirst
+            mStoredTextColor = textColor
+            mStoredPrimaryColor = primaryColor
+            mStoredBackgroundColor = backgroundColor
+            mStoredUse24HourFormat = use24HourFormat
+            mStoredDimPastEvents = dimPastEvents
+        }
+        mStoredDayCode = Formatter.getTodayCode(applicationContext)
+    }
+
+    private fun setupSearch(menu: Menu) {
+        val searchManager = getSystemService(Context.SEARCH_SERVICE) as SearchManager
+        mSearchMenuItem = menu.findItem(R.id.search)
+        (mSearchMenuItem!!.actionView as SearchView).apply {
+            setSearchableInfo(searchManager.getSearchableInfo(componentName))
+            isSubmitButtonEnabled = false
+            setOnQueryTextListener(object : SearchView.OnQueryTextListener {
+                override fun onQueryTextSubmit(query: String) = false
+
+                override fun onQueryTextChange(newText: String): Boolean {
+                    if (mIsSearchOpen) {
+                        searchQueryChanged(newText)
+                    }
+                    return true
+                }
+            })
+        }
+
+        MenuItemCompat.setOnActionExpandListener(mSearchMenuItem, object : MenuItemCompat.OnActionExpandListener {
+            override fun onMenuItemActionExpand(item: MenuItem?): Boolean {
+                mIsSearchOpen = true
+                search_holder.beVisible()
+                calendar_fab.beGone()
+                searchQueryChanged("")
+                return true
+            }
+
+            override fun onMenuItemActionCollapse(item: MenuItem?): Boolean {
+                mIsSearchOpen = false
+                search_holder.beGone()
+                calendar_fab.beVisible()
+                return true
+            }
+        })
+    }
+
+    private fun closeSearch() {
+        mSearchMenuItem?.collapseActionView()
+    }
+
+    private fun checkOpenIntents(): Boolean {
+        val dayCodeToOpen = intent.getStringExtra(DAY_CODE) ?: ""
+        val openMonth = intent.getBooleanExtra(OPEN_MONTH, false)
+        intent.removeExtra(OPEN_MONTH)
+        intent.removeExtra(DAY_CODE)
+        if (dayCodeToOpen.isNotEmpty()) {
+            calendar_fab.beVisible()
+            config.storedView = if (openMonth) MONTHLY_VIEW else DAILY_VIEW
+            updateViewPager(dayCodeToOpen)
+            return true
+        }
+
+        val eventIdToOpen = intent.getIntExtra(EVENT_ID, 0)
+        val eventOccurrenceToOpen = intent.getIntExtra(EVENT_OCCURRENCE_TS, 0)
+        intent.removeExtra(EVENT_ID)
+        intent.removeExtra(EVENT_OCCURRENCE_TS)
+        if (eventIdToOpen != 0 && eventOccurrenceToOpen != 0) {
+            Intent(this, EventActivity::class.java).apply {
+                putExtra(EVENT_ID, eventIdToOpen)
+                putExtra(EVENT_OCCURRENCE_TS, eventOccurrenceToOpen)
+                startActivity(this)
+            }
+        }
+
+        return false
+    }
+
+    private fun checkViewIntents(): Boolean {
+        if (intent?.action == Intent.ACTION_VIEW && intent.data != null) {
+            val uri = intent.data
+            if (uri.authority == "com.android.calendar") {
+                if (uri.path.startsWith("/events")) {
+                    // intents like content://com.android.calendar/events/1756
+                    val eventId = uri.lastPathSegment
+                    val id = dbHelper.getEventIdWithLastImportId(eventId)
+                    if (id != 0) {
+                        Intent(this, EventActivity::class.java).apply {
+                            putExtra(EVENT_ID, id)
+                            startActivity(this)
+                        }
+                    } else {
+                        toast(R.string.unknown_error_occurred)
+                    }
+                } else if (intent?.extras?.getBoolean("DETAIL_VIEW", false) == true) {
+                    // clicking date on a third party widget: content://com.android.calendar/time/1507309245683
+                    val timestamp = uri.pathSegments.last()
+                    if (timestamp.areDigitsOnly()) {
+                        openDayAt(timestamp.toLong())
+                        return false
+                    }
+                }
+            } else {
+                tryImportEventsFromFile(uri)
+            }
+        }
+        return true
+    }
+
+    private fun showViewDialog() {
+        val items = arrayListOf(
+                RadioItem(DAILY_VIEW, getString(R.string.daily_view)),
+                RadioItem(WEEKLY_VIEW, getString(R.string.weekly_view)),
+                RadioItem(MONTHLY_VIEW, getString(R.string.monthly_view)),
+                RadioItem(YEARLY_VIEW, getString(R.string.yearly_view)),
+                RadioItem(EVENTS_LIST_VIEW, getString(R.string.simple_event_list)))
+
+        RadioGroupDialog(this, items, config.storedView) {
+            calendar_fab.beVisibleIf(it as Int != YEARLY_VIEW)
+            resetActionBarTitle()
+            closeSearch()
+            updateView(it)
+            shouldGoToTodayBeVisible = false
+            invalidateOptionsMenu()
+        }
+    }
+
+    private fun goToToday() {
+        currentFragments.last().goToToday()
+    }
+
+    private fun resetActionBarTitle() {
+        supportActionBar?.title = getString(R.string.app_launcher_name)
+        supportActionBar?.subtitle = ""
+    }
+
+    private fun showFilterDialog() {
+        FilterEventTypesDialog(this) {
+            refreshViewPager()
+        }
+    }
+
+    fun toggleGoToTodayVisibility(beVisible: Boolean) {
+        shouldGoToTodayBeVisible = beVisible
+        if (goToTodayButton?.isVisible != beVisible) {
+            invalidateOptionsMenu()
+        }
+    }
+
+    private fun refreshCalDAVCalendars(showRefreshToast: Boolean) {
+        showCalDAVRefreshToast = showRefreshToast
+        if (showRefreshToast) {
+            toast(R.string.refreshing)
+        }
+
+        syncCalDAVCalendars(this, calDAVSyncObserver)
+        scheduleCalDAVSync(true)
+    }
+
+    private val calDAVSyncObserver = object : ContentObserver(Handler()) {
+        override fun onChange(selfChange: Boolean) {
+            super.onChange(selfChange)
+            if (!selfChange) {
+                mCalDAVSyncHandler.removeCallbacksAndMessages(null)
+                mCalDAVSyncHandler.postDelayed({
+                    recheckCalDAVCalendars {
+                        refreshViewPager()
+                        if (showCalDAVRefreshToast) {
+                            toast(R.string.refreshing_complete)
+                        }
+                    }
+                }, CALDAV_SYNC_DELAY)
+            }
+        }
+    }
+
+    private fun addHolidays() {
+        val items = getHolidayRadioItems()
+        RadioGroupDialog(this, items) {
+            toast(R.string.importing)
+            Thread {
+                val holidays = getString(R.string.holidays)
+                var eventTypeId = dbHelper.getEventTypeIdWithTitle(holidays)
+                if (eventTypeId == -1) {
+                    val eventType = EventType(0, holidays, resources.getColor(R.color.default_holidays_color))
+                    eventTypeId = dbHelper.insertEventType(eventType)
+                }
+
+                val result = IcsImporter(this).importEvents(it as String, eventTypeId, 0, false)
+                handleParseResult(result)
+                if (result != IcsImporter.ImportResult.IMPORT_FAIL) {
+                    runOnUiThread {
+                        updateViewPager()
+                    }
+                }
+            }.start()
+        }
+    }
+
+    private fun tryAddBirthdays() {
+        handlePermission(PERMISSION_READ_CONTACTS) {
+            if (it) {
+                Thread {
+                    addContactEvents(true) {
+                        if (it > 0) {
+                            toast(R.string.birthdays_added)
+                            updateViewPager()
+                        } else {
+                            toast(R.string.no_birthdays)
+                        }
+                    }
+                }.start()
+            } else {
+                toast(R.string.no_contacts_permission)
+            }
+        }
+    }
+
+    private fun tryAddAnniversaries() {
+        handlePermission(PERMISSION_READ_CONTACTS) {
+            if (it) {
+                Thread {
+                    addContactEvents(false) {
+                        if (it > 0) {
+                            toast(R.string.anniversaries_added)
+                            updateViewPager()
+                        } else {
+                            toast(R.string.no_anniversaries)
+                        }
+                    }
+                }.start()
+            } else {
+                toast(R.string.no_contacts_permission)
+            }
+        }
+    }
+
+    private fun handleParseResult(result: IcsImporter.ImportResult) {
+        toast(when (result) {
+            IcsImporter.ImportResult.IMPORT_OK -> R.string.holidays_imported_successfully
+            IcsImporter.ImportResult.IMPORT_PARTIAL -> R.string.importing_some_holidays_failed
+            else -> R.string.importing_holidays_failed
+        }, Toast.LENGTH_LONG)
+    }
+
+    private fun addContactEvents(birthdays: Boolean, callback: (Int) -> Unit) {
+        var eventsAdded = 0
+        val uri = ContactsContract.Data.CONTENT_URI
+        val projection = arrayOf(ContactsContract.Contacts.DISPLAY_NAME,
+                ContactsContract.CommonDataKinds.Event.CONTACT_ID,
+                ContactsContract.CommonDataKinds.Event.CONTACT_LAST_UPDATED_TIMESTAMP,
+                ContactsContract.CommonDataKinds.Event.START_DATE)
+
+        val selection = "${ContactsContract.Data.MIMETYPE} = ? AND ${ContactsContract.CommonDataKinds.Event.TYPE} = ?"
+        val type = if (birthdays) ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY else ContactsContract.CommonDataKinds.Event.TYPE_ANNIVERSARY
+        val selectionArgs = arrayOf(ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, type.toString())
+        var cursor: Cursor? = null
+        try {
+            cursor = contentResolver.query(uri, projection, selection, selectionArgs, null)
+            if (cursor?.moveToFirst() == true) {
+                val dateFormats = getDateFormats()
+                val existingEvents = if (birthdays) dbHelper.getBirthdays() else dbHelper.getAnniversaries()
+                val importIDs = existingEvents.map { it.importId }
+                val eventTypeId = if (birthdays) getBirthdaysEventTypeId() else getAnniversariesEventTypeId()
+
+                do {
+                    val contactId = cursor.getIntValue(ContactsContract.CommonDataKinds.Event.CONTACT_ID).toString()
+                    val name = cursor.getStringValue(ContactsContract.Contacts.DISPLAY_NAME)
+                    val startDate = cursor.getStringValue(ContactsContract.CommonDataKinds.Event.START_DATE)
+
+                    for (format in dateFormats) {
+                        try {
+                            val formatter = SimpleDateFormat(format, Locale.getDefault())
+                            val date = formatter.parse(startDate)
+                            if (date.year < 70)
+                                date.year = 70
+
+                            val timestamp = (date.time / 1000).toInt()
+                            val source = if (birthdays) SOURCE_CONTACT_BIRTHDAY else SOURCE_CONTACT_ANNIVERSARY
+                            val lastUpdated = cursor.getLongValue(ContactsContract.CommonDataKinds.Event.CONTACT_LAST_UPDATED_TIMESTAMP)
+                            val event = Event(0, timestamp, timestamp, name, importId = contactId, flags = FLAG_ALL_DAY, repeatInterval = YEAR,
+                                    eventType = eventTypeId, source = source, lastUpdated = lastUpdated)
+
+                            if (!importIDs.contains(contactId)) {
+                                dbHelper.insert(event, false) {
+                                    eventsAdded++
+                                }
+                            }
+                            break
+                        } catch (e: Exception) {
+                        }
+                    }
+                } while (cursor.moveToNext())
+            }
+        } catch (e: Exception) {
+            showErrorToast(e)
+        } finally {
+            cursor?.close()
+        }
+
+        runOnUiThread {
+            callback(eventsAdded)
+        }
+    }
+
+    private fun getBirthdaysEventTypeId(): Int {
+        val birthdays = getString(R.string.birthdays)
+        var eventTypeId = dbHelper.getEventTypeIdWithTitle(birthdays)
+        if (eventTypeId == -1) {
+            val eventType = EventType(0, birthdays, resources.getColor(R.color.default_birthdays_color))
+            eventTypeId = dbHelper.insertEventType(eventType)
+        }
+        return eventTypeId
+    }
+
+    private fun getAnniversariesEventTypeId(): Int {
+        val anniversaries = getString(R.string.anniversaries)
+        var eventTypeId = dbHelper.getEventTypeIdWithTitle(anniversaries)
+        if (eventTypeId == -1) {
+            val eventType = EventType(0, anniversaries, resources.getColor(R.color.default_anniversaries_color))
+            eventTypeId = dbHelper.insertEventType(eventType)
+        }
+        return eventTypeId
+    }
+
+    private fun updateView(view: Int) {
+        calendar_fab.beVisibleIf(view != YEARLY_VIEW)
+        config.storedView = view
+        updateViewPager()
+        if (goToTodayButton?.isVisible == true) {
+            shouldGoToTodayBeVisible = false
+            invalidateOptionsMenu()
+        }
+    }
+
+    private fun updateViewPager(dayCode: String? = Formatter.getTodayCode(applicationContext)) {
+        val fragment = getFragmentsHolder()
+        currentFragments.forEach {
+            supportFragmentManager.beginTransaction().remove(it).commitNow()
+        }
+        currentFragments.clear()
+        currentFragments.add(fragment)
+        val bundle = Bundle()
+
+        when (config.storedView) {
+            DAILY_VIEW, MONTHLY_VIEW -> bundle.putString(DAY_CODE, dayCode)
+            WEEKLY_VIEW -> bundle.putString(WEEK_START_DATE_TIME, getThisWeekDateTime())
+        }
+
+        fragment.arguments = bundle
+        supportFragmentManager.beginTransaction().add(R.id.fragments_holder, fragment).commitNow()
+    }
+
+    fun openMonthFromYearly(dateTime: DateTime) {
+        if (currentFragments.last() is MonthFragmentsHolder) {
+            return
+        }
+
+        val fragment = MonthFragmentsHolder()
+        currentFragments.add(fragment)
+        val bundle = Bundle()
+        bundle.putString(DAY_CODE, Formatter.getDayCodeFromDateTime(dateTime))
+        fragment.arguments = bundle
+        supportFragmentManager.beginTransaction().add(R.id.fragments_holder, fragment).commitNow()
+        resetActionBarTitle()
+        calendar_fab.beVisible()
+        supportActionBar?.setDisplayHomeAsUpEnabled(true)
+    }
+
+    fun openDayFromMonthly(dateTime: DateTime) {
+        if (currentFragments.last() is DayFragmentsHolder) {
+            return
+        }
+
+        val fragment = DayFragmentsHolder()
+        currentFragments.add(fragment)
+        val bundle = Bundle()
+        bundle.putString(DAY_CODE, Formatter.getDayCodeFromDateTime(dateTime))
+        fragment.arguments = bundle
+        supportFragmentManager.beginTransaction().add(R.id.fragments_holder, fragment).commitNow()
+        supportActionBar?.setDisplayHomeAsUpEnabled(true)
+    }
+
+    private fun getThisWeekDateTime(): String {
+        var thisweek = DateTime().withDayOfWeek(1).withTimeAtStartOfDay().minusDays(if (config.isSundayFirst) 1 else 0)
+        if (DateTime().minusDays(7).seconds() > thisweek.seconds()) {
+            thisweek = thisweek.plusDays(7)
+        }
+        return thisweek.toString()
+    }
+
+    private fun getFragmentsHolder() = when (config.storedView) {
+        DAILY_VIEW -> DayFragmentsHolder()
+        MONTHLY_VIEW -> MonthFragmentsHolder()
+        YEARLY_VIEW -> YearFragmentsHolder()
+        EVENTS_LIST_VIEW -> EventListFragment()
+        else -> WeekFragmentsHolder()
+    }
+
+    private fun removeTopFragment() {
+        supportFragmentManager.beginTransaction().remove(currentFragments.last()).commit()
+        currentFragments.removeAt(currentFragments.size - 1)
+        toggleGoToTodayVisibility(currentFragments.last().shouldGoToTodayBeVisible())
+        currentFragments.last().apply {
+            refreshEvents()
+            updateActionBarTitle()
+        }
+        calendar_fab.beGoneIf(currentFragments.size == 1 && config.storedView == YEARLY_VIEW)
+        supportActionBar?.setDisplayHomeAsUpEnabled(currentFragments.size > 1)
+    }
+
+    private fun refreshViewPager() {
+        runOnUiThread {
+            if (!isActivityDestroyed()) {
+                currentFragments.last().refreshEvents()
+            }
+        }
+    }
+
+    private fun tryImportEvents() {
+        handlePermission(PERMISSION_READ_STORAGE) {
+            if (it) {
+                importEvents()
+            }
+        }
+    }
+
+    private fun importEvents() {
+        FilePickerDialog(this) {
+            showImportEventsDialog(it)
+        }
+    }
+
+    private fun tryImportEventsFromFile(uri: Uri) {
+        when {
+            uri.scheme == "file" -> showImportEventsDialog(uri.path)
+            uri.scheme == "content" -> {
+                val tempFile = getTempFile()
+                if (tempFile == null) {
+                    toast(R.string.unknown_error_occurred)
+                    return
+                }
+
+                val inputStream = contentResolver.openInputStream(uri)
+                val out = FileOutputStream(tempFile)
+                inputStream.copyTo(out)
+                showImportEventsDialog(tempFile.absolutePath)
+            }
+            else -> toast(R.string.invalid_file_format)
+        }
+    }
+
+    private fun showImportEventsDialog(path: String) {
+        ImportEventsDialog(this, path) {
+            if (it) {
+                runOnUiThread {
+                    updateViewPager()
+                }
+            }
+        }
+    }
+
+    private fun tryExportEvents() {
+        handlePermission(PERMISSION_WRITE_STORAGE) {
+            if (it) {
+                exportEvents()
+            }
+        }
+    }
+
+    private fun exportEvents() {
+        FilePickerDialog(this, pickFile = false, showFAB = true) {
+            ExportEventsDialog(this, it) { exportPastEvents, file, eventTypes ->
+                Thread {
+                    val events = dbHelper.getEventsToExport(exportPastEvents).filter { eventTypes.contains(it.eventType.toString()) }
+                    if (events.isEmpty()) {
+                        toast(R.string.no_entries_for_exporting)
+                    } else {
+                        IcsExporter().exportEvents(this, file, events as ArrayList<Event>, true) {
+                            toast(when (it) {
+                                IcsExporter.ExportResult.EXPORT_OK -> R.string.exporting_successful
+                                IcsExporter.ExportResult.EXPORT_PARTIAL -> R.string.exporting_some_entries_failed
+                                else -> R.string.exporting_failed
+                            })
+                        }
+                    }
+                }.start()
+            }
+        }
+    }
+
+    private fun launchSettings() {
+        startActivity(Intent(applicationContext, SettingsActivity::class.java))
+    }
+
+    private fun launchAbout() {
+        val faqItems = arrayListOf(
+                FAQItem(R.string.faq_1_title_commons, R.string.faq_1_text_commons),
+                FAQItem(R.string.faq_2_title_commons, R.string.faq_2_text_commons),
+                FAQItem(R.string.faq_4_title_commons, R.string.faq_4_text_commons),
+                FAQItem(getString(R.string.faq_1_title), getString(R.string.faq_1_text)),
+                FAQItem(getString(R.string.faq_2_title), getString(R.string.faq_2_text)))
+
+        startAboutActivity(R.string.app_name, LICENSE_JODA or LICENSE_STETHO or LICENSE_MULTISELECT or LICENSE_LEAK_CANARY,
+                BuildConfig.VERSION_NAME, faqItems)
+    }
+
+    private fun searchQueryChanged(text: String) {
+        mLatestSearchQuery = text
+        search_placeholder_2.beGoneIf(text.length >= 2)
+        if (text.length >= 2) {
+            dbHelper.getEventsWithSearchQuery(text) { searchedText, events ->
+                if (searchedText == mLatestSearchQuery) {
+                    runOnUiThread {
+                        search_results_list.beVisibleIf(events.isNotEmpty())
+                        search_placeholder.beVisibleIf(events.isEmpty())
+                        val listItems = getEventListItems(events)
+                        val eventsAdapter = EventListAdapter(this, listItems, true, this, search_results_list) {
+                            if (it is ListEvent) {
+                                Intent(applicationContext, EventActivity::class.java).apply {
+                                    putExtra(EVENT_ID, it.id)
+                                    startActivity(this)
+                                }
+                            }
+                        }
+
+                        search_results_list.adapter = eventsAdapter
+                    }
+                }
+            }
+        } else {
+            search_placeholder.beVisible()
+            search_results_list.beGone()
+        }
+    }
+
+    // only used at active search
+    override fun refreshItems() {
+        searchQueryChanged(mLatestSearchQuery)
+        refreshViewPager()
+    }
+
+    private fun openDayAt(timestamp: Long) {
+        val dayCode = Formatter.getDayCodeFromTS((timestamp / 1000).toInt())
+        calendar_fab.beVisible()
+        config.storedView = DAILY_VIEW
+        updateViewPager(dayCode)
+    }
+
+    private fun getHolidayRadioItems(): ArrayList<RadioItem> {
+        val items = ArrayList<RadioItem>()
+
+        LinkedHashMap<String, String>().apply {
+            put("Algeria", "algeria.ics")
+            put("Argentina", "argentina.ics")
+            put("Australia", "australia.ics")
+            put("België", "belgium.ics")
+            put("Bolivia", "bolivia.ics")
+            put("Brasil", "brazil.ics")
+            put("Canada", "canada.ics")
+            put("China", "china.ics")
+            put("Colombia", "colombia.ics")
+            put("Česká republika", "czech.ics")
+            put("Danmark", "denmark.ics")
+            put("Deutschland", "germany.ics")
+            put("Eesti", "estonia.ics")
+            put("España", "spain.ics")
+            put("Éire", "ireland.ics")
+            put("France", "france.ics")
+            put("Hanguk", "southkorea.ics")
+            put("Hellas", "greece.ics")
+            put("Hrvatska", "croatia.ics")
+            put("India", "india.ics")
+            put("Indonesia", "indonesia.ics")
+            put("Ísland", "iceland.ics")
+            put("Italia", "italy.ics")
+            put("Latvija", "latvia.ics")
+            put("Lietuva", "lithuania.ics")
+            put("Luxemburg", "luxembourg.ics")
+            put("Makedonija", "macedonia.ics")
+            put("Magyarország", "hungary.ics")
+            put("México", "mexico.ics")
+            put("Nederland", "netherlands.ics")
+            put("日本", "japan.ics")
+            put("Norge", "norway.ics")
+            put("Österreich", "austria.ics")
+            put("Pākistān", "pakistan.ics")
+            put("Polska", "poland.ics")
+            put("Portugal", "portugal.ics")
+            put("Россия", "russia.ics")
+            put("România", "romania.ics")
+            put("Schweiz", "switzerland.ics")
+            put("Srbija", "serbia.ics")
+            put("Slovenija", "slovenia.ics")
+            put("Slovensko", "slovakia.ics")
+            put("South Africa", "southafrica.ics")
+            put("Suomi", "finland.ics")
+            put("Sverige", "sweden.ics")
+            put("Ukraine", "ukraine.ics")
+            put("United Kingdom", "unitedkingdom.ics")
+            put("United States", "unitedstates.ics")
+
+            var i = 0
+            for ((country, file) in this) {
+                items.add(RadioItem(i++, country, file))
+            }
+        }
+
+        return items
+    }
+
+    private fun checkWhatsNewDialog() {
+        arrayListOf<Release>().apply {
+            add(Release(39, R.string.release_39))
+            add(Release(40, R.string.release_40))
+            add(Release(42, R.string.release_42))
+            add(Release(44, R.string.release_44))
+            add(Release(46, R.string.release_46))
+            add(Release(48, R.string.release_48))
+            add(Release(49, R.string.release_49))
+            add(Release(51, R.string.release_51))
+            add(Release(52, R.string.release_52))
+            add(Release(54, R.string.release_54))
+            add(Release(57, R.string.release_57))
+            add(Release(59, R.string.release_59))
+            add(Release(60, R.string.release_60))
+            add(Release(62, R.string.release_62))
+            add(Release(67, R.string.release_67))
+            add(Release(69, R.string.release_69))
+            add(Release(71, R.string.release_71))
+            add(Release(73, R.string.release_73))
+            add(Release(76, R.string.release_76))
+            add(Release(77, R.string.release_77))
+            add(Release(80, R.string.release_80))
+            add(Release(84, R.string.release_84))
+            add(Release(86, R.string.release_86))
+            add(Release(88, R.string.release_88))
+            add(Release(98, R.string.release_98))
+            add(Release(117, R.string.release_117))
+            add(Release(119, R.string.release_119))
+            checkWhatsNew(this, BuildConfig.VERSION_CODE)
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/ManageEventTypesActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/ManageEventTypesActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..808c50369f7173857c59687f5416b01b69127812
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/ManageEventTypesActivity.kt
@@ -0,0 +1,73 @@
+package com.simplemobiletools.calendar.activities
+
+import android.os.Bundle
+import android.view.Menu
+import android.view.MenuItem
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.adapters.ManageEventTypesAdapter
+import com.simplemobiletools.calendar.dialogs.UpdateEventTypeDialog
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.interfaces.DeleteEventTypesListener
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.commons.extensions.toast
+import com.simplemobiletools.commons.extensions.updateTextColors
+import kotlinx.android.synthetic.main.activity_manage_event_types.*
+import java.util.*
+
+class ManageEventTypesActivity : SimpleActivity(), DeleteEventTypesListener {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_manage_event_types)
+
+        getEventTypes()
+        updateTextColors(manage_event_types_list)
+    }
+
+    private fun showEventTypeDialog(eventType: EventType? = null) {
+        UpdateEventTypeDialog(this, eventType?.copy()) {
+            getEventTypes()
+        }
+    }
+
+    private fun getEventTypes() {
+        dbHelper.getEventTypes {
+            runOnUiThread {
+                val adapter = ManageEventTypesAdapter(this, it, this, manage_event_types_list) {
+                    showEventTypeDialog(it as EventType)
+                }
+                manage_event_types_list.adapter = adapter
+            }
+        }
+    }
+
+    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+        menuInflater.inflate(R.menu.menu_event_types, menu)
+        return true
+    }
+
+    override fun onOptionsItemSelected(item: MenuItem): Boolean {
+        when (item.itemId) {
+            R.id.add_event_type -> showEventTypeDialog()
+            else -> return super.onOptionsItemSelected(item)
+        }
+        return true
+    }
+
+    override fun deleteEventTypes(eventTypes: ArrayList<EventType>, deleteEvents: Boolean): Boolean {
+        if (eventTypes.any { it.caldavCalendarId != 0 }) {
+            toast(R.string.unsync_caldav_calendar)
+            if (eventTypes.size == 1) {
+                return false
+            }
+        }
+
+        Thread {
+            dbHelper.deleteEventTypes(eventTypes, deleteEvents) {
+                if (it == 0) {
+                    toast(R.string.unknown_error_occurred)
+                }
+            }
+        }.start()
+        return true
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SettingsActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SettingsActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..273ee96dc818b44eda4563ba1a479d85a8727a7d
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SettingsActivity.kt
@@ -0,0 +1,432 @@
+package com.simplemobiletools.calendar.activities
+
+import android.content.Intent
+import android.content.res.Resources
+import android.media.AudioManager
+import android.os.Bundle
+import android.text.TextUtils
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.dialogs.SelectCalendarsDialog
+import com.simplemobiletools.calendar.extensions.*
+import com.simplemobiletools.calendar.helpers.CalDAVHandler
+import com.simplemobiletools.calendar.helpers.FONT_SIZE_LARGE
+import com.simplemobiletools.calendar.helpers.FONT_SIZE_MEDIUM
+import com.simplemobiletools.calendar.helpers.FONT_SIZE_SMALL
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.commons.dialogs.ConfirmationDialog
+import com.simplemobiletools.commons.dialogs.CustomIntervalPickerDialog
+import com.simplemobiletools.commons.dialogs.RadioGroupDialog
+import com.simplemobiletools.commons.dialogs.SelectAlarmSoundDialog
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.ALARM_SOUND_TYPE_NOTIFICATION
+import com.simplemobiletools.commons.helpers.IS_CUSTOMIZING_COLORS
+import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALENDAR
+import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALENDAR
+import com.simplemobiletools.commons.models.AlarmSound
+import com.simplemobiletools.commons.models.RadioItem
+import kotlinx.android.synthetic.main.activity_settings.*
+import java.util.*
+
+class SettingsActivity : SimpleActivity() {
+    private val GET_RINGTONE_URI = 1
+
+    lateinit var res: Resources
+    private var mStoredPrimaryColor = 0
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        setContentView(R.layout.activity_settings)
+        res = resources
+        mStoredPrimaryColor = config.primaryColor
+        setupCaldavSync()
+    }
+
+    override fun onResume() {
+        super.onResume()
+
+        setupCustomizeColors()
+        setupUseEnglish()
+        setupManageEventTypes()
+        setupHourFormat()
+        setupSundayFirst()
+        setupAvoidWhatsNew()
+        setupDeleteAllEvents()
+        setupReplaceDescription()
+        setupWeekNumbers()
+        setupShowGrid()
+        setupWeeklyStart()
+        setupWeeklyEnd()
+        setupVibrate()
+        setupReminderSound()
+        setupUseSameSnooze()
+        setupLoopReminders()
+        setupSnoozeTime()
+        setupDisplayPastEvents()
+        setupFontSize()
+        setupCustomizeWidgetColors()
+        setupDimEvents()
+        updateTextColors(settings_holder)
+        checkPrimaryColor()
+        setupSectionColors()
+    }
+
+    override fun onPause() {
+        super.onPause()
+        mStoredPrimaryColor = config.primaryColor
+    }
+
+    private fun checkPrimaryColor() {
+        if (config.primaryColor != mStoredPrimaryColor) {
+            dbHelper.getEventTypes {
+                if (it.filter { it.caldavCalendarId == 0 }.size == 1) {
+                    val eventType = it.first { it.caldavCalendarId == 0 }
+                    eventType.color = config.primaryColor
+                    dbHelper.updateEventType(eventType)
+                }
+            }
+        }
+    }
+
+    private fun setupSectionColors() {
+        val adjustedPrimaryColor = getAdjustedPrimaryColor()
+        arrayListOf(reminders_label, caldav_label, weekly_view_label, monthly_view_label, simple_event_list_label, widgets_label, events_label).forEach {
+            it.setTextColor(adjustedPrimaryColor)
+        }
+    }
+
+    private fun setupCustomizeColors() {
+        settings_customize_colors_holder.setOnClickListener {
+            startCustomizationActivity()
+        }
+    }
+
+    private fun setupUseEnglish() {
+        settings_use_english_holder.beVisibleIf(config.wasUseEnglishToggled || Locale.getDefault().language != "en")
+        settings_use_english.isChecked = config.useEnglish
+        settings_use_english_holder.setOnClickListener {
+            settings_use_english.toggle()
+            config.useEnglish = settings_use_english.isChecked
+            System.exit(0)
+        }
+    }
+
+    private fun setupManageEventTypes() {
+        settings_manage_event_types_holder.setOnClickListener {
+            startActivity(Intent(this, ManageEventTypesActivity::class.java))
+        }
+    }
+
+    private fun setupHourFormat() {
+        settings_hour_format.isChecked = config.use24HourFormat
+        settings_hour_format_holder.setOnClickListener {
+            settings_hour_format.toggle()
+            config.use24HourFormat = settings_hour_format.isChecked
+        }
+    }
+
+    private fun setupCaldavSync() {
+        settings_caldav_sync.isChecked = config.caldavSync
+        settings_caldav_sync_holder.setOnClickListener {
+            if (config.caldavSync) {
+                toggleCaldavSync(false)
+            } else {
+                handlePermission(PERMISSION_WRITE_CALENDAR) {
+                    if (it) {
+                        handlePermission(PERMISSION_READ_CALENDAR) {
+                            if (it) {
+                                toggleCaldavSync(true)
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        settings_manage_synced_calendars_holder.beVisibleIf(config.caldavSync)
+        settings_manage_synced_calendars_holder.setOnClickListener {
+            showCalendarPicker()
+        }
+    }
+
+    private fun toggleCaldavSync(enable: Boolean) {
+        if (enable) {
+            showCalendarPicker()
+        } else {
+            settings_caldav_sync.isChecked = false
+            config.caldavSync = false
+            settings_manage_synced_calendars_holder.beGone()
+            config.getSyncedCalendarIdsAsList().forEach {
+                CalDAVHandler(applicationContext).deleteCalDAVCalendarEvents(it.toLong())
+            }
+            dbHelper.deleteEventTypesWithCalendarId(config.caldavSyncedCalendarIDs)
+        }
+    }
+
+    private fun showCalendarPicker() {
+        val oldCalendarIds = config.getSyncedCalendarIdsAsList()
+
+        SelectCalendarsDialog(this) {
+            val newCalendarIds = config.getSyncedCalendarIdsAsList()
+            if (newCalendarIds.isEmpty() && !config.caldavSync) {
+                return@SelectCalendarsDialog
+            }
+
+            settings_manage_synced_calendars_holder.beVisibleIf(newCalendarIds.isNotEmpty())
+            settings_caldav_sync.isChecked = newCalendarIds.isNotEmpty()
+            config.caldavSync = newCalendarIds.isNotEmpty()
+            if (settings_caldav_sync.isChecked) {
+                toast(R.string.syncing)
+            }
+
+            Thread {
+                if (newCalendarIds.isNotEmpty()) {
+                    val existingEventTypeNames = dbHelper.getEventTypesSync().map { it.getDisplayTitle().toLowerCase() } as ArrayList<String>
+                    getSyncedCalDAVCalendars().forEach {
+                        val calendarTitle = it.getFullTitle()
+                        if (!existingEventTypeNames.contains(calendarTitle.toLowerCase())) {
+                            val eventType = EventType(0, it.displayName, it.color, it.id, it.displayName, it.accountName)
+                            existingEventTypeNames.add(calendarTitle.toLowerCase())
+                            dbHelper.insertEventType(eventType)
+                        }
+                    }
+                    CalDAVHandler(applicationContext).refreshCalendars(this) {}
+                }
+
+                val removedCalendarIds = oldCalendarIds.filter { !newCalendarIds.contains(it) }
+                removedCalendarIds.forEach {
+                    CalDAVHandler(applicationContext).deleteCalDAVCalendarEvents(it.toLong())
+                    dbHelper.getEventTypeWithCalDAVCalendarId(it.toInt())?.apply {
+                        dbHelper.deleteEventTypes(arrayListOf(this), true) {}
+                    }
+                }
+                dbHelper.deleteEventTypesWithCalendarId(TextUtils.join(",", removedCalendarIds))
+                if (settings_caldav_sync.isChecked) {
+                    toast(R.string.synchronization_completed)
+                }
+            }.start()
+        }
+    }
+
+    private fun setupSundayFirst() {
+        settings_sunday_first.isChecked = config.isSundayFirst
+        settings_sunday_first_holder.setOnClickListener {
+            settings_sunday_first.toggle()
+            config.isSundayFirst = settings_sunday_first.isChecked
+        }
+    }
+
+    private fun setupAvoidWhatsNew() {
+        settings_avoid_whats_new.isChecked = config.avoidWhatsNew
+        settings_avoid_whats_new_holder.setOnClickListener {
+            settings_avoid_whats_new.toggle()
+            config.avoidWhatsNew = settings_avoid_whats_new.isChecked
+        }
+    }
+
+    private fun setupDeleteAllEvents() {
+        settings_delete_all_events_holder.setOnClickListener {
+            ConfirmationDialog(this, messageId = R.string.delete_all_events_confirmation) {
+                Thread {
+                    dbHelper.deleteAllEvents()
+                }.start()
+            }
+        }
+    }
+
+    private fun setupReplaceDescription() {
+        settings_replace_description.isChecked = config.replaceDescription
+        settings_replace_description_holder.setOnClickListener {
+            settings_replace_description.toggle()
+            config.replaceDescription = settings_replace_description.isChecked
+        }
+    }
+
+    private fun setupWeeklyStart() {
+        settings_start_weekly_at.text = getHoursString(config.startWeeklyAt)
+        settings_start_weekly_at_holder.setOnClickListener {
+            val items = ArrayList<RadioItem>()
+            (0..24).mapTo(items) { RadioItem(it, getHoursString(it)) }
+
+            RadioGroupDialog(this@SettingsActivity, items, config.startWeeklyAt) {
+                if (it as Int >= config.endWeeklyAt) {
+                    toast(R.string.day_end_before_start)
+                } else {
+                    config.startWeeklyAt = it
+                    settings_start_weekly_at.text = getHoursString(it)
+                }
+            }
+        }
+    }
+
+    private fun setupWeeklyEnd() {
+        settings_end_weekly_at.text = getHoursString(config.endWeeklyAt)
+        settings_end_weekly_at_holder.setOnClickListener {
+            val items = ArrayList<RadioItem>()
+            (0..24).mapTo(items) { RadioItem(it, getHoursString(it)) }
+
+            RadioGroupDialog(this@SettingsActivity, items, config.endWeeklyAt) {
+                if (it as Int <= config.startWeeklyAt) {
+                    toast(R.string.day_end_before_start)
+                } else {
+                    config.endWeeklyAt = it
+                    settings_end_weekly_at.text = getHoursString(it)
+                }
+            }
+        }
+    }
+
+    private fun setupWeekNumbers() {
+        settings_week_numbers.isChecked = config.showWeekNumbers
+        settings_week_numbers_holder.setOnClickListener {
+            settings_week_numbers.toggle()
+            config.showWeekNumbers = settings_week_numbers.isChecked
+        }
+    }
+
+    private fun setupShowGrid() {
+        settings_show_grid.isChecked = config.showGrid
+        settings_show_grid_holder.setOnClickListener {
+            settings_show_grid.toggle()
+            config.showGrid = settings_show_grid.isChecked
+        }
+    }
+
+    private fun setupReminderSound() {
+        settings_reminder_sound.text = config.reminderSoundTitle
+
+        settings_reminder_sound_holder.setOnClickListener {
+            SelectAlarmSoundDialog(this, config.reminderSoundUri, AudioManager.STREAM_NOTIFICATION, GET_RINGTONE_URI, ALARM_SOUND_TYPE_NOTIFICATION, false,
+                    onAlarmPicked = {
+                        if (it != null) {
+                            updateReminderSound(it)
+                        }
+                    }, onAlarmSoundDeleted = {
+                if (it.uri == config.reminderSoundUri) {
+                    val defaultAlarm = getDefaultAlarmSound(ALARM_SOUND_TYPE_NOTIFICATION)
+                    updateReminderSound(defaultAlarm)
+                }
+            })
+        }
+    }
+
+    private fun updateReminderSound(alarmSound: AlarmSound) {
+        config.reminderSoundTitle = alarmSound.title
+        config.reminderSoundUri = alarmSound.uri
+        settings_reminder_sound.text = alarmSound.title
+    }
+
+    private fun setupVibrate() {
+        settings_vibrate.isChecked = config.vibrateOnReminder
+        settings_vibrate_holder.setOnClickListener {
+            settings_vibrate.toggle()
+            config.vibrateOnReminder = settings_vibrate.isChecked
+        }
+    }
+
+    private fun setupLoopReminders() {
+        settings_loop_reminders.isChecked = config.loopReminders
+        settings_loop_reminders_holder.setOnClickListener {
+            settings_loop_reminders.toggle()
+            config.loopReminders = settings_loop_reminders.isChecked
+        }
+    }
+
+    private fun setupUseSameSnooze() {
+        settings_snooze_time_holder.beVisibleIf(config.useSameSnooze)
+        settings_use_same_snooze.isChecked = config.useSameSnooze
+        settings_use_same_snooze_holder.setOnClickListener {
+            settings_use_same_snooze.toggle()
+            config.useSameSnooze = settings_use_same_snooze.isChecked
+            settings_snooze_time_holder.beVisibleIf(config.useSameSnooze)
+        }
+    }
+
+    private fun setupSnoozeTime() {
+        updateSnoozeTime()
+        settings_snooze_time_holder.setOnClickListener {
+            showPickSecondsDialogHelper(config.snoozeTime, true) {
+                config.snoozeTime = it / 60
+                updateSnoozeTime()
+            }
+        }
+    }
+
+    private fun updateSnoozeTime() {
+        settings_snooze_time.text = formatMinutesToTimeString(config.snoozeTime)
+    }
+
+    private fun getHoursString(hours: Int) = String.format("%02d:00", hours)
+
+    private fun setupDisplayPastEvents() {
+        var displayPastEvents = config.displayPastEvents
+        updatePastEventsText(displayPastEvents)
+        settings_display_past_events_holder.setOnClickListener {
+            CustomIntervalPickerDialog(this, displayPastEvents * 60) {
+                val result = it / 60
+                displayPastEvents = result
+                config.displayPastEvents = result
+                updatePastEventsText(result)
+            }
+        }
+    }
+
+    private fun updatePastEventsText(displayPastEvents: Int) {
+        settings_display_past_events.text = getDisplayPastEventsText(displayPastEvents)
+    }
+
+    private fun getDisplayPastEventsText(displayPastEvents: Int): String {
+        return if (displayPastEvents == 0) {
+            getString(R.string.never)
+        } else {
+            getFormattedMinutes(displayPastEvents, false)
+        }
+    }
+
+    private fun setupFontSize() {
+        settings_font_size.text = getFontSizeText()
+        settings_font_size_holder.setOnClickListener {
+            val items = arrayListOf(
+                    RadioItem(FONT_SIZE_SMALL, res.getString(R.string.small)),
+                    RadioItem(FONT_SIZE_MEDIUM, res.getString(R.string.medium)),
+                    RadioItem(FONT_SIZE_LARGE, res.getString(R.string.large)))
+
+            RadioGroupDialog(this@SettingsActivity, items, config.fontSize) {
+                config.fontSize = it as Int
+                settings_font_size.text = getFontSizeText()
+                updateWidgets()
+                updateListWidget()
+            }
+        }
+    }
+
+    private fun getFontSizeText() = getString(when (config.fontSize) {
+        FONT_SIZE_SMALL -> R.string.small
+        FONT_SIZE_MEDIUM -> R.string.medium
+        else -> R.string.large
+    })
+
+    private fun setupCustomizeWidgetColors() {
+        settings_customize_widget_colors_holder.setOnClickListener {
+            Intent(this, WidgetListConfigureActivity::class.java).apply {
+                putExtra(IS_CUSTOMIZING_COLORS, true)
+                startActivity(this)
+            }
+        }
+    }
+
+    private fun setupDimEvents() {
+        settings_dim_past_events.isChecked = config.dimPastEvents
+        settings_dim_past_events_holder.setOnClickListener {
+            settings_dim_past_events.toggle()
+            config.dimPastEvents = settings_dim_past_events.isChecked
+        }
+    }
+
+    override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
+        super.onActivityResult(requestCode, resultCode, resultData)
+        if (requestCode == GET_RINGTONE_URI && resultCode == RESULT_OK && resultData != null) {
+            val newAlarmSound = storeNewYourAlarmSound(resultData)
+            updateReminderSound(newAlarmSound)
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SimpleActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SimpleActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c9732a4a0375681fb507df74d0d159e363624313
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SimpleActivity.kt
@@ -0,0 +1,30 @@
+package com.simplemobiletools.calendar.activities
+
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.commons.activities.BaseSimpleActivity
+
+open class SimpleActivity : BaseSimpleActivity() {
+    override fun getAppIconIDs() = arrayListOf(
+            R.mipmap.ic_launcher_red,
+            R.mipmap.ic_launcher_pink,
+            R.mipmap.ic_launcher_purple,
+            R.mipmap.ic_launcher_deep_purple,
+            R.mipmap.ic_launcher_indigo,
+            R.mipmap.ic_launcher_blue,
+            R.mipmap.ic_launcher_light_blue,
+            R.mipmap.ic_launcher_cyan,
+            R.mipmap.ic_launcher_teal,
+            R.mipmap.ic_launcher_green,
+            R.mipmap.ic_launcher_light_green,
+            R.mipmap.ic_launcher_lime,
+            R.mipmap.ic_launcher_yellow,
+            R.mipmap.ic_launcher_amber,
+            R.mipmap.ic_launcher,
+            R.mipmap.ic_launcher_deep_orange,
+            R.mipmap.ic_launcher_brown,
+            R.mipmap.ic_launcher_blue_grey,
+            R.mipmap.ic_launcher_grey_black
+    )
+
+    override fun getAppLauncherName() = getString(R.string.app_launcher_name)
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SnoozeReminderActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SnoozeReminderActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..455a6313d6b9492cec0d31084e90fd1a6ce67e89
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SnoozeReminderActivity.kt
@@ -0,0 +1,32 @@
+package com.simplemobiletools.calendar.activities
+
+import android.os.Bundle
+import android.support.v7.app.AppCompatActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.rescheduleReminder
+import com.simplemobiletools.calendar.helpers.EVENT_ID
+import com.simplemobiletools.commons.extensions.showPickSecondsDialogHelper
+
+class SnoozeReminderActivity : AppCompatActivity() {
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+
+        showPickSecondsDialogHelper(config.snoozeTime, true, cancelCallback = { dialogCancelled() }) {
+            val eventId = intent.getIntExtra(EVENT_ID, 0)
+            val event = dbHelper.getEventWithId(eventId)
+            config.snoozeTime = it / 60
+            rescheduleReminder(event, it / 60)
+            finishActivity()
+        }
+    }
+
+    private fun dialogCancelled() {
+        finishActivity()
+    }
+
+    private fun finishActivity() {
+        finish()
+        overridePendingTransition(0, 0)
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SplashActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SplashActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..34025f507ca9389ca268331020e8ac234122e078
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/SplashActivity.kt
@@ -0,0 +1,27 @@
+package com.simplemobiletools.calendar.activities
+
+import android.content.Intent
+import com.simplemobiletools.calendar.helpers.DAY_CODE
+import com.simplemobiletools.calendar.helpers.EVENT_ID
+import com.simplemobiletools.calendar.helpers.EVENT_OCCURRENCE_TS
+import com.simplemobiletools.calendar.helpers.OPEN_MONTH
+import com.simplemobiletools.commons.activities.BaseSplashActivity
+
+class SplashActivity : BaseSplashActivity() {
+    override fun initActivity() {
+        when {
+            intent.extras?.containsKey(DAY_CODE) == true -> Intent(this, MainActivity::class.java).apply {
+                putExtra(DAY_CODE, intent.getStringExtra(DAY_CODE))
+                putExtra(OPEN_MONTH, intent.getBooleanExtra(OPEN_MONTH, false))
+                startActivity(this)
+            }
+            intent.extras?.containsKey(EVENT_ID) == true -> Intent(this, MainActivity::class.java).apply {
+                putExtra(EVENT_ID, intent.getIntExtra(EVENT_ID, 0))
+                putExtra(EVENT_OCCURRENCE_TS, intent.getIntExtra(EVENT_OCCURRENCE_TS, 0))
+                startActivity(this)
+            }
+            else -> startActivity(Intent(this, MainActivity::class.java))
+        }
+        finish()
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetListConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetListConfigureActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..e6bf2dc8f498502841b6425300382ab77ce7b098
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetListConfigureActivity.kt
@@ -0,0 +1,184 @@
+package com.simplemobiletools.calendar.activities
+
+import android.app.Activity
+import android.appwidget.AppWidgetManager
+import android.content.Intent
+import android.graphics.Color
+import android.os.Bundle
+import android.widget.SeekBar
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.adapters.EventListAdapter
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.seconds
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.helpers.MyWidgetListProvider
+import com.simplemobiletools.calendar.models.ListEvent
+import com.simplemobiletools.calendar.models.ListItem
+import com.simplemobiletools.calendar.models.ListSection
+import com.simplemobiletools.commons.dialogs.ColorPickerDialog
+import com.simplemobiletools.commons.extensions.adjustAlpha
+import com.simplemobiletools.commons.extensions.setFillWithStroke
+import com.simplemobiletools.commons.helpers.IS_CUSTOMIZING_COLORS
+import kotlinx.android.synthetic.main.widget_config_list.*
+import org.joda.time.DateTime
+import java.util.*
+
+class WidgetListConfigureActivity : SimpleActivity() {
+    private var mBgAlpha = 0f
+    private var mWidgetId = 0
+    private var mBgColorWithoutTransparency = 0
+    private var mBgColor = 0
+    private var mTextColorWithoutTransparency = 0
+    private var mTextColor = 0
+
+    private var mEventsAdapter: EventListAdapter? = null
+    private var mIsCustomizingColors = false
+
+    public override fun onCreate(savedInstanceState: Bundle?) {
+        useDynamicTheme = false
+        super.onCreate(savedInstanceState)
+        setResult(Activity.RESULT_CANCELED)
+        setContentView(R.layout.widget_config_list)
+        initVariables()
+
+        mIsCustomizingColors = intent.extras?.getBoolean(IS_CUSTOMIZING_COLORS) ?: false
+        mWidgetId = intent.extras?.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID) ?: AppWidgetManager.INVALID_APPWIDGET_ID
+
+        if (mWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID && !mIsCustomizingColors) {
+            finish()
+        }
+
+        mEventsAdapter = EventListAdapter(this, getListItems(), false, null, config_events_list) {}
+        mEventsAdapter!!.updateTextColor(mTextColor)
+        config_events_list.adapter = mEventsAdapter
+
+        config_save.setOnClickListener { saveConfig() }
+        config_bg_color.setOnClickListener { pickBackgroundColor() }
+        config_text_color.setOnClickListener { pickTextColor() }
+
+        val primaryColor = config.primaryColor
+        config_bg_seekbar.setColors(mTextColor, primaryColor, primaryColor)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        window.decorView.setBackgroundColor(0)
+    }
+
+    private fun initVariables() {
+        mTextColorWithoutTransparency = config.widgetTextColor
+        updateColors()
+
+        mBgColor = config.widgetBgColor
+        if (mBgColor == 1) {
+            mBgColor = Color.BLACK
+            mBgAlpha = .2f
+        } else {
+            mBgAlpha = Color.alpha(mBgColor) / 255.toFloat()
+        }
+
+        mBgColorWithoutTransparency = Color.rgb(Color.red(mBgColor), Color.green(mBgColor), Color.blue(mBgColor))
+        config_bg_seekbar.setOnSeekBarChangeListener(bgSeekbarChangeListener)
+        config_bg_seekbar.progress = (mBgAlpha * 100).toInt()
+        updateBgColor()
+    }
+
+    private fun saveConfig() {
+        storeWidgetColors()
+        requestWidgetUpdate()
+
+        Intent().apply {
+            putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId)
+            setResult(Activity.RESULT_OK, this)
+        }
+        finish()
+    }
+
+    private fun storeWidgetColors() {
+        config.apply {
+            widgetBgColor = mBgColor
+            widgetTextColor = mTextColorWithoutTransparency
+        }
+    }
+
+    private fun pickBackgroundColor() {
+        ColorPickerDialog(this, mBgColorWithoutTransparency) { wasPositivePressed, color ->
+            if (wasPositivePressed) {
+                mBgColorWithoutTransparency = color
+                updateBgColor()
+            }
+        }
+    }
+
+    private fun pickTextColor() {
+        ColorPickerDialog(this, mTextColor) { wasPositivePressed, color ->
+            if (wasPositivePressed) {
+                mTextColorWithoutTransparency = color
+                updateColors()
+            }
+        }
+    }
+
+    private fun requestWidgetUpdate() {
+        Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidgetListProvider::class.java).apply {
+            putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(mWidgetId))
+            sendBroadcast(this)
+        }
+    }
+
+    private fun updateColors() {
+        mTextColor = mTextColorWithoutTransparency
+        mEventsAdapter?.updateTextColor(mTextColor)
+        config_text_color.setFillWithStroke(mTextColor, Color.BLACK)
+        config_save.setTextColor(mTextColor)
+    }
+
+    private fun updateBgColor() {
+        mBgColor = mBgColorWithoutTransparency.adjustAlpha(mBgAlpha)
+        config_events_list.setBackgroundColor(mBgColor)
+        config_bg_color.setFillWithStroke(mBgColor, Color.BLACK)
+        config_save.setBackgroundColor(mBgColor)
+    }
+
+    private fun getListItems(): ArrayList<ListItem> {
+        val listItems = ArrayList<ListItem>(10)
+        var dateTime = DateTime.now().withTime(0, 0, 0, 0).plusDays(1)
+        var code = Formatter.getDayCodeFromTS(dateTime.seconds())
+        var day = Formatter.getDayTitle(this, code)
+        listItems.add(ListSection(day, code, false, false))
+
+        var time = dateTime.withHourOfDay(7)
+        listItems.add(ListEvent(1, time.seconds(), time.plusMinutes(30).seconds(), getString(R.string.sample_title_1), getString(R.string.sample_description_1), false, config.primaryColor))
+        time = dateTime.withHourOfDay(8)
+        listItems.add(ListEvent(2, time.seconds(), time.plusHours(1).seconds(), getString(R.string.sample_title_2), getString(R.string.sample_description_2), false, config.primaryColor))
+
+        dateTime = dateTime.plusDays(1)
+        code = Formatter.getDayCodeFromTS(dateTime.seconds())
+        day = Formatter.getDayTitle(this, code)
+        listItems.add(ListSection(day, code, false, false))
+
+        time = dateTime.withHourOfDay(8)
+        listItems.add(ListEvent(3, time.seconds(), time.plusHours(1).seconds(), getString(R.string.sample_title_3), "", false, config.primaryColor))
+        time = dateTime.withHourOfDay(13)
+        listItems.add(ListEvent(4, time.seconds(), time.plusHours(1).seconds(), getString(R.string.sample_title_4), getString(R.string.sample_description_4), false, config.primaryColor))
+        time = dateTime.withHourOfDay(18)
+        listItems.add(ListEvent(5, time.seconds(), time.plusMinutes(10).seconds(), getString(R.string.sample_title_5), "", false, config.primaryColor))
+
+        return listItems
+    }
+
+    private val bgSeekbarChangeListener = object : SeekBar.OnSeekBarChangeListener {
+        override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
+            mBgAlpha = progress.toFloat() / 100.toFloat()
+            updateBgColor()
+        }
+
+        override fun onStartTrackingTouch(seekBar: SeekBar) {
+
+        }
+
+        override fun onStopTrackingTouch(seekBar: SeekBar) {
+
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..0c3cd60a6e3ee96180a8ee5f6e24e9c13f8f5c86
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/activities/WidgetMonthlyConfigureActivity.kt
@@ -0,0 +1,217 @@
+package com.simplemobiletools.calendar.activities
+
+import android.app.Activity
+import android.appwidget.AppWidgetManager
+import android.content.Context
+import android.content.Intent
+import android.content.res.Resources
+import android.graphics.Color
+import android.os.Bundle
+import android.widget.LinearLayout
+import android.widget.SeekBar
+import android.widget.TextView
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.addDayEvents
+import com.simplemobiletools.calendar.extensions.addDayNumber
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.helpers.LOW_ALPHA
+import com.simplemobiletools.calendar.helpers.MonthlyCalendarImpl
+import com.simplemobiletools.calendar.helpers.MyWidgetMonthlyProvider
+import com.simplemobiletools.calendar.interfaces.MonthlyCalendar
+import com.simplemobiletools.calendar.models.DayMonthly
+import com.simplemobiletools.commons.dialogs.ColorPickerDialog
+import com.simplemobiletools.commons.extensions.adjustAlpha
+import com.simplemobiletools.commons.extensions.applyColorFilter
+import com.simplemobiletools.commons.extensions.beVisible
+import com.simplemobiletools.commons.extensions.setFillWithStroke
+import kotlinx.android.synthetic.main.first_row.*
+import kotlinx.android.synthetic.main.top_navigation.*
+import kotlinx.android.synthetic.main.widget_config_monthly.*
+import org.joda.time.DateTime
+
+class WidgetMonthlyConfigureActivity : SimpleActivity(), MonthlyCalendar {
+    lateinit var mRes: Resources
+    private var mDays: List<DayMonthly>? = null
+    private var mPackageName = ""
+    private var dayLabelHeight = 0
+
+    private var mBgAlpha = 0f
+    private var mWidgetId = 0
+    private var mBgColorWithoutTransparency = 0
+    private var mBgColor = 0
+    private var mTextColorWithoutTransparency = 0
+    private var mTextColor = 0
+    private var mWeakTextColor = 0
+    private var mPrimaryColor = 0
+
+    public override fun onCreate(savedInstanceState: Bundle?) {
+        useDynamicTheme = false
+        super.onCreate(savedInstanceState)
+        setResult(Activity.RESULT_CANCELED)
+        setContentView(R.layout.widget_config_monthly)
+        initVariables()
+
+        val extras = intent.extras
+        if (extras != null)
+            mWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID)
+
+        if (mWidgetId == AppWidgetManager.INVALID_APPWIDGET_ID)
+            finish()
+
+        config_save.setOnClickListener { saveConfig() }
+        config_bg_color.setOnClickListener { pickBackgroundColor() }
+        config_text_color.setOnClickListener { pickTextColor() }
+        config_bg_seekbar.setColors(mTextColor, mPrimaryColor, mPrimaryColor)
+    }
+
+    override fun onResume() {
+        super.onResume()
+        window.decorView.setBackgroundColor(0)
+    }
+
+    private fun initVariables() {
+        mPackageName = packageName
+        mRes = resources
+
+        mTextColorWithoutTransparency = config.widgetTextColor
+        updateColors()
+
+        mBgColor = config.widgetBgColor
+        if (mBgColor == 1) {
+            mBgColor = Color.BLACK
+            mBgAlpha = .2f
+        } else {
+            mBgAlpha = Color.alpha(mBgColor) / 255.toFloat()
+        }
+
+        mBgColorWithoutTransparency = Color.rgb(Color.red(mBgColor), Color.green(mBgColor), Color.blue(mBgColor))
+        config_bg_seekbar.setOnSeekBarChangeListener(bgSeekbarChangeListener)
+        config_bg_seekbar.progress = (mBgAlpha * 100).toInt()
+        updateBgColor()
+
+        MonthlyCalendarImpl(this, applicationContext).updateMonthlyCalendar(DateTime().withDayOfMonth(1), false)
+    }
+
+    private fun saveConfig() {
+        storeWidgetColors()
+        requestWidgetUpdate()
+
+        Intent().apply {
+            putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, mWidgetId)
+            setResult(Activity.RESULT_OK, this)
+        }
+        finish()
+    }
+
+    private fun storeWidgetColors() {
+        config.apply {
+            widgetBgColor = mBgColor
+            widgetTextColor = mTextColorWithoutTransparency
+        }
+    }
+
+    private fun pickBackgroundColor() {
+        ColorPickerDialog(this, mBgColorWithoutTransparency) { wasPositivePressed, color ->
+            if (wasPositivePressed) {
+                mBgColorWithoutTransparency = color
+                updateBgColor()
+            }
+        }
+    }
+
+    private fun pickTextColor() {
+        ColorPickerDialog(this, mTextColor) { wasPositivePressed, color ->
+            if (wasPositivePressed) {
+                mTextColorWithoutTransparency = color
+                updateColors()
+                updateDays()
+            }
+        }
+    }
+
+    private fun requestWidgetUpdate() {
+        Intent(AppWidgetManager.ACTION_APPWIDGET_UPDATE, null, this, MyWidgetMonthlyProvider::class.java).apply {
+            putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, intArrayOf(mWidgetId))
+            sendBroadcast(this)
+        }
+    }
+
+    private fun updateColors() {
+        mTextColor = mTextColorWithoutTransparency
+        mWeakTextColor = mTextColorWithoutTransparency.adjustAlpha(LOW_ALPHA)
+        mPrimaryColor = config.primaryColor
+
+        top_left_arrow.applyColorFilter(mTextColor)
+        top_right_arrow.applyColorFilter(mTextColor)
+        top_value.setTextColor(mTextColor)
+        config_text_color.setFillWithStroke(mTextColor, Color.BLACK)
+        config_save.setTextColor(mTextColor)
+        updateLabels()
+    }
+
+    private fun updateBgColor() {
+        mBgColor = mBgColorWithoutTransparency.adjustAlpha(mBgAlpha)
+        config_calendar.setBackgroundColor(mBgColor)
+        config_bg_color.setFillWithStroke(mBgColor, Color.BLACK)
+        config_save.setBackgroundColor(mBgColor)
+    }
+
+    private fun updateDays() {
+        val len = mDays!!.size
+
+        if (applicationContext.config.showWeekNumbers) {
+            week_num.setTextColor(mTextColor)
+            week_num.beVisible()
+
+            for (i in 0..5) {
+                findViewById<TextView>(mRes.getIdentifier("week_num_$i", "id", mPackageName)).apply {
+                    text = "${mDays!![i * 7 + 3].weekOfYear}:"
+                    setTextColor(mTextColor)
+                    beVisible()
+                }
+            }
+        }
+
+        val dividerMargin = mRes.displayMetrics.density.toInt()
+        for (i in 0 until len) {
+            findViewById<LinearLayout>(mRes.getIdentifier("day_$i", "id", mPackageName)).apply {
+                val day = mDays!![i]
+                removeAllViews()
+
+                context.addDayNumber(mTextColor, day, this, dayLabelHeight) { dayLabelHeight = it }
+                context.addDayEvents(day, this, mRes, dividerMargin)
+            }
+        }
+    }
+
+    private val bgSeekbarChangeListener = object : SeekBar.OnSeekBarChangeListener {
+        override fun onProgressChanged(seekBar: SeekBar, progress: Int, fromUser: Boolean) {
+            mBgAlpha = progress.toFloat() / 100.toFloat()
+            updateBgColor()
+        }
+
+        override fun onStartTrackingTouch(seekBar: SeekBar) {
+
+        }
+
+        override fun onStopTrackingTouch(seekBar: SeekBar) {
+
+        }
+    }
+
+    override fun updateMonthlyCalendar(context: Context, month: String, days: ArrayList<DayMonthly>, checkedEvents: Boolean) {
+        runOnUiThread {
+            mDays = days
+            top_value.text = month
+            updateDays()
+        }
+    }
+
+    private fun updateLabels() {
+        for (i in 0..6) {
+            findViewById<TextView>(mRes.getIdentifier("label_$i", "id", mPackageName)).apply {
+                setTextColor(mTextColor)
+            }
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/DayEventsAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/DayEventsAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..97e00524948405db42324ea6f7c083a2a6f8f46c
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/DayEventsAdapter.kt
@@ -0,0 +1,137 @@
+package com.simplemobiletools.calendar.adapters
+
+import android.view.Menu
+import android.view.View
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.dialogs.DeleteEventDialog
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.shareEvents
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.helpers.LOW_ALPHA
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
+import com.simplemobiletools.commons.extensions.adjustAlpha
+import com.simplemobiletools.commons.extensions.applyColorFilter
+import com.simplemobiletools.commons.extensions.beInvisible
+import com.simplemobiletools.commons.extensions.beInvisibleIf
+import com.simplemobiletools.commons.views.MyRecyclerView
+import kotlinx.android.synthetic.main.event_item_day_view.view.*
+
+class DayEventsAdapter(activity: SimpleActivity, val events: ArrayList<Event>, recyclerView: MyRecyclerView, itemClick: (Any) -> Unit)
+    : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
+
+    private val allDayString = resources.getString(R.string.all_day)
+    private val replaceDescriptionWithLocation = activity.config.replaceDescription
+    private val dimPastEvents = activity.config.dimPastEvents
+
+    init {
+        setupDragListener(true)
+    }
+
+    override fun getActionMenuId() = R.menu.cab_day
+
+    override fun prepareActionMode(menu: Menu) {}
+
+    override fun prepareItemSelection(view: View) {}
+
+    override fun markItemSelection(select: Boolean, view: View?) {
+        view?.event_item_frame?.isSelected = select
+    }
+
+    override fun actionItemPressed(id: Int) {
+        when (id) {
+            R.id.cab_share -> shareEvents()
+            R.id.cab_delete -> askConfirmDelete()
+        }
+    }
+
+    override fun getSelectableItemCount() = events.size
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.event_item_day_view, parent)
+
+    override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
+        val event = events[position]
+        val view = holder.bindView(event) { itemView, layoutPosition ->
+            setupView(itemView, event)
+        }
+        bindViewHolder(holder, position, view)
+    }
+
+    override fun getItemCount() = events.size
+
+    private fun setupView(view: View, event: Event) {
+        view.apply {
+            event_section_title.text = event.title
+            event_item_description.text = if (replaceDescriptionWithLocation) event.location else event.description
+            event_item_start.text = if (event.getIsAllDay()) allDayString else Formatter.getTimeFromTS(context, event.startTS)
+            event_item_end.beInvisibleIf(event.startTS == event.endTS)
+            event_item_color.applyColorFilter(event.color)
+
+            if (event.startTS != event.endTS) {
+                val startCode = Formatter.getDayCodeFromTS(event.startTS)
+                val endCode = Formatter.getDayCodeFromTS(event.endTS)
+
+                event_item_end.apply {
+                    text = Formatter.getTimeFromTS(context, event.endTS)
+                    if (startCode != endCode) {
+                        if (event.getIsAllDay()) {
+                            text = Formatter.getDateFromCode(context, endCode, true)
+                        } else {
+                            append(" (${Formatter.getDateFromCode(context, endCode, true)})")
+                        }
+                    } else if (event.getIsAllDay()) {
+                        beInvisible()
+                    }
+                }
+            }
+
+            var newTextColor = textColor
+            if (dimPastEvents && event.isPastEvent) {
+                newTextColor = newTextColor.adjustAlpha(LOW_ALPHA)
+            }
+
+            event_item_start.setTextColor(newTextColor)
+            event_item_end.setTextColor(newTextColor)
+            event_section_title.setTextColor(newTextColor)
+            event_item_description.setTextColor(newTextColor)
+        }
+    }
+
+    private fun shareEvents() {
+        val eventIds = ArrayList<Int>(selectedPositions.size)
+        selectedPositions.forEach {
+            eventIds.add(events[it].id)
+        }
+        activity.shareEvents(eventIds.distinct())
+    }
+
+    private fun askConfirmDelete() {
+        val eventIds = ArrayList<Int>(selectedPositions.size)
+        val timestamps = ArrayList<Int>(selectedPositions.size)
+        selectedPositions.forEach {
+            eventIds.add(events[it].id)
+            timestamps.add(events[it].startTS)
+        }
+
+        DeleteEventDialog(activity, eventIds) {
+            val eventsToDelete = ArrayList<Event>(selectedPositions.size)
+            selectedPositions.sortedDescending().forEach {
+                eventsToDelete.add(events[it])
+            }
+            events.removeAll(eventsToDelete)
+
+            if (it) {
+                val eventIDs = Array(eventIds.size, { i -> (eventIds[i].toString()) })
+                activity.dbHelper.deleteEvents(eventIDs, true)
+            } else {
+                eventIds.forEachIndexed { index, value ->
+                    activity.dbHelper.addEventRepeatException(value, timestamps[index], true)
+                }
+            }
+            removeSelectedItems()
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..026459b96e292f27ad792375cdef7f76fdfe29e2
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListAdapter.kt
@@ -0,0 +1,219 @@
+package com.simplemobiletools.calendar.adapters
+
+import android.view.Menu
+import android.view.View
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.dialogs.DeleteEventDialog
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.shareEvents
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.helpers.LOW_ALPHA
+import com.simplemobiletools.calendar.helpers.getNowSeconds
+import com.simplemobiletools.calendar.models.ListEvent
+import com.simplemobiletools.calendar.models.ListItem
+import com.simplemobiletools.calendar.models.ListSection
+import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
+import com.simplemobiletools.commons.extensions.adjustAlpha
+import com.simplemobiletools.commons.extensions.applyColorFilter
+import com.simplemobiletools.commons.extensions.beInvisible
+import com.simplemobiletools.commons.extensions.beInvisibleIf
+import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
+import com.simplemobiletools.commons.views.MyRecyclerView
+import kotlinx.android.synthetic.main.event_list_item.view.*
+import java.util.*
+
+class EventListAdapter(activity: SimpleActivity, var listItems: ArrayList<ListItem>, val allowLongClick: Boolean, val listener: RefreshRecyclerViewListener?,
+                       recyclerView: MyRecyclerView, itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
+
+    private val ITEM_EVENT = 0
+    private val ITEM_HEADER = 1
+
+    private val topDivider = resources.getDrawable(R.drawable.divider_width)
+    private val allDayString = resources.getString(R.string.all_day)
+    private val replaceDescriptionWithLocation = activity.config.replaceDescription
+    private val dimPastEvents = activity.config.dimPastEvents
+    private val now = getNowSeconds()
+    private var use24HourFormat = activity.config.use24HourFormat
+    private var currentItemsHash = listItems.hashCode()
+
+    init {
+        var firstNonPastSectionIndex = -1
+        listItems.forEachIndexed { index, listItem ->
+            if (firstNonPastSectionIndex == -1 && listItem is ListSection) {
+                if (!listItem.isPastSection) {
+                    firstNonPastSectionIndex = index
+                }
+            }
+        }
+
+        if (firstNonPastSectionIndex != -1) {
+            activity.runOnUiThread {
+                recyclerView.scrollToPosition(firstNonPastSectionIndex)
+            }
+        }
+    }
+
+    override fun getActionMenuId() = R.menu.cab_event_list
+
+    override fun prepareActionMode(menu: Menu) {}
+
+    override fun prepareItemSelection(view: View) {}
+
+    override fun markItemSelection(select: Boolean, view: View?) {
+        view?.event_item_frame?.isSelected = select
+    }
+
+    override fun actionItemPressed(id: Int) {
+        when (id) {
+            R.id.cab_share -> shareEvents()
+            R.id.cab_delete -> askConfirmDelete()
+        }
+    }
+
+    override fun getSelectableItemCount() = listItems.filter { it is ListEvent }.size
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyRecyclerViewAdapter.ViewHolder {
+        val layoutId = if (viewType == ITEM_EVENT) R.layout.event_list_item else R.layout.event_list_section
+        return createViewHolder(layoutId, parent)
+    }
+
+    override fun onBindViewHolder(holder: MyRecyclerViewAdapter.ViewHolder, position: Int) {
+        val listItem = listItems[position]
+        val view = holder.bindView(listItem, allowLongClick) { itemView, layoutPosition ->
+            if (listItem is ListSection) {
+                setupListSection(itemView, listItem, position)
+            } else if (listItem is ListEvent) {
+                setupListEvent(itemView, listItem)
+            }
+        }
+        bindViewHolder(holder, position, view)
+    }
+
+    override fun getItemCount() = listItems.size
+
+    override fun getItemViewType(position: Int) = if (listItems[position] is ListEvent) ITEM_EVENT else ITEM_HEADER
+
+    fun toggle24HourFormat(use24HourFormat: Boolean) {
+        this.use24HourFormat = use24HourFormat
+        notifyDataSetChanged()
+    }
+
+    fun updateListItems(newListItems: ArrayList<ListItem>) {
+        if (newListItems.hashCode() != currentItemsHash) {
+            currentItemsHash = newListItems.hashCode()
+            listItems = newListItems.clone() as ArrayList<ListItem>
+            recyclerView.resetItemCount()
+            notifyDataSetChanged()
+            finishActMode()
+        }
+    }
+
+    private fun setupListEvent(view: View, listEvent: ListEvent) {
+        view.apply {
+            event_section_title.text = listEvent.title
+            event_item_description.text = if (replaceDescriptionWithLocation) listEvent.location else listEvent.description
+            event_item_start.text = if (listEvent.isAllDay) allDayString else Formatter.getTimeFromTS(context, listEvent.startTS)
+            event_item_end.beInvisibleIf(listEvent.startTS == listEvent.endTS)
+            event_item_color.applyColorFilter(listEvent.color)
+
+            if (listEvent.startTS != listEvent.endTS) {
+                val startCode = Formatter.getDayCodeFromTS(listEvent.startTS)
+                val endCode = Formatter.getDayCodeFromTS(listEvent.endTS)
+
+                event_item_end.apply {
+                    text = Formatter.getTimeFromTS(context, listEvent.endTS)
+                    if (startCode != endCode) {
+                        if (listEvent.isAllDay) {
+                            text = Formatter.getDateFromCode(context, endCode, true)
+                        } else {
+                            append(" (${Formatter.getDateFromCode(context, endCode, true)})")
+                        }
+                    } else if (listEvent.isAllDay) {
+                        beInvisible()
+                    }
+                }
+            }
+
+            var startTextColor = textColor
+            var endTextColor = textColor
+            if (listEvent.startTS <= now && listEvent.endTS <= now) {
+                if (listEvent.isAllDay) {
+                    if (Formatter.getDayCodeFromTS(listEvent.startTS) == Formatter.getDayCodeFromTS(now)) {
+                        startTextColor = primaryColor
+                    }
+                }
+
+                if (dimPastEvents && listEvent.isPastEvent) {
+                    startTextColor = startTextColor.adjustAlpha(LOW_ALPHA)
+                    endTextColor = endTextColor.adjustAlpha(LOW_ALPHA)
+                }
+            } else if (listEvent.startTS <= now && listEvent.endTS >= now) {
+                startTextColor = primaryColor
+            }
+
+            event_item_start.setTextColor(startTextColor)
+            event_item_end.setTextColor(endTextColor)
+            event_section_title.setTextColor(startTextColor)
+            event_item_description.setTextColor(startTextColor)
+        }
+    }
+
+    private fun setupListSection(view: View, listSection: ListSection, position: Int) {
+        view.event_section_title.apply {
+            text = listSection.title
+            setCompoundDrawablesWithIntrinsicBounds(null, if (position == 0) null else topDivider, null, null)
+            var color = if (listSection.isToday) primaryColor else textColor
+            if (dimPastEvents && listSection.isPastSection) {
+                color = color.adjustAlpha(LOW_ALPHA)
+            }
+            setTextColor(color)
+        }
+    }
+
+    private fun shareEvents() {
+        val eventIds = ArrayList<Int>(selectedPositions.size)
+        selectedPositions.forEach {
+            val item = listItems[it]
+            if (item is ListEvent) {
+                eventIds.add(item.id)
+            }
+        }
+        activity.shareEvents(eventIds.distinct())
+    }
+
+    private fun askConfirmDelete() {
+        val eventIds = ArrayList<Int>(selectedPositions.size)
+        val timestamps = ArrayList<Int>(selectedPositions.size)
+
+        selectedPositions.forEach {
+            val item = listItems[it]
+            if (item is ListEvent) {
+                eventIds.add(item.id)
+                timestamps.add(item.startTS)
+            }
+        }
+
+        DeleteEventDialog(activity, eventIds) {
+            val listItemsToDelete = ArrayList<ListItem>(selectedPositions.size)
+            selectedPositions.sortedDescending().forEach {
+                val listItem = listItems[it]
+                listItemsToDelete.add(listItem)
+            }
+            listItems.removeAll(listItemsToDelete)
+
+            if (it) {
+                val eventIDs = Array(eventIds.size, { i -> (eventIds[i].toString()) })
+                activity.dbHelper.deleteEvents(eventIDs, true)
+            } else {
+                eventIds.forEachIndexed { index, value ->
+                    activity.dbHelper.addEventRepeatException(value, timestamps[index], true)
+                }
+            }
+            listener?.refreshItems()
+            finishActMode()
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListWidgetAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListWidgetAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3da3eeceb82d8df0fd026d508e4a837d73dc3909
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/EventListWidgetAdapter.kt
@@ -0,0 +1,166 @@
+package com.simplemobiletools.calendar.adapters
+
+import android.content.Context
+import android.content.Intent
+import android.view.View
+import android.widget.RemoteViews
+import android.widget.RemoteViewsService
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.R.id.event_item_holder
+import com.simplemobiletools.calendar.R.id.event_section_title
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.seconds
+import com.simplemobiletools.calendar.helpers.*
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.models.ListEvent
+import com.simplemobiletools.calendar.models.ListItem
+import com.simplemobiletools.calendar.models.ListSection
+import com.simplemobiletools.commons.extensions.adjustAlpha
+import com.simplemobiletools.commons.extensions.getColoredBitmap
+import com.simplemobiletools.commons.extensions.setText
+import com.simplemobiletools.commons.extensions.setTextSize
+import org.joda.time.DateTime
+import java.util.*
+
+class EventListWidgetAdapter(val context: Context) : RemoteViewsService.RemoteViewsFactory {
+    private val ITEM_EVENT = 0
+    private val ITEM_HEADER = 1
+
+    private val allDayString = context.resources.getString(R.string.all_day)
+    private var events = ArrayList<ListItem>()
+    private val textColor = context.config.widgetTextColor
+    private val weakTextColor = textColor.adjustAlpha(LOW_ALPHA)
+    private val replaceDescription = context.config.replaceDescription
+    private val dimPastEvents = context.config.dimPastEvents
+    private var mediumFontSize = context.config.getFontSize()
+
+    override fun getViewAt(position: Int): RemoteViews? {
+        val type = getItemViewType(position)
+        val remoteView: RemoteViews
+
+        if (type == ITEM_EVENT) {
+            remoteView = RemoteViews(context.packageName, R.layout.event_list_item_widget)
+            setupListEvent(remoteView, events[position] as ListEvent)
+        } else {
+            remoteView = RemoteViews(context.packageName, R.layout.event_list_section_widget)
+            setupListSection(remoteView, events[position] as ListSection)
+        }
+
+        return remoteView
+    }
+
+    private fun setupListEvent(remoteView: RemoteViews, item: ListEvent) {
+        var curTextColor = textColor
+        remoteView.apply {
+            setText(R.id.event_section_title, item.title)
+            setText(R.id.event_item_description, if (replaceDescription) item.location else item.description)
+            setText(R.id.event_item_start, if (item.isAllDay) allDayString else Formatter.getTimeFromTS(context, item.startTS))
+            setImageViewBitmap(R.id.event_item_color, context.resources.getColoredBitmap(R.drawable.monthly_event_dot, item.color))
+
+            if (item.startTS == item.endTS) {
+                setViewVisibility(R.id.event_item_end, View.INVISIBLE)
+            } else {
+                setViewVisibility(R.id.event_item_end, View.VISIBLE)
+                var endString = Formatter.getTimeFromTS(context, item.endTS)
+                val startCode = Formatter.getDayCodeFromTS(item.startTS)
+                val endCode = Formatter.getDayCodeFromTS(item.endTS)
+
+                if (startCode != endCode) {
+                    if (item.isAllDay) {
+                        endString = Formatter.getDateFromCode(context, endCode, true)
+                    } else {
+                        endString += " (${Formatter.getDateFromCode(context, endCode, true)})"
+                    }
+                } else if (item.isAllDay) {
+                    setViewVisibility(R.id.event_item_end, View.INVISIBLE)
+                }
+                setText(R.id.event_item_end, endString)
+            }
+
+            if (dimPastEvents && item.isPastEvent) {
+                curTextColor = weakTextColor
+            }
+
+            setTextColor(R.id.event_section_title, curTextColor)
+            setTextColor(R.id.event_item_description, curTextColor)
+            setTextColor(R.id.event_item_start, curTextColor)
+            setTextColor(R.id.event_item_end, curTextColor)
+
+            setTextSize(R.id.event_section_title, mediumFontSize)
+            setTextSize(R.id.event_item_description, mediumFontSize)
+            setTextSize(R.id.event_item_start, mediumFontSize)
+            setTextSize(R.id.event_item_end, mediumFontSize)
+
+            Intent().apply {
+                putExtra(EVENT_ID, item.id)
+                putExtra(EVENT_OCCURRENCE_TS, item.startTS)
+                setOnClickFillInIntent(event_item_holder, this)
+            }
+        }
+    }
+
+    private fun setupListSection(remoteView: RemoteViews, item: ListSection) {
+        var curTextColor = textColor
+        if (dimPastEvents && item.isPastSection) {
+            curTextColor = weakTextColor
+        }
+
+        remoteView.apply {
+            setTextColor(R.id.event_section_title, curTextColor)
+            setTextSize(R.id.event_section_title, mediumFontSize)
+            setText(R.id.event_section_title, item.title)
+
+            Intent().apply {
+                putExtra(DAY_CODE, item.code)
+                setOnClickFillInIntent(event_section_title, this)
+            }
+        }
+    }
+
+    private fun getItemViewType(position: Int) = if (events[position] is ListEvent) ITEM_EVENT else ITEM_HEADER
+
+    override fun getLoadingView() = null
+
+    override fun getViewTypeCount() = 2
+
+    override fun onCreate() {}
+
+    override fun getItemId(position: Int) = position.toLong()
+
+    override fun onDataSetChanged() {
+        mediumFontSize = context.config.getFontSize()
+        val fromTS = DateTime().seconds() - context.config.displayPastEvents * 60
+        val toTS = DateTime().plusYears(1).seconds()
+        context.dbHelper.getEventsInBackground(fromTS, toTS) {
+            val listItems = ArrayList<ListItem>(it.size)
+            val replaceDescription = context.config.replaceDescription
+            val sorted = it.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { if (replaceDescription) it.location else it.description }))
+            var prevCode = ""
+            val now = getNowSeconds()
+            val today = Formatter.getDayTitle(context, Formatter.getDayCodeFromTS(now))
+
+            sorted.forEach {
+                val code = Formatter.getDayCodeFromTS(it.startTS)
+                if (code != prevCode) {
+                    val day = Formatter.getDayTitle(context, code)
+                    val isToday = day == today
+                    val listSection = ListSection(day, code, isToday, !isToday && it.startTS < now)
+                    listItems.add(listSection)
+                    prevCode = code
+                }
+
+                val listEvent = ListEvent(it.id, it.startTS, it.endTS, it.title, it.description, it.getIsAllDay(), it.color, it.location, it.isPastEvent)
+                listItems.add(listEvent)
+            }
+
+            this@EventListWidgetAdapter.events = listItems
+        }
+    }
+
+    override fun hasStableIds() = true
+
+    override fun getCount() = events.size
+
+    override fun onDestroy() {}
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/FilterEventTypeAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/FilterEventTypeAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..30f9006ffd29d6302a3b72567f1df847de47ecff
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/FilterEventTypeAdapter.kt
@@ -0,0 +1,87 @@
+package com.simplemobiletools.calendar.adapters
+
+import android.support.v7.widget.RecyclerView
+import android.util.SparseArray
+import android.view.View
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
+import com.simplemobiletools.commons.extensions.setFillWithStroke
+import com.simplemobiletools.commons.interfaces.MyAdapterListener
+import kotlinx.android.synthetic.main.filter_event_type_view.view.*
+import java.util.*
+
+class FilterEventTypeAdapter(val activity: SimpleActivity, val eventTypes: List<EventType>, val displayEventTypes: Set<String>) :
+        RecyclerView.Adapter<FilterEventTypeAdapter.ViewHolder>() {
+    private val itemViews = SparseArray<View>()
+    private val selectedPositions = HashSet<Int>()
+
+    init {
+        eventTypes.forEachIndexed { index, eventType ->
+            if (displayEventTypes.contains(eventType.id.toString())) {
+                selectedPositions.add(index)
+            }
+        }
+    }
+
+    private fun toggleItemSelection(select: Boolean, pos: Int) {
+        if (select) {
+            if (itemViews[pos] != null) {
+                selectedPositions.add(pos)
+            }
+        } else {
+            selectedPositions.remove(pos)
+        }
+
+        itemViews[pos]?.filter_event_type_checkbox?.isChecked = select
+    }
+
+    private val adapterListener = object : MyAdapterListener {
+        override fun toggleItemSelectionAdapter(select: Boolean, position: Int) {
+            toggleItemSelection(select, position)
+        }
+
+        override fun getSelectedPositions() = selectedPositions
+
+        override fun itemLongClicked(position: Int) {}
+    }
+
+    fun getSelectedItemsSet(): HashSet<String> {
+        val selectedItemsSet = HashSet<String>(selectedPositions.size)
+        selectedPositions.forEach { selectedItemsSet.add(eventTypes[it].id.toString()) }
+        return selectedItemsSet
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val view = activity.layoutInflater.inflate(R.layout.filter_event_type_view, parent, false)
+        return ViewHolder(view, adapterListener, activity)
+    }
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        val eventType = eventTypes[position]
+        itemViews.put(position, holder.bindView(eventType))
+        toggleItemSelection(selectedPositions.contains(position), position)
+    }
+
+    override fun getItemCount() = eventTypes.size
+
+    class ViewHolder(view: View, val adapterListener: MyAdapterListener, val activity: SimpleActivity) : RecyclerView.ViewHolder(view) {
+        fun bindView(eventType: EventType): View {
+            itemView.apply {
+                filter_event_type_checkbox.setColors(activity.config.textColor, activity.getAdjustedPrimaryColor(), activity.config.backgroundColor)
+                filter_event_type_checkbox.text = eventType.getDisplayTitle()
+                filter_event_type_color.setFillWithStroke(eventType.color, activity.config.backgroundColor)
+                filter_event_type_holder.setOnClickListener { viewClicked(!filter_event_type_checkbox.isChecked) }
+            }
+
+            return itemView
+        }
+
+        private fun viewClicked(select: Boolean) {
+            adapterListener.toggleItemSelectionAdapter(select, adapterPosition)
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/ManageEventTypesAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/ManageEventTypesAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..97553d6051ce9333ab96e4d47c3347b870bbe355
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/ManageEventTypesAdapter.kt
@@ -0,0 +1,112 @@
+package com.simplemobiletools.calendar.adapters
+
+import android.view.Menu
+import android.view.View
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.helpers.DBHelper
+import com.simplemobiletools.calendar.interfaces.DeleteEventTypesListener
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.commons.adapters.MyRecyclerViewAdapter
+import com.simplemobiletools.commons.dialogs.ConfirmationDialog
+import com.simplemobiletools.commons.dialogs.RadioGroupDialog
+import com.simplemobiletools.commons.extensions.setFillWithStroke
+import com.simplemobiletools.commons.extensions.toast
+import com.simplemobiletools.commons.models.RadioItem
+import com.simplemobiletools.commons.views.MyRecyclerView
+import kotlinx.android.synthetic.main.item_event_type.view.*
+import java.util.*
+
+class ManageEventTypesAdapter(activity: SimpleActivity, val eventTypes: ArrayList<EventType>, val listener: DeleteEventTypesListener?, recyclerView: MyRecyclerView,
+                              itemClick: (Any) -> Unit) : MyRecyclerViewAdapter(activity, recyclerView, null, itemClick) {
+
+    init {
+        setupDragListener(true)
+    }
+
+    override fun getActionMenuId() = R.menu.cab_event_type
+
+    override fun prepareActionMode(menu: Menu) {}
+
+    override fun prepareItemSelection(view: View) {}
+
+    override fun markItemSelection(select: Boolean, view: View?) {
+        view?.event_item_frame?.isSelected = select
+    }
+
+    override fun actionItemPressed(id: Int) {
+        when (id) {
+            R.id.cab_delete -> askConfirmDelete()
+        }
+    }
+
+    override fun getSelectableItemCount() = eventTypes.size
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = createViewHolder(R.layout.item_event_type, parent)
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        val eventType = eventTypes[position]
+        val view = holder.bindView(eventType) { itemView, layoutPosition ->
+            setupView(itemView, eventType)
+        }
+        bindViewHolder(holder, position, view)
+    }
+
+    override fun getItemCount() = eventTypes.size
+
+    private fun setupView(view: View, eventType: EventType) {
+        view.apply {
+            event_type_title.text = eventType.getDisplayTitle()
+            event_type_color.setFillWithStroke(eventType.color, activity.config.backgroundColor)
+            event_type_title.setTextColor(textColor)
+        }
+    }
+
+    private fun askConfirmDelete() {
+        val eventTypes = ArrayList<EventType>(selectedPositions.size)
+        selectedPositions.forEach { eventTypes.add(this.eventTypes[it]) }
+
+        if (activity.dbHelper.doEventTypesContainEvent(eventTypes)) {
+            val MOVE_EVENTS = 0
+            val DELETE_EVENTS = 1
+            val res = activity.resources
+            val items = ArrayList<RadioItem>().apply {
+                add(RadioItem(MOVE_EVENTS, res.getString(R.string.move_events_into_default)))
+                add(RadioItem(DELETE_EVENTS, res.getString(R.string.remove_affected_events)))
+            }
+            RadioGroupDialog(activity, items) {
+                deleteEventTypes(it == DELETE_EVENTS)
+            }
+        } else {
+            ConfirmationDialog(activity) {
+                deleteEventTypes(true)
+            }
+        }
+    }
+
+    private fun deleteEventTypes(deleteEvents: Boolean) {
+        val eventTypesToDelete = ArrayList<EventType>(selectedPositions.size)
+
+        for (pos in selectedPositions) {
+            if (eventTypes[pos].id == DBHelper.REGULAR_EVENT_TYPE_ID) {
+                activity.toast(R.string.cannot_delete_default_type)
+                selectedPositions.remove(pos)
+                toggleItemSelection(false, pos)
+                break
+            }
+        }
+
+        selectedPositions.sortedDescending().forEach {
+            val eventType = eventTypes[it]
+            eventTypesToDelete.add(eventType)
+        }
+
+        eventTypes.removeAll(eventTypesToDelete)
+        if (listener?.deleteEventTypes(eventTypesToDelete, deleteEvents) == true) {
+            removeSelectedItems()
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyDayPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyDayPagerAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f81e802df3e4206e3a9c106af8ae6887100f0c02
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyDayPagerAdapter.kt
@@ -0,0 +1,37 @@
+package com.simplemobiletools.calendar.adapters
+
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.support.v4.app.FragmentManager
+import android.support.v4.app.FragmentStatePagerAdapter
+import android.util.SparseArray
+import com.simplemobiletools.calendar.fragments.DayFragment
+import com.simplemobiletools.calendar.helpers.DAY_CODE
+import com.simplemobiletools.calendar.interfaces.NavigationListener
+
+class MyDayPagerAdapter(fm: FragmentManager, private val mCodes: List<String>, private val mListener: NavigationListener) :
+        FragmentStatePagerAdapter(fm) {
+    private val mFragments = SparseArray<DayFragment>()
+
+    override fun getCount() = mCodes.size
+
+    override fun getItem(position: Int): Fragment {
+        val bundle = Bundle()
+        val code = mCodes[position]
+        bundle.putString(DAY_CODE, code)
+
+        val fragment = DayFragment()
+        fragment.arguments = bundle
+        fragment.mListener = mListener
+
+        mFragments.put(position, fragment)
+
+        return fragment
+    }
+
+    fun updateCalendars(pos: Int) {
+        for (i in -1..1) {
+            mFragments[pos + i]?.updateCalendar()
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyMonthPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyMonthPagerAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..17ed299cba57c42222e5f75afc4ea4e10896ed9a
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyMonthPagerAdapter.kt
@@ -0,0 +1,36 @@
+package com.simplemobiletools.calendar.adapters
+
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.support.v4.app.FragmentManager
+import android.support.v4.app.FragmentStatePagerAdapter
+import android.util.SparseArray
+import com.simplemobiletools.calendar.fragments.MonthFragment
+import com.simplemobiletools.calendar.helpers.DAY_CODE
+import com.simplemobiletools.calendar.interfaces.NavigationListener
+
+class MyMonthPagerAdapter(fm: FragmentManager, private val mCodes: List<String>, private val mListener: NavigationListener) : FragmentStatePagerAdapter(fm) {
+    private val mFragments = SparseArray<MonthFragment>()
+
+    override fun getCount() = mCodes.size
+
+    override fun getItem(position: Int): Fragment {
+        val bundle = Bundle()
+        val code = mCodes[position]
+        bundle.putString(DAY_CODE, code)
+
+        val fragment = MonthFragment()
+        fragment.arguments = bundle
+        fragment.listener = mListener
+
+        mFragments.put(position, fragment)
+
+        return fragment
+    }
+
+    fun updateCalendars(pos: Int) {
+        for (i in -1..1) {
+            mFragments[pos + i]?.updateCalendar()
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyWeekPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyWeekPagerAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b403dbc584364ec03a15d404aad9aadd05c166bd
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyWeekPagerAdapter.kt
@@ -0,0 +1,40 @@
+package com.simplemobiletools.calendar.adapters
+
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.support.v4.app.FragmentManager
+import android.support.v4.app.FragmentStatePagerAdapter
+import android.util.SparseArray
+import com.simplemobiletools.calendar.fragments.WeekFragment
+import com.simplemobiletools.calendar.helpers.WEEK_START_TIMESTAMP
+import com.simplemobiletools.calendar.interfaces.WeekFragmentListener
+
+class MyWeekPagerAdapter(fm: FragmentManager, val mWeekTimestamps: List<Int>, val mListener: WeekFragmentListener) : FragmentStatePagerAdapter(fm) {
+    private val mFragments = SparseArray<WeekFragment>()
+
+    override fun getCount() = mWeekTimestamps.size
+
+    override fun getItem(position: Int): Fragment {
+        val bundle = Bundle()
+        val weekTimestamp = mWeekTimestamps[position]
+        bundle.putInt(WEEK_START_TIMESTAMP, weekTimestamp)
+
+        val fragment = WeekFragment()
+        fragment.arguments = bundle
+        fragment.mListener = mListener
+
+        mFragments.put(position, fragment)
+        return fragment
+    }
+
+    fun updateScrollY(pos: Int, y: Int) {
+        mFragments[pos - 1]?.updateScrollY(y)
+        mFragments[pos + 1]?.updateScrollY(y)
+    }
+
+    fun updateCalendars(pos: Int) {
+        for (i in -1..1) {
+            mFragments[pos + i]?.updateCalendar()
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyYearPagerAdapter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyYearPagerAdapter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8434a056e947122a142018db000f5f112cecdb69
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/adapters/MyYearPagerAdapter.kt
@@ -0,0 +1,34 @@
+package com.simplemobiletools.calendar.adapters
+
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.support.v4.app.FragmentManager
+import android.support.v4.app.FragmentStatePagerAdapter
+import android.util.SparseArray
+import com.simplemobiletools.calendar.fragments.YearFragment
+import com.simplemobiletools.calendar.helpers.YEAR_LABEL
+
+class MyYearPagerAdapter(fm: FragmentManager, val mYears: List<Int>) : FragmentStatePagerAdapter(fm) {
+    private val mFragments = SparseArray<YearFragment>()
+
+    override fun getCount() = mYears.size
+
+    override fun getItem(position: Int): Fragment {
+        val bundle = Bundle()
+        val year = mYears[position]
+        bundle.putInt(YEAR_LABEL, year)
+
+        val fragment = YearFragment()
+        fragment.arguments = bundle
+
+        mFragments.put(position, fragment)
+
+        return fragment
+    }
+
+    fun updateCalendars(pos: Int) {
+        for (i in -1..1) {
+            mFragments[pos + i]?.updateCalendar()
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/CustomEventRepeatIntervalDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/CustomEventRepeatIntervalDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..18d1fd8b0571b5c42019d23396d3a2faa96451f8
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/CustomEventRepeatIntervalDialog.kt
@@ -0,0 +1,49 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.app.Activity
+import android.support.v7.app.AlertDialog
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.helpers.DAY
+import com.simplemobiletools.calendar.helpers.MONTH
+import com.simplemobiletools.calendar.helpers.WEEK
+import com.simplemobiletools.calendar.helpers.YEAR
+import com.simplemobiletools.commons.extensions.hideKeyboard
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.extensions.showKeyboard
+import com.simplemobiletools.commons.extensions.value
+import kotlinx.android.synthetic.main.dialog_custom_event_repeat_interval.view.*
+
+class CustomEventRepeatIntervalDialog(val activity: Activity, val callback: (seconds: Int) -> Unit) {
+    var dialog: AlertDialog
+    var view = activity.layoutInflater.inflate(R.layout.dialog_custom_event_repeat_interval, null) as ViewGroup
+
+    init {
+        view.dialog_radio_view.check(R.id.dialog_radio_days)
+
+        dialog = AlertDialog.Builder(activity)
+                .setPositiveButton(R.string.ok, { dialogInterface, i -> confirmRepeatInterval() })
+                .setNegativeButton(R.string.cancel, null)
+                .create().apply {
+                    activity.setupDialogStuff(view, this) {
+                        showKeyboard(view.dialog_custom_repeat_interval_value)
+                    }
+                }
+    }
+
+    private fun confirmRepeatInterval() {
+        val value = view.dialog_custom_repeat_interval_value.value
+        val multiplier = getMultiplier(view.dialog_radio_view.checkedRadioButtonId)
+        val days = Integer.valueOf(if (value.isEmpty()) "0" else value)
+        callback(days * multiplier)
+        activity.hideKeyboard()
+        dialog.dismiss()
+    }
+
+    private fun getMultiplier(id: Int) = when (id) {
+        R.id.dialog_radio_weeks -> WEEK
+        R.id.dialog_radio_months -> MONTH
+        R.id.dialog_radio_years -> YEAR
+        else -> DAY
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/DeleteEventDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/DeleteEventDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5c88fc256d5cf23b1dba94777949112d3644e0af
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/DeleteEventDialog.kt
@@ -0,0 +1,41 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.app.Activity
+import android.support.v7.app.AlertDialog
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.commons.extensions.beVisibleIf
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import kotlinx.android.synthetic.main.dialog_delete_event.view.*
+
+class DeleteEventDialog(val activity: Activity, eventIds: List<Int>, val callback: (allOccurrences: Boolean) -> Unit) {
+    val dialog: AlertDialog?
+
+    init {
+        val events = activity.dbHelper.getEventsWithIds(eventIds)
+        val hasRepeatableEvent = events.any { it.repeatInterval > 0 }
+
+        val view = activity.layoutInflater.inflate(R.layout.dialog_delete_event, null).apply {
+            delete_event_repeat_description.beVisibleIf(hasRepeatableEvent)
+            delete_event_radio_view.beVisibleIf(hasRepeatableEvent)
+
+            if (eventIds.size > 1) {
+                delete_event_repeat_description.text = resources.getString(R.string.selection_contains_repetition)
+            }
+        }
+
+        dialog = AlertDialog.Builder(activity)
+                .setPositiveButton(R.string.yes, { dialog, which -> dialogConfirmed(view as ViewGroup, hasRepeatableEvent) })
+                .setNegativeButton(R.string.no, null)
+                .create().apply {
+                    activity.setupDialogStuff(view, this)
+                }
+    }
+
+    private fun dialogConfirmed(view: ViewGroup, hasRepeatableEvent: Boolean) {
+        val deleteAllOccurrences = !hasRepeatableEvent || view.delete_event_radio_view.checkedRadioButtonId == R.id.delete_event_all
+        dialog?.dismiss()
+        callback(deleteAllOccurrences)
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/EditRepeatingEventDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/EditRepeatingEventDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8edae661002e0b6f76642cebff71448e907e0c52
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/EditRepeatingEventDialog.kt
@@ -0,0 +1,32 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.support.v7.app.AlertDialog
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.commons.extensions.hideKeyboard
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import kotlinx.android.synthetic.main.dialog_edit_repeating_event.view.*
+
+class EditRepeatingEventDialog(val activity: SimpleActivity, val callback: (allOccurrences: Boolean) -> Unit) {
+    var dialog: AlertDialog
+
+    init {
+        val view = (activity.layoutInflater.inflate(R.layout.dialog_edit_repeating_event, null) as ViewGroup).apply {
+            edit_repeating_event_one_only.setOnClickListener { sendResult(false) }
+            edit_repeating_event_all_occurrences.setOnClickListener { sendResult(true) }
+        }
+
+        dialog = AlertDialog.Builder(activity)
+                .create().apply {
+                    activity.setupDialogStuff(view, this) {
+                        hideKeyboard()
+                    }
+                }
+    }
+
+    private fun sendResult(allOccurrences: Boolean) {
+        callback(allOccurrences)
+        dialog.dismiss()
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/ExportEventsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/ExportEventsDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..37f487556c00261760d906846bb181c1ba17438f
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/ExportEventsDialog.kt
@@ -0,0 +1,64 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.support.v7.app.AlertDialog
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.adapters.FilterEventTypeAdapter
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.commons.extensions.*
+import kotlinx.android.synthetic.main.dialog_export_events.view.*
+import java.io.File
+import java.util.*
+
+class ExportEventsDialog(val activity: SimpleActivity, val path: String, val callback: (exportPastEvents: Boolean, file: File, eventTypes: HashSet<String>) -> Unit) {
+
+    init {
+        val view = (activity.layoutInflater.inflate(R.layout.dialog_export_events, null) as ViewGroup).apply {
+            export_events_folder.text = activity.humanizePath(path)
+            export_events_filename.setText("events_${activity.getCurrentFormattedDateTime()}")
+
+            activity.dbHelper.getEventTypes {
+                val eventTypes = HashSet<String>()
+                it.mapTo(eventTypes, { it.id.toString() })
+
+                activity.runOnUiThread {
+                    export_events_types_list.adapter = FilterEventTypeAdapter(activity, it, eventTypes)
+                    if (it.size > 1) {
+                        export_events_pick_types.beVisible()
+
+                        val margin = activity.resources.getDimension(R.dimen.normal_margin).toInt()
+                        (export_events_checkbox.layoutParams as LinearLayout.LayoutParams).leftMargin = margin
+                    }
+                }
+            }
+        }
+
+        AlertDialog.Builder(activity)
+                .setPositiveButton(R.string.ok, null)
+                .setNegativeButton(R.string.cancel, null)
+                .create().apply {
+                    activity.setupDialogStuff(view, this, R.string.export_events) {
+                        getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
+                            val filename = view.export_events_filename.value
+                            when {
+                                filename.isEmpty() -> activity.toast(R.string.empty_name)
+                                filename.isAValidFilename() -> {
+                                    val file = File(path, "$filename.ics")
+                                    if (file.exists()) {
+                                        activity.toast(R.string.name_taken)
+                                        return@setOnClickListener
+                                    }
+
+                                    val eventTypes = (view.export_events_types_list.adapter as FilterEventTypeAdapter).getSelectedItemsSet()
+                                    callback(view.export_events_checkbox.isChecked, file, eventTypes)
+                                    dismiss()
+                                }
+                                else -> activity.toast(R.string.invalid_name)
+                            }
+                        }
+                    }
+                }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/FilterEventTypesDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/FilterEventTypesDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7ca3bb9244a95827650bfc80f511304746c4b6e1
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/FilterEventTypesDialog.kt
@@ -0,0 +1,37 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.support.v7.app.AlertDialog
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.adapters.FilterEventTypeAdapter
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import kotlinx.android.synthetic.main.dialog_filter_event_types.view.*
+
+class FilterEventTypesDialog(val activity: SimpleActivity, val callback: () -> Unit) {
+    var dialog: AlertDialog
+    val view = activity.layoutInflater.inflate(R.layout.dialog_filter_event_types, null)
+
+    init {
+        val eventTypes = activity.dbHelper.getEventTypesSync()
+        val displayEventTypes = activity.config.displayEventTypes
+        view.filter_event_types_list.adapter = FilterEventTypeAdapter(activity, eventTypes, displayEventTypes)
+
+        dialog = AlertDialog.Builder(activity)
+                .setPositiveButton(R.string.ok, { dialogInterface, i -> confirmEventTypes() })
+                .setNegativeButton(R.string.cancel, null)
+                .create().apply {
+                    activity.setupDialogStuff(view, this, R.string.filter_events_by_type)
+                }
+    }
+
+    private fun confirmEventTypes() {
+        val selectedItems = (view.filter_event_types_list.adapter as FilterEventTypeAdapter).getSelectedItemsSet()
+        if (activity.config.displayEventTypes != selectedItems) {
+            activity.config.displayEventTypes = selectedItems
+            callback()
+        }
+        dialog.dismiss()
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/ImportEventsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/ImportEventsDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b74a934208f34685c173b63d97bdacb103146616
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/ImportEventsDialog.kt
@@ -0,0 +1,87 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.support.v7.app.AlertDialog
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.helpers.DBHelper
+import com.simplemobiletools.calendar.helpers.IcsImporter
+import com.simplemobiletools.calendar.helpers.IcsImporter.ImportResult.*
+import com.simplemobiletools.commons.extensions.setFillWithStroke
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.extensions.toast
+import kotlinx.android.synthetic.main.dialog_import_events.view.*
+
+class ImportEventsDialog(val activity: SimpleActivity, val path: String, val callback: (refreshView: Boolean) -> Unit) {
+    var currEventTypeId = DBHelper.REGULAR_EVENT_TYPE_ID
+    var currEventTypeCalDAVCalendarId = 0
+
+    init {
+        val config = activity.config
+        if (activity.dbHelper.getEventType(config.lastUsedLocalEventTypeId) == null) {
+            config.lastUsedLocalEventTypeId = DBHelper.REGULAR_EVENT_TYPE_ID
+        }
+
+        val isLastCaldavCalendarOK = config.caldavSync && config.getSyncedCalendarIdsAsList().contains(config.lastUsedCaldavCalendarId.toString())
+        currEventTypeId = if (isLastCaldavCalendarOK) {
+            val lastUsedCalDAVCalendar = activity.dbHelper.getEventTypeWithCalDAVCalendarId(config.lastUsedCaldavCalendarId)
+            if (lastUsedCalDAVCalendar != null) {
+                currEventTypeCalDAVCalendarId = config.lastUsedCaldavCalendarId
+                lastUsedCalDAVCalendar.id
+            } else {
+                DBHelper.REGULAR_EVENT_TYPE_ID
+            }
+        } else {
+            config.lastUsedLocalEventTypeId
+        }
+
+        val view = (activity.layoutInflater.inflate(R.layout.dialog_import_events, null) as ViewGroup).apply {
+            updateEventType(this)
+            import_event_type_holder.setOnClickListener {
+                SelectEventTypeDialog(activity, currEventTypeId, true) {
+                    currEventTypeId = it.id
+                    currEventTypeCalDAVCalendarId = it.caldavCalendarId
+
+                    config.lastUsedLocalEventTypeId = it.id
+                    config.lastUsedCaldavCalendarId = it.caldavCalendarId
+
+                    updateEventType(this)
+                }
+            }
+        }
+
+        AlertDialog.Builder(activity)
+                .setPositiveButton(R.string.ok, null)
+                .setNegativeButton(R.string.cancel, null)
+                .create().apply {
+                    activity.setupDialogStuff(view, this, R.string.import_events) {
+                        getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
+                            activity.toast(R.string.importing)
+                            Thread {
+                                val overrideFileEventTypes = view.import_events_checkbox.isChecked
+                                val result = IcsImporter(activity).importEvents(path, currEventTypeId, currEventTypeCalDAVCalendarId, overrideFileEventTypes)
+                                handleParseResult(result)
+                                dismiss()
+                            }.start()
+                        }
+                    }
+                }
+    }
+
+    private fun updateEventType(view: ViewGroup) {
+        val eventType = activity.dbHelper.getEventType(currEventTypeId)
+        view.import_event_type_title.text = eventType!!.getDisplayTitle()
+        view.import_event_type_color.setFillWithStroke(eventType.color, activity.config.backgroundColor)
+    }
+
+    private fun handleParseResult(result: IcsImporter.ImportResult) {
+        activity.toast(when (result) {
+            IMPORT_OK -> R.string.importing_successful
+            IMPORT_PARTIAL -> R.string.importing_some_entries_failed
+            else -> R.string.importing_failed
+        })
+        callback(result != IMPORT_FAIL)
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/RepeatLimitTypePickerDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/RepeatLimitTypePickerDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7d30c22c4194db3548d0b7fff757e1a947076829
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/RepeatLimitTypePickerDialog.kt
@@ -0,0 +1,106 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.annotation.SuppressLint
+import android.app.Activity
+import android.app.DatePickerDialog
+import android.support.v7.app.AlertDialog
+import android.view.View
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.seconds
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.helpers.getNowSeconds
+import com.simplemobiletools.commons.extensions.getDialogTheme
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.extensions.value
+import com.simplemobiletools.commons.helpers.isLollipopPlus
+import kotlinx.android.synthetic.main.dialog_repeat_limit_type_picker.view.*
+import org.joda.time.DateTime
+import java.util.*
+
+class RepeatLimitTypePickerDialog(val activity: Activity, var repeatLimit: Int, val startTS: Int, val callback: (repeatLimit: Int) -> Unit) {
+    lateinit var dialog: AlertDialog
+    var view: View
+
+    init {
+        view = activity.layoutInflater.inflate(R.layout.dialog_repeat_limit_type_picker, null).apply {
+            repeat_type_date.setOnClickListener { showRepetitionLimitDialog() }
+            repeat_type_forever.setOnClickListener { callback(0); dialog.dismiss() }
+            repeat_type_count.setOnClickListener { dialog_radio_view.check(R.id.repeat_type_x_times) }
+        }
+
+        view.dialog_radio_view.check(getCheckedItem())
+
+        if (repeatLimit in 1..startTS)
+            repeatLimit = startTS
+
+        updateRepeatLimitText()
+
+        dialog = AlertDialog.Builder(activity)
+                .setPositiveButton(R.string.ok, { dialogInterface, i -> confirmRepetition() })
+                .setNegativeButton(R.string.cancel, null)
+                .create().apply {
+                    activity.setupDialogStuff(view, this) {
+                        activity.currentFocus?.clearFocus()
+                    }
+                }
+    }
+
+    private fun getCheckedItem() = when {
+        repeatLimit > 0 -> R.id.repeat_type_till_date
+        repeatLimit < 0 -> {
+            view.repeat_type_count.setText((-repeatLimit).toString())
+            R.id.repeat_type_x_times
+        }
+        else -> R.id.repeat_type_forever
+    }
+
+    private fun updateRepeatLimitText() {
+        if (repeatLimit <= 0)
+            repeatLimit = getNowSeconds()
+
+        val repeatLimitDateTime = Formatter.getDateTimeFromTS(repeatLimit)
+        view.repeat_type_date.text = Formatter.getFullDate(activity, repeatLimitDateTime)
+    }
+
+    private fun confirmRepetition() {
+        when (view.dialog_radio_view.checkedRadioButtonId) {
+            R.id.repeat_type_till_date -> callback(repeatLimit)
+            R.id.repeat_type_forever -> callback(0)
+            else -> {
+                var count = view.repeat_type_count.value
+                count = if (count.isEmpty()) {
+                    "0"
+                } else {
+                    "-$count"
+                }
+                callback(count.toInt())
+            }
+        }
+        dialog.dismiss()
+    }
+
+    @SuppressLint("NewApi")
+    private fun showRepetitionLimitDialog() {
+        val repeatLimitDateTime = Formatter.getDateTimeFromTS(if (repeatLimit != 0) repeatLimit else getNowSeconds())
+        val datepicker = DatePickerDialog(activity, activity.getDialogTheme(), repetitionLimitDateSetListener, repeatLimitDateTime.year,
+                repeatLimitDateTime.monthOfYear - 1, repeatLimitDateTime.dayOfMonth)
+
+        if (isLollipopPlus()) {
+            datepicker.datePicker.firstDayOfWeek = if (activity.config.isSundayFirst) Calendar.SUNDAY else Calendar.MONDAY
+        }
+
+        datepicker.show()
+    }
+
+    private val repetitionLimitDateSetListener = DatePickerDialog.OnDateSetListener { v, year, monthOfYear, dayOfMonth ->
+        val repeatLimitDateTime = DateTime().withDate(year, monthOfYear + 1, dayOfMonth).withTime(23, 59, 59, 0)
+        repeatLimit = if (repeatLimitDateTime.seconds() < startTS) {
+            0
+        } else {
+            repeatLimitDateTime.seconds()
+        }
+        callback(repeatLimit)
+        dialog.dismiss()
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/RepeatRuleWeeklyDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/RepeatRuleWeeklyDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b6d3039903823a67a413bc4ac1c149aa99611840
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/RepeatRuleWeeklyDialog.kt
@@ -0,0 +1,57 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.app.Activity
+import android.support.v7.app.AlertDialog
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.views.MyAppCompatCheckbox
+import kotlinx.android.synthetic.main.dialog_vertical_linear_layout.view.*
+import java.util.*
+
+class RepeatRuleWeeklyDialog(val activity: Activity, val curRepeatRule: Int, val callback: (repeatRule: Int) -> Unit) {
+    val dialog: AlertDialog
+    val view = activity.layoutInflater.inflate(R.layout.dialog_vertical_linear_layout, null)
+
+    init {
+        val days = activity.resources.getStringArray(R.array.week_days)
+        val checkboxes = ArrayList<MyAppCompatCheckbox>(7)
+        for (i in 0..6) {
+            val pow = Math.pow(2.0, i.toDouble()).toInt()
+            (activity.layoutInflater.inflate(R.layout.my_checkbox, null) as MyAppCompatCheckbox).apply {
+                isChecked = curRepeatRule and pow != 0
+                text = days[i]
+                id = pow
+                checkboxes.add(this)
+            }
+        }
+
+        if (activity.config.isSundayFirst) {
+            checkboxes.add(0, checkboxes.removeAt(6))
+        }
+
+        checkboxes.forEach {
+            view.dialog_vertical_linear_layout.addView(it)
+        }
+
+        dialog = AlertDialog.Builder(activity)
+                .setPositiveButton(R.string.ok, { dialog, which -> callback(getRepeatRuleSum()) })
+                .setNegativeButton(R.string.cancel, null)
+                .create().apply {
+                    activity.setupDialogStuff(view, this)
+                }
+    }
+
+    private fun getRepeatRuleSum(): Int {
+        var sum = 0
+        val cnt = view.dialog_vertical_linear_layout.childCount
+        for (i in 0 until cnt) {
+            val child = view.dialog_vertical_linear_layout.getChildAt(i)
+            if (child is MyAppCompatCheckbox) {
+                if (child.isChecked)
+                    sum += child.id
+            }
+        }
+        return sum
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectCalendarsDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectCalendarsDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..44b9915e1ccdb1390f65664deb639e600916c88e
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectCalendarsDialog.kt
@@ -0,0 +1,79 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.support.v7.app.AlertDialog
+import android.support.v7.widget.SwitchCompat
+import android.text.TextUtils
+import android.view.ViewGroup
+import android.widget.RelativeLayout
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.helpers.CalDAVHandler
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import kotlinx.android.synthetic.main.calendar_item_account.view.*
+import kotlinx.android.synthetic.main.calendar_item_calendar.view.*
+import kotlinx.android.synthetic.main.dialog_select_calendars.view.*
+
+class SelectCalendarsDialog(val activity: SimpleActivity, val callback: () -> Unit) {
+    var prevAccount = ""
+    var dialog: AlertDialog
+    var view = (activity.layoutInflater.inflate(R.layout.dialog_select_calendars, null) as ViewGroup)
+
+    init {
+        val ids = activity.config.getSyncedCalendarIdsAsList()
+        val calendars = CalDAVHandler(activity.applicationContext).getCalDAVCalendars(activity)
+        val sorted = calendars.sortedWith(compareBy({ it.accountName }, { it.displayName }))
+        sorted.forEach {
+            if (prevAccount != it.accountName) {
+                prevAccount = it.accountName
+                addCalendarItem(false, it.accountName)
+            }
+
+            addCalendarItem(true, it.displayName, it.id, ids.contains(it.id.toString()))
+        }
+
+        dialog = AlertDialog.Builder(activity)
+                .setPositiveButton(R.string.ok, { dialogInterface, i -> confirmSelection() })
+                .setNegativeButton(R.string.cancel, null)
+                .create().apply {
+                    activity.setupDialogStuff(view, this, R.string.select_caldav_calendars)
+                }
+    }
+
+    private fun addCalendarItem(isEvent: Boolean, text: String, tag: Int = 0, shouldCheck: Boolean = false) {
+        val calendarItem = activity.layoutInflater.inflate(if (isEvent) R.layout.calendar_item_calendar else R.layout.calendar_item_account,
+                view.dialog_select_calendars_holder, false)
+
+        if (isEvent) {
+            calendarItem.calendar_item_calendar_switch.apply {
+                this.tag = tag
+                this.text = text
+                isChecked = shouldCheck
+                calendarItem.setOnClickListener {
+                    toggle()
+                }
+            }
+        } else {
+            calendarItem.calendar_item_account.text = text
+        }
+
+        view.dialog_select_calendars_holder.addView(calendarItem)
+    }
+
+    private fun confirmSelection() {
+        val calendarIDs = ArrayList<Int>()
+        val childCnt = view.dialog_select_calendars_holder.childCount
+        for (i in 0..childCnt) {
+            val child = view.dialog_select_calendars_holder.getChildAt(i)
+            if (child is RelativeLayout) {
+                val check = child.getChildAt(0)
+                if (check is SwitchCompat && check.isChecked) {
+                    calendarIDs.add(check.tag as Int)
+                }
+            }
+        }
+
+        activity.config.caldavSyncedCalendarIDs = TextUtils.join(",", calendarIDs)
+        callback()
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectEventCalendarDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectEventCalendarDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c8d175f49126cf86ff79b9f5ae933a26ad893db8
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectEventCalendarDialog.kt
@@ -0,0 +1,67 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.app.Activity
+import android.graphics.Color
+import android.support.v7.app.AlertDialog
+import android.view.ViewGroup
+import android.widget.RadioButton
+import android.widget.RadioGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.helpers.STORED_LOCALLY_ONLY
+import com.simplemobiletools.calendar.models.CalDAVCalendar
+import com.simplemobiletools.commons.extensions.setFillWithStroke
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.extensions.updateTextColors
+import kotlinx.android.synthetic.main.dialog_select_radio_group.view.*
+import kotlinx.android.synthetic.main.radio_button_with_color.view.*
+
+class SelectEventCalendarDialog(val activity: Activity, val calendars: List<CalDAVCalendar>, val currCalendarId: Int, val callback: (id: Int) -> Unit) {
+    private val dialog: AlertDialog?
+    private val radioGroup: RadioGroup
+    private var wasInit = false
+
+    init {
+        val view = activity.layoutInflater.inflate(R.layout.dialog_select_radio_group, null) as ViewGroup
+        radioGroup = view.dialog_radio_group
+
+        activity.dbHelper.getEventTypes {
+            activity.runOnUiThread {
+                calendars.forEach {
+                    addRadioButton(it.getFullTitle(), it.id, it.color)
+                }
+                addRadioButton(activity.getString(R.string.store_locally_only), STORED_LOCALLY_ONLY, Color.TRANSPARENT)
+                wasInit = true
+                activity.updateTextColors(view.dialog_radio_holder)
+            }
+        }
+
+        dialog = AlertDialog.Builder(activity)
+                .create().apply {
+                    activity.setupDialogStuff(view, this)
+                }
+    }
+
+    private fun addRadioButton(title: String, typeId: Int, color: Int) {
+        val view = activity.layoutInflater.inflate(R.layout.radio_button_with_color, null)
+        (view.dialog_radio_button as RadioButton).apply {
+            text = title
+            isChecked = typeId == currCalendarId
+            id = typeId
+        }
+
+        if (color != Color.TRANSPARENT)
+            view.dialog_radio_color.setFillWithStroke(color, activity.config.backgroundColor)
+
+        view.setOnClickListener { viewClicked(typeId) }
+        radioGroup.addView(view, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
+    }
+
+    private fun viewClicked(typeId: Int) {
+        if (wasInit) {
+            callback(typeId)
+            dialog?.dismiss()
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectEventTypeColorDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectEventTypeColorDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c67c69ab06f39775d0f7aa93b3e742dd2b2cddac
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectEventTypeColorDialog.kt
@@ -0,0 +1,61 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.app.Activity
+import android.graphics.Color
+import android.support.v7.app.AlertDialog
+import android.view.ViewGroup
+import android.widget.RadioButton
+import android.widget.RadioGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.helpers.CalDAVHandler
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.commons.extensions.setFillWithStroke
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import kotlinx.android.synthetic.main.dialog_select_radio_group.view.*
+import kotlinx.android.synthetic.main.radio_button_with_color.view.*
+
+class SelectEventTypeColorDialog(val activity: Activity, val eventType: EventType, val callback: (color: Int) -> Unit) {
+    private val dialog: AlertDialog?
+    private val radioGroup: RadioGroup
+    private var wasInit = false
+    private val colors = CalDAVHandler(activity.applicationContext).getAvailableCalDAVCalendarColors(eventType)
+
+    init {
+        val view = activity.layoutInflater.inflate(R.layout.dialog_select_radio_group, null) as ViewGroup
+        radioGroup = view.dialog_radio_group
+
+        colors.forEachIndexed { index, value ->
+            addRadioButton(index, value)
+        }
+
+        wasInit = true
+        dialog = AlertDialog.Builder(activity)
+                .create().apply {
+                    activity.setupDialogStuff(view, this)
+                }
+    }
+
+    private fun addRadioButton(colorKey: Int, color: Int) {
+        val view = activity.layoutInflater.inflate(R.layout.radio_button_with_color, null)
+        (view.dialog_radio_button as RadioButton).apply {
+            text = String.format("#%06X", 0xFFFFFF and color)
+            isChecked = color == eventType.color
+            id = colorKey
+        }
+
+        if (color != Color.TRANSPARENT)
+            view.dialog_radio_color.setFillWithStroke(color, activity.config.backgroundColor)
+
+        view.setOnClickListener { viewClicked(colorKey) }
+        radioGroup.addView(view, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
+    }
+
+    private fun viewClicked(colorKey: Int) {
+        if (!wasInit)
+            return
+
+        callback(colors[colorKey])
+        dialog?.dismiss()
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectEventTypeDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectEventTypeDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..047f3d9b893fba41c519806fa39ecca7cc6dba1f
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/SelectEventTypeDialog.kt
@@ -0,0 +1,85 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.app.Activity
+import android.graphics.Color
+import android.support.v7.app.AlertDialog
+import android.view.ViewGroup
+import android.widget.RadioGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.commons.extensions.hideKeyboard
+import com.simplemobiletools.commons.extensions.setFillWithStroke
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import com.simplemobiletools.commons.extensions.updateTextColors
+import com.simplemobiletools.commons.views.MyCompatRadioButton
+import kotlinx.android.synthetic.main.dialog_select_radio_group.view.*
+import kotlinx.android.synthetic.main.radio_button_with_color.view.*
+import java.util.*
+
+class SelectEventTypeDialog(val activity: Activity, val currEventType: Int, val showCalDAVCalendars: Boolean,
+                            val callback: (eventType: EventType) -> Unit) {
+    private val NEW_TYPE_ID = -2
+
+    private val dialog: AlertDialog?
+    private val radioGroup: RadioGroup
+    private var wasInit = false
+    private var eventTypes = ArrayList<EventType>()
+
+    init {
+        val view = activity.layoutInflater.inflate(R.layout.dialog_select_radio_group, null) as ViewGroup
+        radioGroup = view.dialog_radio_group
+
+        activity.dbHelper.getEventTypes {
+            eventTypes = it
+            activity.runOnUiThread {
+                eventTypes.filter { showCalDAVCalendars || it.caldavCalendarId == 0 }.forEach {
+                    addRadioButton(it)
+                }
+                val newEventType = EventType(NEW_TYPE_ID, activity.getString(R.string.add_new_type), Color.TRANSPARENT, 0)
+                addRadioButton(newEventType)
+                wasInit = true
+                activity.updateTextColors(view.dialog_radio_holder)
+            }
+        }
+
+        dialog = AlertDialog.Builder(activity)
+                .create().apply {
+                    activity.setupDialogStuff(view, this)
+                }
+    }
+
+    private fun addRadioButton(eventType: EventType) {
+        val view = activity.layoutInflater.inflate(R.layout.radio_button_with_color, null)
+        (view.dialog_radio_button as MyCompatRadioButton).apply {
+            text = eventType.getDisplayTitle()
+            isChecked = eventType.id == currEventType
+            id = eventType.id
+        }
+
+        if (eventType.color != Color.TRANSPARENT) {
+            view.dialog_radio_color.setFillWithStroke(eventType.color, activity.config.backgroundColor)
+        }
+
+        view.setOnClickListener { viewClicked(eventType) }
+        radioGroup.addView(view, RadioGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT))
+    }
+
+    private fun viewClicked(eventType: EventType) {
+        if (!wasInit) {
+            return
+        }
+
+        if (eventType.id == NEW_TYPE_ID) {
+            UpdateEventTypeDialog(activity) {
+                callback(it)
+                activity.hideKeyboard()
+                dialog?.dismiss()
+            }
+        } else {
+            callback(eventType)
+            dialog?.dismiss()
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/UpdateEventTypeDialog.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/UpdateEventTypeDialog.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5fcecafd5edf3efae4abdd78090ed801dd566177
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/dialogs/UpdateEventTypeDialog.kt
@@ -0,0 +1,86 @@
+package com.simplemobiletools.calendar.dialogs
+
+import android.app.Activity
+import android.support.v7.app.AlertDialog
+import android.widget.ImageView
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.commons.dialogs.ColorPickerDialog
+import com.simplemobiletools.commons.extensions.*
+import kotlinx.android.synthetic.main.dialog_event_type.view.*
+
+class UpdateEventTypeDialog(val activity: Activity, var eventType: EventType? = null, val callback: (eventType: EventType) -> Unit) {
+    var isNewEvent = eventType == null
+
+    init {
+        if (eventType == null)
+            eventType = EventType(0, "", activity.config.primaryColor)
+
+        val view = activity.layoutInflater.inflate(R.layout.dialog_event_type, null).apply {
+            setupColor(type_color)
+            type_title.setText(eventType!!.title)
+            type_color.setOnClickListener {
+                if (eventType?.caldavCalendarId == 0) {
+                    ColorPickerDialog(activity, eventType!!.color) { wasPositivePressed, color ->
+                        if (wasPositivePressed) {
+                            eventType!!.color = color
+                            setupColor(type_color)
+                        }
+                    }
+                } else {
+                    SelectEventTypeColorDialog(activity, eventType!!) {
+                        eventType!!.color = it
+                        setupColor(type_color)
+                    }
+                }
+            }
+        }
+
+        AlertDialog.Builder(activity)
+                .setPositiveButton(R.string.ok, null)
+                .setNegativeButton(R.string.cancel, null)
+                .create().apply {
+                    activity.setupDialogStuff(view, this, if (isNewEvent) R.string.add_new_type else R.string.edit_type) {
+                        showKeyboard(view.type_title)
+                        getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener {
+                            val title = view.type_title.value
+                            val eventIdWithTitle = activity.dbHelper.getEventTypeIdWithTitle(title)
+                            var isEventTypeTitleTaken = isNewEvent && eventIdWithTitle != -1
+                            if (!isEventTypeTitleTaken)
+                                isEventTypeTitleTaken = !isNewEvent && eventType!!.id != eventIdWithTitle && eventIdWithTitle != -1
+
+                            if (title.isEmpty()) {
+                                activity.toast(R.string.title_empty)
+                                return@setOnClickListener
+                            } else if (isEventTypeTitleTaken) {
+                                activity.toast(R.string.type_already_exists)
+                                return@setOnClickListener
+                            }
+
+                            eventType!!.title = title
+                            if (eventType!!.caldavCalendarId != 0)
+                                eventType!!.caldavDisplayName = title
+
+                            eventType!!.id = if (isNewEvent) {
+                                activity.dbHelper.insertEventType(eventType!!)
+                            } else {
+                                activity.dbHelper.updateEventType(eventType!!)
+                            }
+
+                            if (eventType!!.id != -1) {
+                                dismiss()
+                                callback(eventType!!)
+                            } else {
+                                activity.toast(R.string.editing_calendar_failed)
+                            }
+                        }
+                    }
+                }
+    }
+
+    private fun setupColor(view: ImageView) {
+        view.setFillWithStroke(eventType!!.color, activity.config.backgroundColor)
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Activity.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Activity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..600770afb538d9522bca18593ed9de6c4b17dbb6
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Activity.kt
@@ -0,0 +1,79 @@
+package com.simplemobiletools.calendar.extensions
+
+import android.app.Activity
+import com.simplemobiletools.calendar.BuildConfig
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.dialogs.CustomEventRepeatIntervalDialog
+import com.simplemobiletools.calendar.helpers.*
+import com.simplemobiletools.commons.activities.BaseSimpleActivity
+import com.simplemobiletools.commons.dialogs.RadioGroupDialog
+import com.simplemobiletools.commons.extensions.hideKeyboard
+import com.simplemobiletools.commons.extensions.sharePathIntent
+import com.simplemobiletools.commons.extensions.toast
+import com.simplemobiletools.commons.models.RadioItem
+import java.io.File
+import java.util.TreeSet
+import kotlin.collections.ArrayList
+
+fun BaseSimpleActivity.shareEvents(ids: List<Int>) {
+    val file = getTempFile()
+    if (file == null) {
+        toast(R.string.unknown_error_occurred)
+        return
+    }
+
+    val events = dbHelper.getEventsWithIds(ids)
+    IcsExporter().exportEvents(this, file, events, false) {
+        if (it == IcsExporter.ExportResult.EXPORT_OK) {
+            sharePathIntent(file.absolutePath, BuildConfig.APPLICATION_ID)
+        }
+    }
+}
+
+fun BaseSimpleActivity.getTempFile(): File? {
+    val folder = File(cacheDir, "events")
+    if (!folder.exists()) {
+        if (!folder.mkdir()) {
+            toast(R.string.unknown_error_occurred)
+            return null
+        }
+    }
+
+    return File(folder, "events.ics")
+}
+
+fun Activity.showEventRepeatIntervalDialog(curSeconds: Int, callback: (minutes: Int) -> Unit) {
+    hideKeyboard()
+    val seconds = TreeSet<Int>()
+    seconds.apply {
+        add(0)
+        add(DAY)
+        add(WEEK)
+        add(MONTH)
+        add(YEAR)
+        add(curSeconds)
+    }
+
+    val items = ArrayList<RadioItem>(seconds.size + 1)
+    seconds.mapIndexedTo(items, { index, value ->
+        RadioItem(index, getRepetitionText(value), value)
+    })
+
+    var selectedIndex = 0
+    seconds.forEachIndexed { index, value ->
+        if (value == curSeconds)
+            selectedIndex = index
+    }
+
+    items.add(RadioItem(-1, getString(R.string.custom)))
+
+    RadioGroupDialog(this, items, selectedIndex) {
+        if (it == -1) {
+            CustomEventRepeatIntervalDialog(this) {
+                callback(it)
+            }
+        } else {
+            callback(it as Int)
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Context.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Context.kt
new file mode 100644
index 0000000000000000000000000000000000000000..fe939f06d0dca885353c65186453c0dd0ad366e8
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Context.kt
@@ -0,0 +1,417 @@
+package com.simplemobiletools.calendar.extensions
+
+import android.accounts.Account
+import android.annotation.SuppressLint
+import android.app.*
+import android.appwidget.AppWidgetManager
+import android.content.ComponentName
+import android.content.ContentResolver
+import android.content.Context
+import android.content.Intent
+import android.content.res.Resources
+import android.database.ContentObserver
+import android.media.AudioAttributes
+import android.media.AudioManager
+import android.net.Uri
+import android.os.Bundle
+import android.provider.CalendarContract
+import android.support.v4.app.AlarmManagerCompat
+import android.support.v4.app.NotificationCompat
+import android.view.Gravity
+import android.view.View
+import android.view.ViewGroup
+import android.widget.LinearLayout
+import android.widget.TextView
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.EventActivity
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.activities.SnoozeReminderActivity
+import com.simplemobiletools.calendar.helpers.*
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.models.*
+import com.simplemobiletools.calendar.receivers.CalDAVSyncReceiver
+import com.simplemobiletools.calendar.receivers.NotificationReceiver
+import com.simplemobiletools.calendar.services.SnoozeService
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.DAY_SECONDS
+import com.simplemobiletools.commons.helpers.SILENT
+import com.simplemobiletools.commons.helpers.YEAR_SECONDS
+import com.simplemobiletools.commons.helpers.isOreoPlus
+import org.joda.time.DateTime
+import org.joda.time.DateTimeZone
+import org.joda.time.LocalDate
+import java.text.SimpleDateFormat
+import java.util.*
+
+val Context.config: Config get() = Config.newInstance(applicationContext)
+
+val Context.dbHelper: DBHelper get() = DBHelper.newInstance(applicationContext)
+
+fun Context.updateWidgets() {
+    val widgetIDs = AppWidgetManager.getInstance(applicationContext).getAppWidgetIds(ComponentName(applicationContext, MyWidgetMonthlyProvider::class.java))
+    if (widgetIDs.isNotEmpty()) {
+        Intent(applicationContext, MyWidgetMonthlyProvider::class.java).apply {
+            action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
+            putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIDs)
+            sendBroadcast(this)
+        }
+    }
+
+    updateListWidget()
+}
+
+fun Context.updateListWidget() {
+    val widgetIDs = AppWidgetManager.getInstance(applicationContext).getAppWidgetIds(ComponentName(applicationContext, MyWidgetListProvider::class.java))
+    if (widgetIDs.isNotEmpty()) {
+        Intent(applicationContext, MyWidgetListProvider::class.java).apply {
+            action = AppWidgetManager.ACTION_APPWIDGET_UPDATE
+            putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, widgetIDs)
+            sendBroadcast(this)
+        }
+    }
+}
+
+fun Context.scheduleAllEvents() {
+    val events = dbHelper.getEventsAtReboot()
+    events.forEach {
+        scheduleNextEventReminder(it, dbHelper)
+    }
+}
+
+fun Context.scheduleNextEventReminder(event: Event?, dbHelper: DBHelper) {
+    if (event == null || event.getReminders().isEmpty()) {
+        return
+    }
+
+    val now = getNowSeconds()
+    val reminderSeconds = event.getReminders().reversed().map { it * 60 }
+    dbHelper.getEvents(now, now + YEAR, event.id) {
+        if (it.isNotEmpty()) {
+            for (curEvent in it) {
+                for (curReminder in reminderSeconds) {
+                    if (curEvent.getEventStartTS() - curReminder > now) {
+                        scheduleEventIn((curEvent.getEventStartTS() - curReminder) * 1000L, curEvent)
+                        return@getEvents
+                    }
+                }
+            }
+        }
+    }
+}
+
+fun Context.scheduleEventIn(notifTS: Long, event: Event) {
+    if (notifTS < System.currentTimeMillis()) {
+        return
+    }
+
+    val pendingIntent = getNotificationIntent(applicationContext, event)
+    val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
+    AlarmManagerCompat.setExactAndAllowWhileIdle(alarmManager, AlarmManager.RTC_WAKEUP, notifTS, pendingIntent)
+}
+
+fun Context.cancelNotification(id: Int) {
+    val intent = Intent(applicationContext, NotificationReceiver::class.java)
+    PendingIntent.getBroadcast(applicationContext, id, intent, PendingIntent.FLAG_UPDATE_CURRENT).cancel()
+}
+
+private fun getNotificationIntent(context: Context, event: Event): PendingIntent {
+    val intent = Intent(context, NotificationReceiver::class.java)
+    intent.putExtra(EVENT_ID, event.id)
+    intent.putExtra(EVENT_OCCURRENCE_TS, event.startTS)
+    return PendingIntent.getBroadcast(context, event.id, intent, PendingIntent.FLAG_UPDATE_CURRENT)
+}
+
+fun Context.getRepetitionText(seconds: Int) = when (seconds) {
+    0 -> getString(R.string.no_repetition)
+    DAY -> getString(R.string.daily)
+    WEEK -> getString(R.string.weekly)
+    MONTH -> getString(R.string.monthly)
+    YEAR -> getString(R.string.yearly)
+    else -> {
+        when {
+            seconds % YEAR == 0 -> resources.getQuantityString(R.plurals.years, seconds / YEAR, seconds / YEAR)
+            seconds % MONTH == 0 -> resources.getQuantityString(R.plurals.months, seconds / MONTH, seconds / MONTH)
+            seconds % WEEK == 0 -> resources.getQuantityString(R.plurals.weeks, seconds / WEEK, seconds / WEEK)
+            else -> resources.getQuantityString(R.plurals.days, seconds / DAY, seconds / DAY)
+        }
+    }
+}
+
+fun Context.getFilteredEvents(events: List<Event>): ArrayList<Event> {
+    val displayEventTypes = config.displayEventTypes
+    return events.filter { displayEventTypes.contains(it.eventType.toString()) } as ArrayList<Event>
+}
+
+fun Context.notifyRunningEvents() {
+    dbHelper.getRunningEvents().forEach { notifyEvent(it) }
+}
+
+fun Context.notifyEvent(originalEvent: Event) {
+    var event = originalEvent.copy()
+    val currentSeconds = getNowSeconds()
+
+    // make sure refer to the proper repeatable event instance with "Tomorrow", or the specific date
+    if (event.repeatInterval != 0 && event.startTS - event.reminder1Minutes * 60 < currentSeconds) {
+        val events = dbHelper.getRepeatableEventsFor(currentSeconds - DAY_SECONDS, currentSeconds + YEAR_SECONDS, event.id)
+        for (currEvent in events) {
+            event = currEvent
+            if (event.startTS - event.reminder1Minutes * 60 > currentSeconds) {
+                break
+            }
+        }
+    }
+
+    val pendingIntent = getPendingIntent(applicationContext, event)
+    val startTime = Formatter.getTimeFromTS(applicationContext, event.startTS)
+    val endTime = Formatter.getTimeFromTS(applicationContext, event.endTS)
+    val startDate = Formatter.getDateFromTS(event.startTS)
+
+    val displayedStartDate = when (startDate) {
+        LocalDate.now() -> ""
+        LocalDate.now().plusDays(1) -> getString(R.string.tomorrow)
+        else -> "${Formatter.getDateFromCode(this, Formatter.getDayCodeFromTS(event.startTS))},"
+    }
+
+    val timeRange = if (event.getIsAllDay()) getString(R.string.all_day) else getFormattedEventTime(startTime, endTime)
+    val descriptionOrLocation = if (config.replaceDescription) event.location else event.description
+    val content = "$displayedStartDate $timeRange $descriptionOrLocation".trim()
+    val notification = getNotification(pendingIntent, event, content)
+    val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+    notificationManager.notify(event.id, notification)
+}
+
+@SuppressLint("NewApi")
+fun Context.getNotification(pendingIntent: PendingIntent, event: Event, content: String, publicVersion: Boolean = false): Notification {
+    var soundUri = config.reminderSoundUri
+    if (soundUri == SILENT) {
+        soundUri = ""
+    } else {
+        grantReadUriPermission(soundUri)
+    }
+
+    val channelId = "my_reminder_channel_$soundUri"
+    if (isOreoPlus()) {
+        val audioAttributes = AudioAttributes.Builder()
+                .setUsage(AudioAttributes.USAGE_NOTIFICATION)
+                .setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
+                .setLegacyStreamType(AudioManager.STREAM_NOTIFICATION)
+                .setFlags(AudioAttributes.FLAG_AUDIBILITY_ENFORCED)
+                .build()
+
+        val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+        val name = resources.getString(R.string.event_reminders)
+        val importance = NotificationManager.IMPORTANCE_HIGH
+        NotificationChannel(channelId, name, importance).apply {
+            enableLights(true)
+            lightColor = event.color
+            enableVibration(false)
+            setSound(Uri.parse(soundUri), audioAttributes)
+            notificationManager.createNotificationChannel(this)
+        }
+    }
+
+    val contentTitle = if (publicVersion) resources.getString(R.string.app_name) else event.title
+    val contentText = if (publicVersion) resources.getString(R.string.public_event_notification_text) else content
+
+    val builder = NotificationCompat.Builder(this)
+            .setContentTitle(contentTitle)
+            .setContentText(contentText)
+            .setSmallIcon(R.drawable.ic_calendar)
+            .setContentIntent(pendingIntent)
+            .setPriority(Notification.PRIORITY_HIGH)
+            .setDefaults(Notification.DEFAULT_LIGHTS)
+            .setAutoCancel(true)
+            .setSound(Uri.parse(soundUri), AudioManager.STREAM_NOTIFICATION)
+            .setChannelId(channelId)
+            .addAction(R.drawable.ic_snooze, getString(R.string.snooze), getSnoozePendingIntent(this, event))
+
+    if (config.vibrateOnReminder) {
+        val vibrateArray = LongArray(2) { 500 }
+        builder.setVibrate(vibrateArray)
+    }
+
+    if (!publicVersion) {
+        builder.setPublicVersion(getNotification(pendingIntent, event, content, true))
+    }
+
+    val notification = builder.build()
+    if (config.loopReminders) {
+        notification.flags = notification.flags or Notification.FLAG_INSISTENT
+    }
+    return notification
+}
+
+private fun getFormattedEventTime(startTime: String, endTime: String) = if (startTime == endTime) startTime else "$startTime \u2013 $endTime"
+
+private fun getPendingIntent(context: Context, event: Event): PendingIntent {
+    val intent = Intent(context, EventActivity::class.java)
+    intent.putExtra(EVENT_ID, event.id)
+    intent.putExtra(EVENT_OCCURRENCE_TS, event.startTS)
+    return PendingIntent.getActivity(context, event.id, intent, PendingIntent.FLAG_UPDATE_CURRENT)
+}
+
+private fun getSnoozePendingIntent(context: Context, event: Event): PendingIntent {
+    val snoozeClass = if (context.config.useSameSnooze) SnoozeService::class.java else SnoozeReminderActivity::class.java
+    val intent = Intent(context, snoozeClass).setAction("Snooze")
+    intent.putExtra(EVENT_ID, event.id)
+    return if (context.config.useSameSnooze) {
+        PendingIntent.getService(context, event.id, intent, PendingIntent.FLAG_UPDATE_CURRENT)
+    } else {
+        PendingIntent.getActivity(context, event.id, intent, PendingIntent.FLAG_UPDATE_CURRENT)
+    }
+}
+
+fun Context.rescheduleReminder(event: Event?, minutes: Int) {
+    if (event != null) {
+        applicationContext.scheduleEventIn(System.currentTimeMillis() + minutes * 60000, event)
+        val manager = applicationContext.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+        manager.cancel(event.id)
+    }
+}
+
+fun Context.launchNewEventIntent(dayCode: String = Formatter.getTodayCode(this)) {
+    Intent(applicationContext, EventActivity::class.java).apply {
+        putExtra(NEW_EVENT_START_TS, getNewEventTimestampFromCode(dayCode))
+        addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+        startActivity(this)
+    }
+}
+
+fun Context.getNewEventTimestampFromCode(dayCode: String): Int {
+    val currHour = DateTime(System.currentTimeMillis(), DateTimeZone.getDefault()).hourOfDay
+    val dateTime = Formatter.getLocalDateTimeFromCode(dayCode).withHourOfDay(currHour)
+    val newDateTime = dateTime.plusHours(1).withMinuteOfHour(0).withSecondOfMinute(0).withMillisOfSecond(0)
+    // make sure the date doesn't change
+    return newDateTime.withDate(dateTime.year, dateTime.monthOfYear, dateTime.dayOfMonth).seconds()
+}
+
+fun Context.getCurrentOffset() = SimpleDateFormat("Z", Locale.getDefault()).format(Date())
+
+fun Context.getSyncedCalDAVCalendars() = CalDAVHandler(applicationContext).getCalDAVCalendars(null, config.caldavSyncedCalendarIDs)
+
+fun Context.recheckCalDAVCalendars(callback: () -> Unit) {
+    if (config.caldavSync) {
+        Thread {
+            CalDAVHandler(applicationContext).refreshCalendars(null, callback)
+            updateWidgets()
+        }.start()
+    }
+}
+
+fun Context.scheduleCalDAVSync(activate: Boolean) {
+    val syncIntent = Intent(applicationContext, CalDAVSyncReceiver::class.java)
+    val pendingIntent = PendingIntent.getBroadcast(applicationContext, 0, syncIntent, PendingIntent.FLAG_UPDATE_CURRENT)
+    val alarm = getSystemService(Context.ALARM_SERVICE) as AlarmManager
+
+    if (activate) {
+        val syncCheckInterval = 4 * AlarmManager.INTERVAL_HOUR
+        try {
+            alarm.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + syncCheckInterval, syncCheckInterval, pendingIntent)
+        } catch (ignored: SecurityException) {
+        }
+    } else {
+        alarm.cancel(pendingIntent)
+    }
+}
+
+fun Context.syncCalDAVCalendars(activity: SimpleActivity?, calDAVSyncObserver: ContentObserver) {
+    Thread {
+        val uri = CalendarContract.Calendars.CONTENT_URI
+        contentResolver.unregisterContentObserver(calDAVSyncObserver)
+        contentResolver.registerContentObserver(uri, false, calDAVSyncObserver)
+
+        val accounts = HashSet<Account>()
+        val calendars = CalDAVHandler(applicationContext).getCalDAVCalendars(activity, config.caldavSyncedCalendarIDs)
+        calendars.forEach {
+            accounts.add(Account(it.accountName, it.accountType))
+        }
+
+        Bundle().apply {
+            putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true)
+            putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true)
+            accounts.forEach {
+                ContentResolver.requestSync(it, uri.authority, this)
+            }
+        }
+    }.start()
+}
+
+fun Context.addDayNumber(rawTextColor: Int, day: DayMonthly, linearLayout: LinearLayout, dayLabelHeight: Int, callback: (Int) -> Unit) {
+    var textColor = rawTextColor
+    if (!day.isThisMonth)
+        textColor = textColor.adjustAlpha(LOW_ALPHA)
+
+    (View.inflate(applicationContext, R.layout.day_monthly_number_view, null) as TextView).apply {
+        setTextColor(textColor)
+        text = day.value.toString()
+        gravity = Gravity.TOP or Gravity.CENTER_HORIZONTAL
+        layoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+        linearLayout.addView(this)
+
+        if (day.isToday) {
+            val primaryColor = getAdjustedPrimaryColor()
+            setTextColor(primaryColor.getContrastColor())
+            if (dayLabelHeight == 0) {
+                onGlobalLayout {
+                    val height = this@apply.height
+                    if (height > 0) {
+                        callback(height)
+                        addTodaysBackground(this, resources, height, primaryColor)
+                    }
+                }
+            } else {
+                addTodaysBackground(this, resources, dayLabelHeight, primaryColor)
+            }
+        }
+    }
+}
+
+private fun addTodaysBackground(textView: TextView, res: Resources, dayLabelHeight: Int, primaryColor: Int) =
+        textView.addResizedBackgroundDrawable(res, dayLabelHeight, primaryColor, R.drawable.ic_circle_filled)
+
+fun Context.addDayEvents(day: DayMonthly, linearLayout: LinearLayout, res: Resources, dividerMargin: Int) {
+    val eventLayoutParams = LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)
+
+    day.dayEvents.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title })).forEach {
+        val backgroundDrawable = res.getDrawable(R.drawable.day_monthly_event_background)
+        backgroundDrawable.applyColorFilter(it.color)
+        eventLayoutParams.setMargins(dividerMargin, 0, dividerMargin, dividerMargin)
+
+        var textColor = it.color.getContrastColor()
+        if (!day.isThisMonth) {
+            backgroundDrawable.alpha = 64
+            textColor = textColor.adjustAlpha(0.25f)
+        }
+
+        (View.inflate(applicationContext, R.layout.day_monthly_event_view, null) as TextView).apply {
+            setTextColor(textColor)
+            text = it.title.replace(" ", "\u00A0")  // allow word break by char
+            background = backgroundDrawable
+            layoutParams = eventLayoutParams
+            linearLayout.addView(this)
+        }
+    }
+}
+
+fun Context.getEventListItems(events: List<Event>): ArrayList<ListItem> {
+    val listItems = ArrayList<ListItem>(events.size)
+    val replaceDescription = config.replaceDescription
+    val sorted = events.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { if (replaceDescription) it.location else it.description }))
+    var prevCode = ""
+    val now = getNowSeconds()
+    val today = Formatter.getDayTitle(this, Formatter.getDayCodeFromTS(now))
+
+    sorted.forEach {
+        val code = Formatter.getDayCodeFromTS(it.startTS)
+        if (code != prevCode) {
+            val day = Formatter.getDayTitle(this, code)
+            val isToday = day == today
+            val listSection = ListSection(day, code, isToday, !isToday && it.startTS < now)
+            listItems.add(listSection)
+            prevCode = code
+        }
+        val listEvent = ListEvent(it.id, it.startTS, it.endTS, it.title, it.description, it.getIsAllDay(), it.color, it.location, it.isPastEvent)
+        listItems.add(listEvent)
+    }
+    return listItems
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/DateTime.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/DateTime.kt
new file mode 100644
index 0000000000000000000000000000000000000000..d0110f8cc38f3bef41a37fca226d8411239d4546
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/DateTime.kt
@@ -0,0 +1,5 @@
+package com.simplemobiletools.calendar.extensions
+
+import org.joda.time.DateTime
+
+fun DateTime.seconds() = (millis / 1000).toInt()
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Int.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Int.kt
new file mode 100644
index 0000000000000000000000000000000000000000..e26cf4d5e5a06dc76ec844b80602e168c03ba148
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/Int.kt
@@ -0,0 +1,19 @@
+package com.simplemobiletools.calendar.extensions
+
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.helpers.MONTH
+import com.simplemobiletools.calendar.helpers.WEEK
+import com.simplemobiletools.calendar.helpers.YEAR
+import com.simplemobiletools.calendar.models.Event
+
+fun Int.isTsOnProperDay(event: Event): Boolean {
+    val dateTime = Formatter.getDateTimeFromTS(this)
+    val power = Math.pow(2.0, (dateTime.dayOfWeek - 1).toDouble()).toInt()
+    return event.repeatRule and power != 0
+}
+
+fun Int.isXWeeklyRepetition() = this != 0 && this % WEEK == 0
+
+fun Int.isXMonthlyRepetition() = this != 0 && this % MONTH == 0
+
+fun Int.isXYearlyRepetition() = this != 0 && this % YEAR == 0
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/String.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/String.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c7da557916d9cde3059c8c6e755d127075aafa77
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/String.kt
@@ -0,0 +1,3 @@
+package com.simplemobiletools.calendar.extensions
+
+fun String.getMonthCode() = if (length == 8) substring(0, 6) else ""
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/TextView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/TextView.kt
new file mode 100644
index 0000000000000000000000000000000000000000..41f9a9a521b26377ff9d48679c774b7fd4789ae4
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/extensions/TextView.kt
@@ -0,0 +1,15 @@
+package com.simplemobiletools.calendar.extensions
+
+import android.content.res.Resources
+import android.graphics.Bitmap
+import android.graphics.drawable.BitmapDrawable
+import android.widget.TextView
+import com.simplemobiletools.commons.extensions.applyColorFilter
+
+fun TextView.addResizedBackgroundDrawable(res: Resources, drawableHeight: Int, primaryColor: Int, drawableId: Int) {
+    val baseDrawable = res.getDrawable(drawableId)
+    val bitmap = (baseDrawable as BitmapDrawable).bitmap
+    val scaledDrawable = BitmapDrawable(res, Bitmap.createScaledBitmap(bitmap, drawableHeight, drawableHeight, true))
+    scaledDrawable.applyColorFilter(primaryColor)
+    background = scaledDrawable
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/DayFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/DayFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..4e5e2e1460f1100978fef35b4e8330d1119883d5
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/DayFragment.kt
@@ -0,0 +1,151 @@
+package com.simplemobiletools.calendar.fragments
+
+import android.content.Intent
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.support.v7.app.AlertDialog
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.DatePicker
+import android.widget.RelativeLayout
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.EventActivity
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.adapters.DayEventsAdapter
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.getFilteredEvents
+import com.simplemobiletools.calendar.helpers.DAY_CODE
+import com.simplemobiletools.calendar.helpers.EVENT_ID
+import com.simplemobiletools.calendar.helpers.EVENT_OCCURRENCE_TS
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.interfaces.NavigationListener
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.commons.extensions.applyColorFilter
+import com.simplemobiletools.commons.extensions.getDialogTheme
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import kotlinx.android.synthetic.main.fragment_day.view.*
+import kotlinx.android.synthetic.main.top_navigation.view.*
+import org.joda.time.DateTime
+import java.util.*
+
+class DayFragment : Fragment() {
+    var mListener: NavigationListener? = null
+    private var mTextColor = 0
+    private var mDayCode = ""
+    private var lastHash = 0
+
+    lateinit var mHolder: RelativeLayout
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        val view = inflater.inflate(R.layout.fragment_day, container, false)
+        mHolder = view.day_holder
+
+        mDayCode = arguments!!.getString(DAY_CODE)
+        setupButtons()
+        return view
+    }
+
+    override fun onResume() {
+        super.onResume()
+        updateCalendar()
+    }
+
+    private fun setupButtons() {
+        mTextColor = context!!.config.textColor
+
+        mHolder.top_left_arrow.apply {
+            applyColorFilter(mTextColor)
+            background = null
+            setOnClickListener {
+                mListener?.goLeft()
+            }
+        }
+
+        mHolder.top_right_arrow.apply {
+            applyColorFilter(mTextColor)
+            background = null
+            setOnClickListener {
+                mListener?.goRight()
+            }
+        }
+
+        val day = Formatter.getDayTitle(context!!, mDayCode)
+        mHolder.top_value.apply {
+            text = day
+            setOnClickListener { pickDay() }
+            setTextColor(context.config.textColor)
+        }
+    }
+
+    private fun pickDay() {
+        activity!!.setTheme(context!!.getDialogTheme())
+        val view = layoutInflater.inflate(R.layout.date_picker, null)
+        val datePicker = view.findViewById<DatePicker>(R.id.date_picker)
+
+        val dateTime = Formatter.getDateTimeFromCode(mDayCode)
+        datePicker.init(dateTime.year, dateTime.monthOfYear - 1, dateTime.dayOfMonth, null)
+
+        AlertDialog.Builder(context!!)
+                .setNegativeButton(R.string.cancel, null)
+                .setPositiveButton(R.string.ok) { dialog, which -> positivePressed(dateTime, datePicker) }
+                .create().apply {
+                    activity?.setupDialogStuff(view, this)
+                }
+    }
+
+    private fun positivePressed(dateTime: DateTime, datePicker: DatePicker) {
+        val month = datePicker.month + 1
+        val year = datePicker.year
+        val day = datePicker.dayOfMonth
+        val newDateTime = dateTime.withDate(year, month, day)
+        mListener?.goToDateTime(newDateTime)
+    }
+
+    fun updateCalendar() {
+        val startTS = Formatter.getDayStartTS(mDayCode)
+        val endTS = Formatter.getDayEndTS(mDayCode)
+        context!!.dbHelper.getEvents(startTS, endTS) {
+            receivedEvents(it)
+        }
+    }
+
+    private fun receivedEvents(events: List<Event>) {
+        val filtered = context?.getFilteredEvents(events) ?: ArrayList()
+        val newHash = filtered.hashCode()
+        if (newHash == lastHash || !isAdded) {
+            return
+        }
+        lastHash = newHash
+
+        val replaceDescription = context!!.config.replaceDescription
+        val sorted = ArrayList<Event>(filtered.sortedWith(compareBy({ !it.getIsAllDay() }, { it.startTS }, { it.endTS }, { it.title }, {
+            if (replaceDescription) it.location else it.description
+        })))
+
+        activity?.runOnUiThread {
+            updateEvents(sorted)
+        }
+    }
+
+    private fun updateEvents(events: ArrayList<Event>) {
+        if (activity == null)
+            return
+
+        DayEventsAdapter(activity as SimpleActivity, events, mHolder.day_events) {
+            editEvent(it as Event)
+        }.apply {
+            addVerticalDividers(true)
+            mHolder.day_events.adapter = this
+        }
+    }
+
+    private fun editEvent(event: Event) {
+        Intent(context, EventActivity::class.java).apply {
+            putExtra(EVENT_ID, event.id)
+            putExtra(EVENT_OCCURRENCE_TS, event.startTS)
+            startActivity(this)
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/DayFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/DayFragmentsHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..4dbdf9cb84463569d4d86771119b2f696050b4ef
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/DayFragmentsHolder.kt
@@ -0,0 +1,112 @@
+package com.simplemobiletools.calendar.fragments
+
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.support.v4.view.ViewPager
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.MainActivity
+import com.simplemobiletools.calendar.adapters.MyDayPagerAdapter
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.helpers.DAY_CODE
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.interfaces.NavigationListener
+import com.simplemobiletools.commons.views.MyViewPager
+import kotlinx.android.synthetic.main.fragment_days_holder.view.*
+import org.joda.time.DateTime
+import java.util.*
+
+class DayFragmentsHolder : MyFragmentHolder(), NavigationListener {
+    private val PREFILLED_DAYS = 251
+
+    private var viewPager: MyViewPager? = null
+    private var defaultDailyPage = 0
+    private var todayDayCode = ""
+    private var currentDayCode = ""
+    private var isGoToTodayVisible = false
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        currentDayCode = arguments?.getString(DAY_CODE) ?: ""
+        todayDayCode = Formatter.getTodayCode(context!!)
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        val view = inflater.inflate(R.layout.fragment_days_holder, container, false)
+        view.background = ColorDrawable(context!!.config.backgroundColor)
+        viewPager = view.fragment_days_viewpager
+        viewPager!!.id = (System.currentTimeMillis() % 100000).toInt()
+        setupFragment()
+        return view
+    }
+
+    private fun setupFragment() {
+        val codes = getDays(currentDayCode)
+        val dailyAdapter = MyDayPagerAdapter(activity!!.supportFragmentManager, codes, this)
+        defaultDailyPage = codes.size / 2
+
+
+        viewPager!!.apply {
+            adapter = dailyAdapter
+            addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+                override fun onPageScrollStateChanged(state: Int) {
+                }
+
+                override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
+                }
+
+                override fun onPageSelected(position: Int) {
+                    currentDayCode = codes[position]
+                    val shouldGoToTodayBeVisible = shouldGoToTodayBeVisible()
+                    if (isGoToTodayVisible != shouldGoToTodayBeVisible) {
+                        (activity as? MainActivity)?.toggleGoToTodayVisibility(shouldGoToTodayBeVisible)
+                        isGoToTodayVisible = shouldGoToTodayBeVisible
+                    }
+                }
+            })
+            currentItem = defaultDailyPage
+        }
+        updateActionBarTitle()
+    }
+
+    private fun getDays(code: String): List<String> {
+        val days = ArrayList<String>(PREFILLED_DAYS)
+        val today = Formatter.getDateTimeFromCode(code)
+        for (i in -PREFILLED_DAYS / 2..PREFILLED_DAYS / 2) {
+            days.add(Formatter.getDayCodeFromDateTime(today.plusDays(i)))
+        }
+        return days
+    }
+
+    override fun goLeft() {
+        viewPager!!.currentItem = viewPager!!.currentItem - 1
+    }
+
+    override fun goRight() {
+        viewPager!!.currentItem = viewPager!!.currentItem + 1
+    }
+
+    override fun goToDateTime(dateTime: DateTime) {
+        currentDayCode = Formatter.getDayCodeFromDateTime(dateTime)
+        setupFragment()
+    }
+
+    override fun goToToday() {
+        currentDayCode = todayDayCode
+        setupFragment()
+    }
+
+    override fun refreshEvents() {
+        (viewPager?.adapter as? MyDayPagerAdapter)?.updateCalendars(viewPager?.currentItem ?: 0)
+    }
+
+    override fun shouldGoToTodayBeVisible() = currentDayCode != todayDayCode
+
+    override fun updateActionBarTitle() {
+        (activity as MainActivity).supportActionBar?.title = getString(R.string.app_launcher_name)
+    }
+
+    override fun getNewEventDayCode() = currentDayCode
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/EventListFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/EventListFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7df1f88a57df4056572ba4b4c34fd2591d80795b
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/EventListFragment.kt
@@ -0,0 +1,189 @@
+package com.simplemobiletools.calendar.fragments
+
+import android.content.Intent
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.EventActivity
+import com.simplemobiletools.calendar.activities.MainActivity
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.adapters.EventListAdapter
+import com.simplemobiletools.calendar.extensions.*
+import com.simplemobiletools.calendar.helpers.EVENT_ID
+import com.simplemobiletools.calendar.helpers.EVENT_OCCURRENCE_TS
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.calendar.models.ListEvent
+import com.simplemobiletools.commons.extensions.beGoneIf
+import com.simplemobiletools.commons.extensions.beVisibleIf
+import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
+import com.simplemobiletools.commons.extensions.underlineText
+import com.simplemobiletools.commons.helpers.MONTH_SECONDS
+import com.simplemobiletools.commons.interfaces.RefreshRecyclerViewListener
+import com.simplemobiletools.commons.views.MyRecyclerView
+import kotlinx.android.synthetic.main.fragment_event_list.view.*
+import org.joda.time.DateTime
+import java.util.*
+
+class EventListFragment : MyFragmentHolder(), RefreshRecyclerViewListener {
+    private var FETCH_INTERVAL = 6 * MONTH_SECONDS
+    private var MIN_EVENTS_TRESHOLD = 30
+
+    private var mEvents = ArrayList<Event>()
+    private var minFetchedTS = 0
+    private var maxFetchedTS = 0
+    private var wereInitialEventsAdded = false
+
+    private var use24HourFormat = false
+
+    lateinit var mView: View
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        mView = inflater.inflate(R.layout.fragment_event_list, container, false)
+        mView.background = ColorDrawable(context!!.config.backgroundColor)
+        mView.calendar_events_list_holder?.id = (System.currentTimeMillis() % 100000).toInt()
+        mView.calendar_empty_list_placeholder_2.apply {
+            setTextColor(context.getAdjustedPrimaryColor())
+            underlineText()
+            setOnClickListener {
+                context.launchNewEventIntent(getNewEventDayCode())
+            }
+        }
+
+        use24HourFormat = context!!.config.use24HourFormat
+        updateActionBarTitle()
+        return mView
+    }
+
+    override fun onResume() {
+        super.onResume()
+        checkEvents()
+        val use24Hour = context!!.config.use24HourFormat
+        if (use24Hour != use24HourFormat) {
+            use24HourFormat = use24Hour
+            (mView.calendar_events_list.adapter as? EventListAdapter)?.toggle24HourFormat(use24HourFormat)
+        }
+    }
+
+    override fun onPause() {
+        super.onPause()
+        use24HourFormat = context!!.config.use24HourFormat
+    }
+
+    private fun checkEvents() {
+        if (!wereInitialEventsAdded) {
+            minFetchedTS = DateTime().minusMonths(3).seconds()
+            maxFetchedTS = DateTime().plusMonths(6).seconds()
+        }
+
+        context!!.dbHelper.getEvents(minFetchedTS, maxFetchedTS) {
+            if (it.size >= MIN_EVENTS_TRESHOLD) {
+                receivedEvents(it, false)
+            } else {
+                if (!wereInitialEventsAdded) {
+                    minFetchedTS -= FETCH_INTERVAL
+                    maxFetchedTS += FETCH_INTERVAL
+                }
+                context!!.dbHelper.getEvents(minFetchedTS, maxFetchedTS) {
+                    mEvents = it
+                    receivedEvents(mEvents, false, !wereInitialEventsAdded)
+                }
+            }
+            wereInitialEventsAdded = true
+        }
+    }
+
+    private fun receivedEvents(events: ArrayList<Event>, scrollAfterUpdating: Boolean, forceRecreation: Boolean = false) {
+        if (context == null || activity == null) {
+            return
+        }
+
+        mEvents = context!!.getFilteredEvents(events)
+        val listItems = context!!.getEventListItems(mEvents)
+
+        activity?.runOnUiThread {
+            val currAdapter = mView.calendar_events_list.adapter
+            if (currAdapter == null || forceRecreation) {
+                EventListAdapter(activity as SimpleActivity, listItems, true, this, mView.calendar_events_list) {
+                    if (it is ListEvent) {
+                        editEvent(it)
+                    }
+                }.apply {
+                    mView.calendar_events_list.adapter = this
+                }
+
+                mView.calendar_events_list.endlessScrollListener = object : MyRecyclerView.EndlessScrollListener {
+                    override fun updateTop() {
+                        fetchPreviousPeriod()
+                    }
+
+                    override fun updateBottom() {
+                        fetchNextPeriod(true)
+                    }
+                }
+            } else {
+                (currAdapter as EventListAdapter).updateListItems(listItems)
+                if (scrollAfterUpdating) {
+                    mView.calendar_events_list.smoothScrollBy(0, context!!.resources.getDimension(R.dimen.endless_scroll_move_height).toInt())
+                }
+            }
+            checkPlaceholderVisibility()
+        }
+    }
+
+    private fun checkPlaceholderVisibility() {
+        mView.calendar_empty_list_placeholder.beVisibleIf(mEvents.isEmpty())
+        mView.calendar_empty_list_placeholder_2.beVisibleIf(mEvents.isEmpty())
+        mView.calendar_events_list.beGoneIf(mEvents.isEmpty())
+        if (activity != null)
+            mView.calendar_empty_list_placeholder.setTextColor(activity!!.config.textColor)
+    }
+
+    private fun editEvent(event: ListEvent) {
+        Intent(context, EventActivity::class.java).apply {
+            putExtra(EVENT_ID, event.id)
+            putExtra(EVENT_OCCURRENCE_TS, event.startTS)
+            startActivity(this)
+        }
+    }
+
+    private fun fetchPreviousPeriod() {
+        val oldMinFetchedTS = minFetchedTS - 1
+        minFetchedTS -= FETCH_INTERVAL
+        context!!.dbHelper.getEvents(minFetchedTS, oldMinFetchedTS) {
+            mEvents.addAll(0, it)
+            receivedEvents(mEvents, false)
+        }
+    }
+
+    private fun fetchNextPeriod(scrollAfterUpdating: Boolean) {
+        val oldMaxFetchedTS = maxFetchedTS + 1
+        maxFetchedTS += FETCH_INTERVAL
+        context!!.dbHelper.getEvents(oldMaxFetchedTS, maxFetchedTS) {
+            mEvents.addAll(it)
+            receivedEvents(mEvents, scrollAfterUpdating)
+        }
+    }
+
+    override fun refreshItems() {
+        checkEvents()
+    }
+
+    override fun goToToday() {
+    }
+
+    override fun refreshEvents() {
+        checkEvents()
+    }
+
+    override fun shouldGoToTodayBeVisible() = false
+
+    override fun updateActionBarTitle() {
+        (activity as MainActivity).supportActionBar?.title = getString(R.string.app_launcher_name)
+    }
+
+    override fun getNewEventDayCode() = Formatter.getTodayCode(context!!)
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..2db429489eed72370ee99a9fbe1eca719ec74ad9
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragment.kt
@@ -0,0 +1,165 @@
+package com.simplemobiletools.calendar.fragments
+
+import android.content.Context
+import android.content.res.Resources
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.support.v7.app.AlertDialog
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.DatePicker
+import android.widget.RelativeLayout
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.MainActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.helpers.Config
+import com.simplemobiletools.calendar.helpers.DAY_CODE
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.helpers.MonthlyCalendarImpl
+import com.simplemobiletools.calendar.interfaces.MonthlyCalendar
+import com.simplemobiletools.calendar.interfaces.NavigationListener
+import com.simplemobiletools.calendar.models.DayMonthly
+import com.simplemobiletools.commons.extensions.applyColorFilter
+import com.simplemobiletools.commons.extensions.beGone
+import com.simplemobiletools.commons.extensions.getDialogTheme
+import com.simplemobiletools.commons.extensions.setupDialogStuff
+import kotlinx.android.synthetic.main.fragment_month.view.*
+import kotlinx.android.synthetic.main.top_navigation.view.*
+import org.joda.time.DateTime
+
+class MonthFragment : Fragment(), MonthlyCalendar {
+    private var mTextColor = 0
+    private var mSundayFirst = false
+    private var mShowWeekNumbers = false
+    private var mDayCode = ""
+    private var mPackageName = ""
+    private var mLastHash = 0L
+    private var mCalendar: MonthlyCalendarImpl? = null
+
+    var listener: NavigationListener? = null
+
+    lateinit var mRes: Resources
+    lateinit var mHolder: RelativeLayout
+    lateinit var mConfig: Config
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        val view = inflater.inflate(R.layout.fragment_month, container, false)
+        mRes = resources
+        mPackageName = activity!!.packageName
+        mHolder = view.month_calendar_holder
+        mDayCode = arguments!!.getString(DAY_CODE)
+        mConfig = context!!.config
+        storeStateVariables()
+
+        setupButtons()
+        mCalendar = MonthlyCalendarImpl(this, context!!)
+
+        return view
+    }
+
+    override fun onPause() {
+        super.onPause()
+        storeStateVariables()
+    }
+
+    override fun onResume() {
+        super.onResume()
+        if (mConfig.showWeekNumbers != mShowWeekNumbers) {
+            mLastHash = -1L
+        }
+
+        mCalendar!!.apply {
+            mTargetDate = Formatter.getDateTimeFromCode(mDayCode)
+            getDays(false)    // prefill the screen asap, even if without events
+        }
+
+        storeStateVariables()
+        updateCalendar()
+    }
+
+    private fun storeStateVariables() {
+        mConfig.apply {
+            mSundayFirst = isSundayFirst
+            mShowWeekNumbers = showWeekNumbers
+        }
+    }
+
+    fun updateCalendar() {
+        mCalendar?.updateMonthlyCalendar(Formatter.getDateTimeFromCode(mDayCode))
+    }
+
+    override fun updateMonthlyCalendar(context: Context, month: String, days: ArrayList<DayMonthly>, checkedEvents: Boolean) {
+        val newHash = month.hashCode() + days.hashCode().toLong()
+        if ((mLastHash != 0L && !checkedEvents) || mLastHash == newHash) {
+            return
+        }
+
+        mLastHash = newHash
+
+        activity?.runOnUiThread {
+            mHolder.top_value.apply {
+                text = month
+                setTextColor(mConfig.textColor)
+            }
+            updateDays(days)
+        }
+    }
+
+    private fun setupButtons() {
+        mTextColor = mConfig.textColor
+
+        mHolder.top_left_arrow.apply {
+            applyColorFilter(mTextColor)
+            background = null
+            setOnClickListener {
+                listener?.goLeft()
+            }
+        }
+
+        mHolder.top_right_arrow.apply {
+            applyColorFilter(mTextColor)
+            background = null
+            setOnClickListener {
+                listener?.goRight()
+            }
+        }
+
+        mHolder.top_value.apply {
+            setTextColor(mConfig.textColor)
+            setOnClickListener {
+                showMonthDialog()
+            }
+        }
+    }
+
+    private fun showMonthDialog() {
+        activity!!.setTheme(context!!.getDialogTheme())
+        val view = layoutInflater.inflate(R.layout.date_picker, null)
+        val datePicker = view.findViewById<DatePicker>(R.id.date_picker)
+        datePicker.findViewById<View>(Resources.getSystem().getIdentifier("day", "id", "android")).beGone()
+
+        val dateTime = DateTime(mCalendar!!.mTargetDate.toString())
+        datePicker.init(dateTime.year, dateTime.monthOfYear - 1, 1, null)
+
+        AlertDialog.Builder(context!!)
+                .setNegativeButton(R.string.cancel, null)
+                .setPositiveButton(R.string.ok) { dialog, which -> positivePressed(dateTime, datePicker) }
+                .create().apply {
+                    activity?.setupDialogStuff(view, this)
+                }
+    }
+
+    private fun positivePressed(dateTime: DateTime, datePicker: DatePicker) {
+        val month = datePicker.month + 1
+        val year = datePicker.year
+        val newDateTime = dateTime.withDate(year, month, 1)
+        listener?.goToDateTime(newDateTime)
+    }
+
+    private fun updateDays(days: ArrayList<DayMonthly>) {
+        mHolder.month_view_wrapper.updateDays(days) {
+            (activity as MainActivity).openDayFromMonthly(Formatter.getDateTimeFromCode(it.code))
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragmentsHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b2d0fc1ccc199cdf852ae4e8e4ff35fac759a3a8
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MonthFragmentsHolder.kt
@@ -0,0 +1,112 @@
+package com.simplemobiletools.calendar.fragments
+
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.support.v4.view.ViewPager
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.MainActivity
+import com.simplemobiletools.calendar.adapters.MyMonthPagerAdapter
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.getMonthCode
+import com.simplemobiletools.calendar.helpers.DAY_CODE
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.interfaces.NavigationListener
+import com.simplemobiletools.commons.views.MyViewPager
+import kotlinx.android.synthetic.main.fragment_months_holder.view.*
+import org.joda.time.DateTime
+
+class MonthFragmentsHolder : MyFragmentHolder(), NavigationListener {
+    private val PREFILLED_MONTHS = 251
+
+    private var viewPager: MyViewPager? = null
+    private var defaultMonthlyPage = 0
+    private var todayDayCode = ""
+    private var currentDayCode = ""
+    private var isGoToTodayVisible = false
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        currentDayCode = arguments?.getString(DAY_CODE) ?: ""
+        todayDayCode = Formatter.getTodayCode(context!!)
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        val view = inflater.inflate(R.layout.fragment_months_holder, container, false)
+        view.background = ColorDrawable(context!!.config.backgroundColor)
+        viewPager = view.fragment_months_viewpager
+        viewPager!!.id = (System.currentTimeMillis() % 100000).toInt()
+        setupFragment()
+        return view
+    }
+
+    private fun setupFragment() {
+        val codes = getMonths(currentDayCode)
+        val monthlyAdapter = MyMonthPagerAdapter(activity!!.supportFragmentManager, codes, this)
+        defaultMonthlyPage = codes.size / 2
+
+        viewPager!!.apply {
+            adapter = monthlyAdapter
+            addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+                override fun onPageScrollStateChanged(state: Int) {
+                }
+
+                override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
+                }
+
+                override fun onPageSelected(position: Int) {
+                    currentDayCode = codes[position]
+                    val shouldGoToTodayBeVisible = shouldGoToTodayBeVisible()
+                    if (isGoToTodayVisible != shouldGoToTodayBeVisible) {
+                        (activity as? MainActivity)?.toggleGoToTodayVisibility(shouldGoToTodayBeVisible)
+                        isGoToTodayVisible = shouldGoToTodayBeVisible
+                    }
+                }
+            })
+            currentItem = defaultMonthlyPage
+        }
+        updateActionBarTitle()
+    }
+
+    private fun getMonths(code: String): List<String> {
+        val months = ArrayList<String>(PREFILLED_MONTHS)
+        val today = Formatter.getDateTimeFromCode(code).withDayOfMonth(1)
+        for (i in -PREFILLED_MONTHS / 2..PREFILLED_MONTHS / 2) {
+            months.add(Formatter.getDayCodeFromDateTime(today.plusMonths(i)))
+        }
+
+        return months
+    }
+
+    override fun goLeft() {
+        viewPager!!.currentItem = viewPager!!.currentItem - 1
+    }
+
+    override fun goRight() {
+        viewPager!!.currentItem = viewPager!!.currentItem + 1
+    }
+
+    override fun goToDateTime(dateTime: DateTime) {
+        currentDayCode = Formatter.getDayCodeFromDateTime(dateTime)
+        setupFragment()
+    }
+
+    override fun goToToday() {
+        currentDayCode = todayDayCode
+        setupFragment()
+    }
+
+    override fun refreshEvents() {
+        (viewPager?.adapter as? MyMonthPagerAdapter)?.updateCalendars(viewPager?.currentItem ?: 0)
+    }
+
+    override fun shouldGoToTodayBeVisible() = currentDayCode.getMonthCode() != todayDayCode.getMonthCode()
+
+    override fun updateActionBarTitle() {
+        (activity as MainActivity).supportActionBar?.title = getString(R.string.app_launcher_name)
+    }
+
+    override fun getNewEventDayCode() = if (shouldGoToTodayBeVisible()) currentDayCode else todayDayCode
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MyFragmentHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MyFragmentHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f8c477db73677df0621440c7c8b3064725b018ed
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/MyFragmentHolder.kt
@@ -0,0 +1,15 @@
+package com.simplemobiletools.calendar.fragments
+
+import android.support.v4.app.Fragment
+
+abstract class MyFragmentHolder : Fragment() {
+    abstract fun goToToday()
+
+    abstract fun refreshEvents()
+
+    abstract fun shouldGoToTodayBeVisible(): Boolean
+
+    abstract fun updateActionBarTitle()
+
+    abstract fun getNewEventDayCode(): String
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/WeekFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/WeekFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7e52aff264c52ee75546f0230e6286468866b2dc
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/WeekFragment.kt
@@ -0,0 +1,456 @@
+package com.simplemobiletools.calendar.fragments
+
+import android.content.Intent
+import android.content.res.Resources
+import android.graphics.Rect
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.util.SparseIntArray
+import android.view.*
+import android.widget.ImageView
+import android.widget.RelativeLayout
+import android.widget.TextView
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.EventActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.getFilteredEvents
+import com.simplemobiletools.calendar.extensions.seconds
+import com.simplemobiletools.calendar.helpers.*
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.interfaces.WeekFragmentListener
+import com.simplemobiletools.calendar.interfaces.WeeklyCalendar
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.calendar.views.MyScrollView
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.DAY_SECONDS
+import com.simplemobiletools.commons.helpers.WEEK_SECONDS
+import kotlinx.android.synthetic.main.fragment_week.*
+import kotlinx.android.synthetic.main.fragment_week.view.*
+import org.joda.time.DateTime
+import org.joda.time.Days
+import java.util.*
+
+class WeekFragment : Fragment(), WeeklyCalendar {
+    private val CLICK_DURATION_THRESHOLD = 150
+    private val PLUS_FADEOUT_DELAY = 5000L
+
+    var mListener: WeekFragmentListener? = null
+    private var mWeekTimestamp = 0
+    private var mRowHeight = 0
+    private var minScrollY = -1
+    private var maxScrollY = -1
+    private var mWasDestroyed = false
+    private var primaryColor = 0
+    private var lastHash = 0
+    private var isFragmentVisible = false
+    private var wasFragmentInit = false
+    private var wasExtraHeightAdded = false
+    private var dimPastEvents = true
+    private var clickStartTime = 0L
+    private var selectedGrid: View? = null
+    private var todayColumnIndex = -1
+    private var events = ArrayList<Event>()
+    private var allDayHolders = ArrayList<RelativeLayout>()
+    private var allDayRows = ArrayList<HashSet<Int>>()
+    private var eventTypeColors = SparseIntArray()
+
+    lateinit var inflater: LayoutInflater
+    lateinit var mView: View
+    lateinit var mScrollView: MyScrollView
+    lateinit var mCalendar: WeeklyCalendarImpl
+    lateinit var mRes: Resources
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        context!!.dbHelper.getEventTypes {
+            it.map { eventTypeColors.put(it.id, it.color) }
+        }
+
+        mRowHeight = (context!!.resources.getDimension(R.dimen.weekly_view_row_height)).toInt()
+        minScrollY = mRowHeight * context!!.config.startWeeklyAt
+        mWeekTimestamp = arguments!!.getInt(WEEK_START_TIMESTAMP)
+        dimPastEvents = context!!.config.dimPastEvents
+        primaryColor = context!!.getAdjustedPrimaryColor()
+        mRes = resources
+        allDayRows.add(HashSet())
+        mCalendar = WeeklyCalendarImpl(this, context!!)
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        this.inflater = inflater
+
+        mView = inflater.inflate(R.layout.fragment_week, container, false)
+        mScrollView = mView.week_events_scrollview
+        mScrollView.setOnScrollviewListener(object : MyScrollView.ScrollViewListener {
+            override fun onScrollChanged(scrollView: MyScrollView, x: Int, y: Int, oldx: Int, oldy: Int) {
+                checkScrollLimits(y)
+            }
+        })
+
+        mScrollView.onGlobalLayout {
+            updateScrollY(Math.max(mListener?.getCurrScrollY() ?: 0, minScrollY))
+        }
+
+        (0..6).map { inflater.inflate(R.layout.stroke_vertical_divider, mView.week_vertical_grid_holder) }
+        (0..23).map { inflater.inflate(R.layout.stroke_horizontal_divider, mView.week_horizontal_grid_holder) }
+
+        wasFragmentInit = true
+        return mView
+    }
+
+    override fun onPause() {
+        super.onPause()
+        wasExtraHeightAdded = true
+    }
+
+    override fun onResume() {
+        super.onResume()
+        setupDayLabels()
+        updateCalendar()
+
+        mScrollView.onGlobalLayout {
+            if (context == null) {
+                return@onGlobalLayout
+            }
+
+            minScrollY = mRowHeight * context!!.config.startWeeklyAt
+            maxScrollY = mRowHeight * context!!.config.endWeeklyAt
+
+            val bounds = Rect()
+            week_events_holder.getGlobalVisibleRect(bounds)
+            maxScrollY -= bounds.bottom - bounds.top
+            if (minScrollY > maxScrollY)
+                maxScrollY = -1
+
+            checkScrollLimits(mScrollView.scrollY)
+        }
+    }
+
+    override fun setMenuVisibility(menuVisible: Boolean) {
+        super.setMenuVisibility(menuVisible)
+        isFragmentVisible = menuVisible
+        if (isFragmentVisible && wasFragmentInit) {
+            mListener?.updateHoursTopMargin(mView.week_top_holder.height)
+            checkScrollLimits(mScrollView.scrollY)
+        }
+    }
+
+    fun updateCalendar() {
+        mCalendar.updateWeeklyCalendar(mWeekTimestamp)
+    }
+
+    private fun setupDayLabels() {
+        var curDay = Formatter.getDateTimeFromTS(mWeekTimestamp)
+        val textColor = context!!.config.textColor
+        val todayCode = Formatter.getDayCodeFromDateTime(DateTime())
+        for (i in 0..6) {
+            val dayCode = Formatter.getDayCodeFromDateTime(curDay)
+            val dayLetters = mRes.getStringArray(R.array.week_day_letters).toList() as ArrayList<String>
+            val dayLetter = dayLetters[curDay.dayOfWeek - 1]
+
+            mView.findViewById<TextView>(mRes.getIdentifier("week_day_label_$i", "id", context!!.packageName)).apply {
+                text = "$dayLetter\n${curDay.dayOfMonth}"
+                setTextColor(if (todayCode == dayCode) primaryColor else textColor)
+                if (todayCode == dayCode) {
+                    todayColumnIndex = i
+                }
+            }
+            curDay = curDay.plusDays(1)
+        }
+    }
+
+    private fun checkScrollLimits(y: Int) {
+        if (minScrollY != -1 && y < minScrollY) {
+            mScrollView.scrollY = minScrollY
+        } else if (maxScrollY != -1 && y > maxScrollY) {
+            mScrollView.scrollY = maxScrollY
+        } else if (isFragmentVisible) {
+            mListener?.scrollTo(y)
+        }
+    }
+
+    private fun initGrid() {
+        (0..6).map { getColumnWithId(it) }
+                .forEachIndexed { index, layout ->
+                    layout.removeAllViews()
+                    layout.setOnTouchListener { view, motionEvent ->
+                        checkGridClick(motionEvent, index, layout)
+                        true
+                    }
+                }
+    }
+
+    private fun checkGridClick(event: MotionEvent, index: Int, view: ViewGroup) {
+        when (event.action) {
+            MotionEvent.ACTION_DOWN -> clickStartTime = System.currentTimeMillis()
+            MotionEvent.ACTION_UP -> {
+                if (System.currentTimeMillis() - clickStartTime < CLICK_DURATION_THRESHOLD) {
+                    selectedGrid?.animation?.cancel()
+                    selectedGrid?.beGone()
+
+                    val rowHeight = resources.getDimension(R.dimen.weekly_view_row_height)
+                    val hour = (event.y / rowHeight).toInt()
+                    selectedGrid = (inflater.inflate(R.layout.week_grid_item, null, false) as ImageView).apply {
+                        view.addView(this)
+                        background = ColorDrawable(primaryColor)
+                        layoutParams.width = view.width
+                        layoutParams.height = rowHeight.toInt()
+                        y = hour * rowHeight
+                        applyColorFilter(primaryColor.getContrastColor())
+
+                        setOnClickListener {
+                            val timestamp = mWeekTimestamp + index * DAY_SECONDS + hour * 60 * 60
+                            Intent(context, EventActivity::class.java).apply {
+                                putExtra(NEW_EVENT_START_TS, timestamp)
+                                putExtra(NEW_EVENT_SET_HOUR_DURATION, true)
+                                startActivity(this)
+                            }
+                        }
+                        animate().alpha(0f).setStartDelay(PLUS_FADEOUT_DELAY).withEndAction {
+                            beGone()
+                        }
+                    }
+                }
+            }
+            else -> {
+            }
+        }
+    }
+
+    override fun updateWeeklyCalendar(events: ArrayList<Event>) {
+        val newHash = events.hashCode()
+        if (newHash == lastHash) {
+            return
+        }
+
+        lastHash = newHash
+        this.events = events
+        updateEvents()
+    }
+
+    private fun updateEvents() {
+        if (mWasDestroyed) {
+            return
+        }
+
+        activity!!.runOnUiThread {
+            if (context != null && isAdded) {
+                addEvents()
+            }
+        }
+    }
+
+    private fun addEvents() {
+        val filtered = context!!.getFilteredEvents(events)
+
+        initGrid()
+        allDayHolders.clear()
+        allDayRows.clear()
+        allDayRows.add(HashSet())
+        week_all_day_holder?.removeAllViews()
+
+        addNewLine()
+
+        val fullHeight = mRes.getDimension(R.dimen.weekly_view_events_height)
+        val minuteHeight = fullHeight / (24 * 60)
+        val minimalHeight = mRes.getDimension(R.dimen.weekly_view_minimal_event_height).toInt()
+
+        var hadAllDayEvent = false
+        val replaceDescription = context!!.config.replaceDescription
+        val sorted = filtered.sortedWith(compareBy({ it.startTS }, { it.endTS }, { it.title }, { if (replaceDescription) it.location else it.description }))
+        for (event in sorted) {
+            if (event.getIsAllDay() || Formatter.getDayCodeFromTS(event.startTS) != Formatter.getDayCodeFromTS(event.endTS)) {
+                hadAllDayEvent = true
+                addAllDayEvent(event)
+            } else {
+                val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
+                val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
+                val dayOfWeek = startDateTime.plusDays(if (context!!.config.isSundayFirst) 1 else 0).dayOfWeek - 1
+                val layout = getColumnWithId(dayOfWeek)
+
+                val startMinutes = startDateTime.minuteOfDay
+                val duration = endDateTime.minuteOfDay - startMinutes
+
+                (inflater.inflate(R.layout.week_event_marker, null, false) as TextView).apply {
+                    var backgroundColor = eventTypeColors.get(event.eventType, primaryColor)
+                    var textColor = backgroundColor.getContrastColor()
+                    if (dimPastEvents && event.isPastEvent) {
+                        backgroundColor = backgroundColor.adjustAlpha(LOW_ALPHA)
+                        textColor = textColor.adjustAlpha(LOW_ALPHA)
+                    }
+
+                    background = ColorDrawable(backgroundColor)
+                    setTextColor(textColor)
+                    text = event.title
+                    layout.addView(this)
+                    y = startMinutes * minuteHeight
+                    (layoutParams as RelativeLayout.LayoutParams).apply {
+                        width = layout.width - 1
+                        minHeight = if (event.startTS == event.endTS) minimalHeight else (duration * minuteHeight).toInt() - 1
+                    }
+                    setOnClickListener {
+                        Intent(context, EventActivity::class.java).apply {
+                            putExtra(EVENT_ID, event.id)
+                            putExtra(EVENT_OCCURRENCE_TS, event.startTS)
+                            startActivity(this)
+                        }
+                    }
+                }
+            }
+        }
+
+        if (!hadAllDayEvent) {
+            checkTopHolderHeight()
+        }
+
+        addCurrentTimeIndicator(minuteHeight)
+    }
+
+    private fun addNewLine() {
+        val allDaysLine = inflater.inflate(R.layout.all_day_events_holder_line, null, false) as RelativeLayout
+        week_all_day_holder.addView(allDaysLine)
+        allDayHolders.add(allDaysLine)
+    }
+
+    private fun addCurrentTimeIndicator(minuteHeight: Float) {
+        if (todayColumnIndex != -1) {
+            val minutes = DateTime().minuteOfDay
+            val todayColumn = getColumnWithId(todayColumnIndex)
+            (inflater.inflate(R.layout.week_now_marker, null, false) as ImageView).apply {
+                applyColorFilter(primaryColor)
+                mView.week_events_holder.addView(this, 0)
+                val extraWidth = (todayColumn.width * 0.3).toInt()
+                val markerHeight = resources.getDimension(R.dimen.weekly_view_now_height).toInt()
+                (layoutParams as RelativeLayout.LayoutParams).apply {
+                    width = todayColumn.width + extraWidth
+                    height = markerHeight
+                }
+                x = todayColumn.x - extraWidth / 2
+                y = minutes * minuteHeight - markerHeight / 2
+            }
+        }
+    }
+
+    private fun checkTopHolderHeight() {
+        mView.week_top_holder.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
+            override fun onGlobalLayout() {
+                mView.week_top_holder.viewTreeObserver.removeOnGlobalLayoutListener(this)
+                if (isFragmentVisible && activity != null) {
+                    mListener?.updateHoursTopMargin(mView.week_top_holder.height)
+                }
+            }
+        })
+    }
+
+    private fun addAllDayEvent(event: Event) {
+        (inflater.inflate(R.layout.week_all_day_event_marker, null, false) as TextView).apply {
+            if (activity == null)
+                return
+
+            var backgroundColor = eventTypeColors.get(event.eventType, primaryColor)
+            var textColor = backgroundColor.getContrastColor()
+            if (dimPastEvents && event.isPastEvent) {
+                backgroundColor = backgroundColor.adjustAlpha(LOW_ALPHA)
+                textColor = textColor.adjustAlpha(LOW_ALPHA)
+            }
+            background = ColorDrawable(backgroundColor)
+
+            setTextColor(textColor)
+            text = event.title
+
+            val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
+            val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
+
+            val minTS = Math.max(startDateTime.seconds(), mWeekTimestamp)
+            val maxTS = Math.min(endDateTime.seconds(), mWeekTimestamp + WEEK_SECONDS)
+            val daysCnt = Days.daysBetween(Formatter.getDateTimeFromTS(minTS).toLocalDate(), Formatter.getDateTimeFromTS(maxTS).toLocalDate()).days
+
+            val startDateTimeInWeek = Formatter.getDateTimeFromTS(minTS)
+            val firstDayIndex = (startDateTimeInWeek.dayOfWeek - if (context!!.config.isSundayFirst) 0 else 1) % 7
+            var doesEventFit: Boolean
+            val cnt = allDayRows.size - 1
+            var wasEventHandled = false
+            var drawAtLine = 0
+            for (index in 0..cnt) {
+                doesEventFit = true
+                drawAtLine = index
+                val row = allDayRows[index]
+                for (i in firstDayIndex..firstDayIndex + daysCnt) {
+                    if (row.contains(i)) {
+                        doesEventFit = false
+                    }
+                }
+
+                for (dayIndex in firstDayIndex..firstDayIndex + daysCnt) {
+                    if (doesEventFit) {
+                        row.add(dayIndex)
+                        wasEventHandled = true
+                    } else if (index == cnt) {
+                        if (allDayRows.size == index + 1) {
+                            allDayRows.add(HashSet())
+                            addNewLine()
+                            drawAtLine++
+                            wasEventHandled = true
+                        }
+                        allDayRows.last().add(dayIndex)
+                    }
+                }
+                if (wasEventHandled) {
+                    break
+                }
+            }
+
+            allDayHolders[drawAtLine].addView(this)
+            (layoutParams as RelativeLayout.LayoutParams).apply {
+                topMargin = mRes.getDimension(R.dimen.tiny_margin).toInt()
+                leftMargin = getColumnWithId(firstDayIndex).x.toInt()
+                bottomMargin = 1
+                width = getColumnWithId(Math.min(firstDayIndex + daysCnt, 6)).right - leftMargin - 1
+            }
+
+            calculateExtraHeight()
+
+            setOnClickListener {
+                Intent(context, EventActivity::class.java).apply {
+                    putExtra(EVENT_ID, event.id)
+                    putExtra(EVENT_OCCURRENCE_TS, event.startTS)
+                    startActivity(this)
+                }
+            }
+        }
+    }
+
+    private fun calculateExtraHeight() {
+        mView.week_top_holder.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
+            override fun onGlobalLayout() {
+                if (activity == null)
+                    return
+
+                mView.week_top_holder.viewTreeObserver.removeOnGlobalLayoutListener(this)
+                if (isFragmentVisible) {
+                    mListener?.updateHoursTopMargin(mView.week_top_holder.height)
+                }
+
+                if (!wasExtraHeightAdded) {
+                    maxScrollY += mView.week_all_day_holder.height
+                    wasExtraHeightAdded = true
+                }
+            }
+        })
+    }
+
+    override fun onDestroyView() {
+        super.onDestroyView()
+        mWasDestroyed = true
+    }
+
+    private fun getColumnWithId(id: Int) = mView.findViewById<ViewGroup>(mRes.getIdentifier("week_column_$id", "id", context!!.packageName))
+
+    fun updateScrollY(y: Int) {
+        if (wasFragmentInit) {
+            mScrollView.scrollY = y
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/WeekFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/WeekFragmentsHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ff1cf6fd068eb5a3ac2c80fb44d2cb012d40d81c
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/WeekFragmentsHolder.kt
@@ -0,0 +1,152 @@
+package com.simplemobiletools.calendar.fragments
+
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.support.v4.view.ViewPager
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.MainActivity
+import com.simplemobiletools.calendar.adapters.MyWeekPagerAdapter
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.seconds
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.helpers.WEEK_START_DATE_TIME
+import com.simplemobiletools.calendar.interfaces.WeekFragmentListener
+import com.simplemobiletools.calendar.views.MyScrollView
+import com.simplemobiletools.commons.helpers.WEEK_SECONDS
+import kotlinx.android.synthetic.main.fragment_week_holder.*
+import kotlinx.android.synthetic.main.fragment_week_holder.view.*
+import org.joda.time.DateTime
+
+class WeekFragmentsHolder : MyFragmentHolder(), WeekFragmentListener {
+    private val PREFILLED_WEEKS = 151
+
+    private var weekHolder: ViewGroup? = null
+    private var defaultWeeklyPage = 0
+    private var thisWeekTS = 0
+    private var currentWeekTS = 0
+    private var isGoToTodayVisible = false
+    private var weekScrollY = 0
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        val dateTimeString = arguments?.getString(WEEK_START_DATE_TIME) ?: ""
+        currentWeekTS = (DateTime.parse(dateTimeString) ?: DateTime()).seconds()
+        thisWeekTS = currentWeekTS
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        weekHolder = inflater.inflate(R.layout.fragment_week_holder, container, false) as ViewGroup
+        weekHolder!!.background = ColorDrawable(context!!.config.backgroundColor)
+        setupFragment()
+        return weekHolder
+    }
+
+    private fun setupFragment() {
+        val weekTSs = getWeekTimestamps(currentWeekTS)
+        val weeklyAdapter = MyWeekPagerAdapter(activity!!.supportFragmentManager, weekTSs, this)
+
+        val textColor = context!!.config.textColor
+        weekHolder!!.week_view_hours_holder.removeAllViews()
+        val hourDateTime = DateTime().withDate(2000, 1, 1).withTime(0, 0, 0, 0)
+        for (i in 1..23) {
+            val formattedHours = Formatter.getHours(context!!, hourDateTime.withHourOfDay(i))
+            (layoutInflater.inflate(R.layout.weekly_view_hour_textview, null, false) as TextView).apply {
+                text = formattedHours
+                setTextColor(textColor)
+                weekHolder!!.week_view_hours_holder.addView(this)
+            }
+        }
+
+        defaultWeeklyPage = weekTSs.size / 2
+        weekHolder!!.week_view_view_pager.apply {
+            adapter = weeklyAdapter
+            addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+                override fun onPageScrollStateChanged(state: Int) {
+                }
+
+                override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
+                }
+
+                override fun onPageSelected(position: Int) {
+                    currentWeekTS = weekTSs[position]
+                    val shouldGoToTodayBeVisible = shouldGoToTodayBeVisible()
+                    if (isGoToTodayVisible != shouldGoToTodayBeVisible) {
+                        (activity as? MainActivity)?.toggleGoToTodayVisibility(shouldGoToTodayBeVisible)
+                        isGoToTodayVisible = shouldGoToTodayBeVisible
+                    }
+
+                    setupWeeklyActionbarTitle(weekTSs[position])
+                }
+            })
+            currentItem = defaultWeeklyPage
+        }
+
+        weekHolder!!.week_view_hours_scrollview.setOnScrollviewListener(object : MyScrollView.ScrollViewListener {
+            override fun onScrollChanged(scrollView: MyScrollView, x: Int, y: Int, oldx: Int, oldy: Int) {
+                weekScrollY = y
+                weeklyAdapter.updateScrollY(week_view_view_pager.currentItem, y)
+            }
+        })
+        weekHolder!!.week_view_hours_scrollview.setOnTouchListener { view, motionEvent -> true }
+        updateActionBarTitle()
+    }
+
+    private fun getWeekTimestamps(targetSeconds: Int): List<Int> {
+        val weekTSs = ArrayList<Int>(PREFILLED_WEEKS)
+        for (i in -PREFILLED_WEEKS / 2..PREFILLED_WEEKS / 2) {
+            weekTSs.add(Formatter.getDateTimeFromTS(targetSeconds).plusWeeks(i).seconds())
+        }
+        return weekTSs
+    }
+
+    private fun setupWeeklyActionbarTitle(timestamp: Int) {
+        val startDateTime = Formatter.getDateTimeFromTS(timestamp)
+        val endDateTime = Formatter.getDateTimeFromTS(timestamp + WEEK_SECONDS)
+        val startMonthName = Formatter.getMonthName(context!!, startDateTime.monthOfYear)
+        if (startDateTime.monthOfYear == endDateTime.monthOfYear) {
+            var newTitle = startMonthName
+            if (startDateTime.year != DateTime().year) {
+                newTitle += " - ${startDateTime.year}"
+            }
+            (activity as? MainActivity)?.supportActionBar?.title = newTitle
+        } else {
+            val endMonthName = Formatter.getMonthName(context!!, endDateTime.monthOfYear)
+            (activity as? MainActivity)?.supportActionBar?.title = "$startMonthName - $endMonthName"
+        }
+        (activity as? MainActivity)?.supportActionBar?.subtitle = "${getString(R.string.week)} ${startDateTime.plusDays(3).weekOfWeekyear}"
+    }
+
+    override fun goToToday() {
+        currentWeekTS = thisWeekTS
+        setupFragment()
+    }
+
+    override fun refreshEvents() {
+        val viewPager = weekHolder?.week_view_view_pager
+        (viewPager?.adapter as? MyWeekPagerAdapter)?.updateCalendars(viewPager.currentItem)
+    }
+
+    override fun shouldGoToTodayBeVisible() = currentWeekTS != thisWeekTS
+
+    override fun updateActionBarTitle() {
+        setupWeeklyActionbarTitle(currentWeekTS)
+    }
+
+    override fun getNewEventDayCode() = Formatter.getDayCodeFromTS(currentWeekTS)
+
+    override fun scrollTo(y: Int) {
+        weekHolder!!.week_view_hours_scrollview.scrollY = y
+        weekScrollY = y
+    }
+
+    override fun updateHoursTopMargin(margin: Int) {
+        weekHolder?.week_view_hours_divider?.layoutParams?.height = margin
+        weekHolder?.week_view_hours_scrollview?.requestLayout()
+    }
+
+    override fun getCurrScrollY() = weekScrollY
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/YearFragment.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/YearFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..38d9a2ce60f4938a0e8d4244f17697e1443b0246
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/YearFragment.kt
@@ -0,0 +1,111 @@
+package com.simplemobiletools.calendar.fragments
+
+import android.content.res.Resources
+import android.os.Bundle
+import android.support.v4.app.Fragment
+import android.util.SparseArray
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.MainActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.helpers.YEAR_LABEL
+import com.simplemobiletools.calendar.helpers.YearlyCalendarImpl
+import com.simplemobiletools.calendar.interfaces.YearlyCalendar
+import com.simplemobiletools.calendar.models.DayYearly
+import com.simplemobiletools.calendar.views.SmallMonthView
+import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
+import com.simplemobiletools.commons.extensions.updateTextColors
+import kotlinx.android.synthetic.main.fragment_year.view.*
+import org.joda.time.DateTime
+import java.util.*
+
+class YearFragment : Fragment(), YearlyCalendar {
+    private var mYear = 0
+    private var mSundayFirst = false
+    private var lastHash = 0
+    private var mCalendar: YearlyCalendarImpl? = null
+
+    lateinit var mView: View
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        mView = inflater.inflate(R.layout.fragment_year, container, false)
+        mYear = arguments!!.getInt(YEAR_LABEL)
+        context!!.updateTextColors(mView.calendar_holder)
+        setupMonths()
+
+        mCalendar = YearlyCalendarImpl(this, context!!, mYear)
+
+        return mView
+    }
+
+    override fun onPause() {
+        super.onPause()
+        mSundayFirst = context!!.config.isSundayFirst
+    }
+
+    override fun onResume() {
+        super.onResume()
+        val sundayFirst = context!!.config.isSundayFirst
+        if (sundayFirst != mSundayFirst) {
+            mSundayFirst = sundayFirst
+            setupMonths()
+        }
+        updateCalendar()
+    }
+
+    fun updateCalendar() {
+        mCalendar?.getEvents(mYear)
+    }
+
+    private fun setupMonths() {
+        val dateTime = DateTime().withDate(mYear, 2, 1).withHourOfDay(12)
+        val days = dateTime.dayOfMonth().maximumValue
+        mView.month_2.setDays(days)
+
+        val res = resources
+        markCurrentMonth(res)
+
+        for (i in 1..12) {
+            val monthView = mView.findViewById<SmallMonthView>(res.getIdentifier("month_" + i, "id", context!!.packageName))
+            var dayOfWeek = dateTime.withMonthOfYear(i).dayOfWeek().get()
+            if (!mSundayFirst) {
+                dayOfWeek--
+            }
+
+            monthView.firstDay = dayOfWeek
+            monthView.setOnClickListener {
+                (activity as MainActivity).openMonthFromYearly(DateTime().withDate(mYear, i, 1))
+            }
+        }
+    }
+
+    private fun markCurrentMonth(res: Resources) {
+        val now = DateTime()
+        if (now.year == mYear) {
+            val monthLabel = mView.findViewById<TextView>(res.getIdentifier("month_${now.monthOfYear}_label", "id", context!!.packageName))
+            monthLabel.setTextColor(context!!.getAdjustedPrimaryColor())
+
+            val monthView = mView.findViewById<SmallMonthView>(res.getIdentifier("month_${now.monthOfYear}", "id", context!!.packageName))
+            monthView.todaysId = now.dayOfMonth
+        }
+    }
+
+    override fun updateYearlyCalendar(events: SparseArray<ArrayList<DayYearly>>, hashCode: Int) {
+        if (!isAdded)
+            return
+
+        if (hashCode == lastHash) {
+            return
+        }
+
+        lastHash = hashCode
+        val res = resources
+        for (i in 1..12) {
+            val monthView = mView.findViewById<SmallMonthView>(res.getIdentifier("month_$i", "id", context!!.packageName))
+            monthView.setEvents(events.get(i))
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/YearFragmentsHolder.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/YearFragmentsHolder.kt
new file mode 100644
index 0000000000000000000000000000000000000000..a606fd00338ccd764172beb1473709098968121d
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/fragments/YearFragmentsHolder.kt
@@ -0,0 +1,96 @@
+package com.simplemobiletools.calendar.fragments
+
+import android.graphics.drawable.ColorDrawable
+import android.os.Bundle
+import android.support.v4.view.ViewPager
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.MainActivity
+import com.simplemobiletools.calendar.adapters.MyYearPagerAdapter
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.commons.views.MyViewPager
+import kotlinx.android.synthetic.main.fragment_years_holder.view.*
+import org.joda.time.DateTime
+
+class YearFragmentsHolder : MyFragmentHolder() {
+    private val PREFILLED_YEARS = 61
+
+    private var viewPager: MyViewPager? = null
+    private var defaultYearlyPage = 0
+    private var todayYear = 0
+    private var currentYear = 0
+    private var isGoToTodayVisible = false
+
+    override fun onCreate(savedInstanceState: Bundle?) {
+        super.onCreate(savedInstanceState)
+        currentYear = DateTime().toString(Formatter.YEAR_PATTERN).toInt()
+        todayYear = currentYear
+    }
+
+    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
+        val view = inflater.inflate(R.layout.fragment_years_holder, container, false)
+        view.background = ColorDrawable(context!!.config.backgroundColor)
+        viewPager = view.fragment_years_viewpager
+        viewPager!!.id = (System.currentTimeMillis() % 100000).toInt()
+        setupFragment()
+        return view
+    }
+
+    private fun setupFragment() {
+        val years = getYears(currentYear)
+        val yearlyAdapter = MyYearPagerAdapter(activity!!.supportFragmentManager, years)
+        defaultYearlyPage = years.size / 2
+
+        viewPager?.apply {
+            adapter = yearlyAdapter
+            addOnPageChangeListener(object : ViewPager.OnPageChangeListener {
+                override fun onPageScrollStateChanged(state: Int) {
+                }
+
+                override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {
+                }
+
+                override fun onPageSelected(position: Int) {
+                    currentYear = years[position]
+                    val shouldGoToTodayBeVisible = shouldGoToTodayBeVisible()
+                    if (isGoToTodayVisible != shouldGoToTodayBeVisible) {
+                        (activity as? MainActivity)?.toggleGoToTodayVisibility(shouldGoToTodayBeVisible)
+                        isGoToTodayVisible = shouldGoToTodayBeVisible
+                    }
+
+                    if (position < years.size) {
+                        (activity as? MainActivity)?.supportActionBar?.title = "${getString(R.string.app_launcher_name)} - ${years[position]}"
+                    }
+                }
+            })
+            currentItem = defaultYearlyPage
+        }
+        updateActionBarTitle()
+    }
+
+    private fun getYears(targetYear: Int): List<Int> {
+        val years = ArrayList<Int>(PREFILLED_YEARS)
+        years += targetYear - PREFILLED_YEARS / 2..targetYear + PREFILLED_YEARS / 2
+        return years
+    }
+
+    override fun goToToday() {
+        currentYear = todayYear
+        setupFragment()
+    }
+
+    override fun refreshEvents() {
+        (viewPager?.adapter as? MyYearPagerAdapter)?.updateCalendars(viewPager?.currentItem ?: 0)
+    }
+
+    override fun shouldGoToTodayBeVisible() = currentYear != todayYear
+
+    override fun updateActionBarTitle() {
+        (activity as? MainActivity)?.supportActionBar?.title = "${getString(R.string.app_launcher_name)} - $currentYear"
+    }
+
+    override fun getNewEventDayCode() = Formatter.getTodayCode(context!!)
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/CalDAVHandler.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/CalDAVHandler.kt
new file mode 100644
index 0000000000000000000000000000000000000000..198538be19a2c878be9b65c28cc89250be6713dd
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/CalDAVHandler.kt
@@ -0,0 +1,463 @@
+package com.simplemobiletools.calendar.helpers
+
+import android.content.ContentUris
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import android.provider.CalendarContract
+import android.provider.CalendarContract.Reminders
+import android.util.SparseIntArray
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.scheduleCalDAVSync
+import com.simplemobiletools.calendar.models.CalDAVCalendar
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.commons.extensions.*
+import com.simplemobiletools.commons.helpers.PERMISSION_READ_CALENDAR
+import com.simplemobiletools.commons.helpers.PERMISSION_WRITE_CALENDAR
+import java.util.*
+import kotlin.collections.ArrayList
+
+class CalDAVHandler(val context: Context) {
+    fun refreshCalendars(activity: SimpleActivity? = null, callback: () -> Unit) {
+        val calDAVCalendars = getCalDAVCalendars(activity, context.config.caldavSyncedCalendarIDs)
+        for (calendar in calDAVCalendars) {
+            val localEventType = context.dbHelper.getEventTypeWithCalDAVCalendarId(calendar.id) ?: continue
+            localEventType.apply {
+                title = calendar.displayName
+                caldavDisplayName = calendar.displayName
+                caldavEmail = calendar.accountName
+                color = calendar.color
+                context.dbHelper.updateLocalEventType(this)
+            }
+
+            CalDAVHandler(context).fetchCalDAVCalendarEvents(calendar.id, localEventType.id, activity)
+        }
+        context.scheduleCalDAVSync(true)
+        callback()
+    }
+
+    fun getCalDAVCalendars(activity: SimpleActivity? = null, ids: String = ""): List<CalDAVCalendar> {
+        val calendars = ArrayList<CalDAVCalendar>()
+        if (!context.hasPermission(PERMISSION_WRITE_CALENDAR) || !context.hasPermission(PERMISSION_READ_CALENDAR)) {
+            return calendars
+        }
+
+        val uri = CalendarContract.Calendars.CONTENT_URI
+        val projection = arrayOf(
+                CalendarContract.Calendars._ID,
+                CalendarContract.Calendars.CALENDAR_DISPLAY_NAME,
+                CalendarContract.Calendars.ACCOUNT_NAME,
+                CalendarContract.Calendars.ACCOUNT_TYPE,
+                CalendarContract.Calendars.OWNER_ACCOUNT,
+                CalendarContract.Calendars.CALENDAR_COLOR,
+                CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL)
+
+        val selection = if (ids.trim().isNotEmpty()) "${CalendarContract.Calendars._ID} IN ($ids)" else null
+        var cursor: Cursor? = null
+        try {
+            cursor = context.contentResolver.query(uri, projection, selection, null, null)
+            if (cursor != null && cursor.moveToFirst()) {
+                do {
+                    val id = cursor.getIntValue(CalendarContract.Calendars._ID)
+                    val displayName = cursor.getStringValue(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME)
+                    val accountName = cursor.getStringValue(CalendarContract.Calendars.ACCOUNT_NAME)
+                    val accountType = cursor.getStringValue(CalendarContract.Calendars.ACCOUNT_TYPE)
+                    val ownerName = cursor.getStringValue(CalendarContract.Calendars.OWNER_ACCOUNT) ?: ""
+                    val color = cursor.getIntValue(CalendarContract.Calendars.CALENDAR_COLOR)
+                    val accessLevel = cursor.getIntValue(CalendarContract.Calendars.CALENDAR_ACCESS_LEVEL)
+                    val calendar = CalDAVCalendar(id, displayName, accountName, accountType, ownerName, color, accessLevel)
+                    calendars.add(calendar)
+                } while (cursor.moveToNext())
+            }
+        } catch (e: Exception) {
+            activity?.showErrorToast(e)
+        } finally {
+            cursor?.close()
+        }
+        return calendars
+    }
+
+    fun updateCalDAVCalendar(eventType: EventType): Boolean {
+        val uri = CalendarContract.Calendars.CONTENT_URI
+        val values = fillCalendarContentValues(eventType)
+        val newUri = ContentUris.withAppendedId(uri, eventType.caldavCalendarId.toLong())
+        return try {
+            context.contentResolver.update(newUri, values, null, null) == 1
+        } catch (e: IllegalArgumentException) {
+            false
+        }
+    }
+
+    private fun fillCalendarContentValues(eventType: EventType): ContentValues {
+        val colorKey = getEventTypeColorKey(eventType)
+        return ContentValues().apply {
+            put(CalendarContract.Calendars.CALENDAR_COLOR_KEY, colorKey)
+            put(CalendarContract.Calendars.CALENDAR_DISPLAY_NAME, eventType.title)
+        }
+    }
+
+    private fun getEventTypeColorKey(eventType: EventType): Int {
+        val uri = CalendarContract.Colors.CONTENT_URI
+        val projection = arrayOf(CalendarContract.Colors.COLOR_KEY)
+        val selection = "${CalendarContract.Colors.COLOR_TYPE} = ? AND ${CalendarContract.Colors.COLOR} = ? AND ${CalendarContract.Colors.ACCOUNT_NAME} = ?"
+        val selectionArgs = arrayOf(CalendarContract.Colors.TYPE_CALENDAR.toString(), eventType.color.toString(), eventType.caldavEmail)
+
+        var cursor: Cursor? = null
+        try {
+            cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
+            if (cursor?.moveToFirst() == true) {
+                return cursor.getStringValue(CalendarContract.Colors.COLOR_KEY).toInt()
+            }
+        } finally {
+            cursor?.close()
+        }
+
+        return -1
+    }
+
+    // it doesnt work properly, needs better SyncAdapter handling
+    private fun insertNewColor(eventType: EventType): Int {
+        val maxId = getMaxColorId(eventType) + 1
+
+        val values = ContentValues().apply {
+            put(CalendarContract.Colors.COLOR_KEY, maxId)
+            put(CalendarContract.Colors.COLOR, eventType.color)
+            put(CalendarContract.Colors.ACCOUNT_NAME, eventType.caldavEmail)
+            put(CalendarContract.Colors.ACCOUNT_TYPE, "com.google")
+            put(CalendarContract.Colors.COLOR_TYPE, CalendarContract.Colors.TYPE_CALENDAR)
+        }
+
+        val uri = CalendarContract.Colors.CONTENT_URI.buildUpon()
+                .appendQueryParameter(CalendarContract.CALLER_IS_SYNCADAPTER, "true")
+                .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_NAME, eventType.caldavEmail)
+                .appendQueryParameter(CalendarContract.Calendars.ACCOUNT_TYPE, "com.google")
+                .build()
+
+        return if (context.contentResolver.insert(uri, values) != null) {
+            maxId
+        } else {
+            0
+        }
+    }
+
+    private fun getMaxColorId(eventType: EventType): Int {
+        val uri = CalendarContract.Colors.CONTENT_URI
+        val projection = arrayOf(CalendarContract.Colors.COLOR_KEY, CalendarContract.Colors.COLOR)
+        val selection = "${CalendarContract.Colors.COLOR_TYPE} = ? AND ${CalendarContract.Colors.ACCOUNT_NAME} = ?"
+        val selectionArgs = arrayOf(CalendarContract.Colors.TYPE_CALENDAR.toString(), eventType.caldavEmail)
+        var maxId = 1
+
+        var cursor: Cursor? = null
+        try {
+            cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
+            if (cursor != null && cursor.moveToFirst()) {
+                do {
+                    maxId = Math.max(maxId, cursor.getIntValue(CalendarContract.Colors.COLOR_KEY))
+                } while (cursor.moveToNext())
+            }
+        } finally {
+            cursor?.close()
+        }
+
+        return maxId
+    }
+
+    fun getAvailableCalDAVCalendarColors(eventType: EventType): ArrayList<Int> {
+        val colors = SparseIntArray()
+        val uri = CalendarContract.Colors.CONTENT_URI
+        val projection = arrayOf(CalendarContract.Colors.COLOR, CalendarContract.Colors.COLOR_KEY)
+        val selection = "${CalendarContract.Colors.COLOR_TYPE} = ? AND ${CalendarContract.Colors.ACCOUNT_NAME} = ?"
+        val selectionArgs = arrayOf(CalendarContract.Colors.TYPE_CALENDAR.toString(), eventType.caldavEmail)
+
+        var cursor: Cursor? = null
+        try {
+            cursor = context.contentResolver.query(uri, projection, selection, selectionArgs, null)
+            if (cursor != null && cursor.moveToFirst()) {
+                do {
+                    val colorKey = cursor.getIntValue(CalendarContract.Colors.COLOR_KEY)
+                    val color = cursor.getIntValue(CalendarContract.Colors.COLOR)
+                    colors.put(colorKey, color)
+                } while (cursor.moveToNext())
+            }
+        } finally {
+            cursor?.close()
+        }
+
+        var sortedColors = ArrayList<Int>(colors.size())
+        (0 until colors.size()).mapTo(sortedColors) { colors[it] }
+        if (sortedColors.isNotEmpty()) {
+            sortedColors = sortedColors.distinct() as ArrayList<Int>
+        }
+
+        return sortedColors
+    }
+
+    private fun fetchCalDAVCalendarEvents(calendarId: Int, eventTypeId: Int, activity: SimpleActivity?) {
+        val importIdsMap = HashMap<String, Event>()
+        val fetchedEventIds = ArrayList<String>()
+        val existingEvents = context.dbHelper.getEventsFromCalDAVCalendar(calendarId)
+        existingEvents.forEach {
+            importIdsMap[it.importId] = it
+        }
+
+        val uri = CalendarContract.Events.CONTENT_URI
+        val projection = arrayOf(
+                CalendarContract.Events._ID,
+                CalendarContract.Events.TITLE,
+                CalendarContract.Events.DESCRIPTION,
+                CalendarContract.Events.DTSTART,
+                CalendarContract.Events.DTEND,
+                CalendarContract.Events.EVENT_TIMEZONE,
+                CalendarContract.Events.DURATION,
+                CalendarContract.Events.ALL_DAY,
+                CalendarContract.Events.RRULE,
+                CalendarContract.Events.ORIGINAL_ID,
+                CalendarContract.Events.ORIGINAL_INSTANCE_TIME,
+                CalendarContract.Events.EVENT_LOCATION)
+
+        val selection = "${CalendarContract.Events.CALENDAR_ID} = $calendarId"
+        var cursor: Cursor? = null
+        try {
+            cursor = context.contentResolver.query(uri, projection, selection, null, null)
+            if (cursor != null && cursor.moveToFirst()) {
+                do {
+                    val id = cursor.getLongValue(CalendarContract.Events._ID)
+                    val title = cursor.getStringValue(CalendarContract.Events.TITLE) ?: ""
+                    val description = cursor.getStringValue(CalendarContract.Events.DESCRIPTION) ?: ""
+                    val startTS = (cursor.getLongValue(CalendarContract.Events.DTSTART) / 1000).toInt()
+                    var endTS = (cursor.getLongValue(CalendarContract.Events.DTEND) / 1000).toInt()
+                    val allDay = cursor.getIntValue(CalendarContract.Events.ALL_DAY)
+                    val rrule = cursor.getStringValue(CalendarContract.Events.RRULE) ?: ""
+                    val location = cursor.getStringValue(CalendarContract.Events.EVENT_LOCATION) ?: ""
+                    val originalId = cursor.getStringValue(CalendarContract.Events.ORIGINAL_ID)
+                    val originalInstanceTime = cursor.getLongValue(CalendarContract.Events.ORIGINAL_INSTANCE_TIME)
+                    val reminders = getCalDAVEventReminders(id)
+
+                    if (endTS == 0) {
+                        val duration = cursor.getStringValue(CalendarContract.Events.DURATION) ?: ""
+                        endTS = startTS + Parser().parseDurationSeconds(duration)
+                    }
+
+                    val importId = getCalDAVEventImportId(calendarId, id)
+                    val source = "$CALDAV-$calendarId"
+                    val repeatRule = Parser().parseRepeatInterval(rrule, startTS)
+                    val event = Event(0, startTS, endTS, title, description, reminders.getOrElse(0, { -1 }),
+                            reminders.getOrElse(1, { -1 }), reminders.getOrElse(2, { -1 }), repeatRule.repeatInterval,
+                            importId, allDay, repeatRule.repeatLimit, repeatRule.repeatRule, eventTypeId, source = source, location = location)
+
+                    if (event.getIsAllDay()) {
+                        event.startTS = Formatter.getShiftedImportTimestamp(event.startTS)
+                        event.endTS = Formatter.getShiftedImportTimestamp(event.endTS)
+                        if (event.endTS > event.startTS) {
+                            event.endTS -= DAY
+                        }
+                    }
+
+                    fetchedEventIds.add(importId)
+                    if (importIdsMap.containsKey(event.importId)) {
+                        val existingEvent = importIdsMap[importId]
+                        val originalEventId = existingEvent!!.id
+
+                        existingEvent.apply {
+                            this.id = 0
+                            color = 0
+                            ignoreEventOccurrences = ArrayList()
+                            lastUpdated = 0L
+                            offset = ""
+                        }
+
+                        if (existingEvent.hashCode() != event.hashCode() && title.isNotEmpty()) {
+                            event.id = originalEventId
+                            context.dbHelper.update(event, false)
+                        }
+                    } else {
+                        // if the event is an exception from another events repeat rule, find the original parent event
+                        if (originalInstanceTime != 0L) {
+                            val parentImportId = "$source-$originalId"
+                            val parentEventId = context.dbHelper.getEventIdWithImportId(parentImportId)
+                            if (parentEventId != 0) {
+                                event.parentId = parentEventId
+                                context.dbHelper.addEventRepeatException(parentEventId, (originalInstanceTime / 1000).toInt(), false, event.importId)
+                            }
+                        }
+
+                        if (title.isNotEmpty()) {
+                            context.dbHelper.insert(event, false) {
+                                importIdsMap[event.importId] = event
+                            }
+                        }
+                    }
+                } while (cursor.moveToNext())
+            }
+        } catch (e: Exception) {
+            activity?.showErrorToast(e)
+        } finally {
+            cursor?.close()
+        }
+
+        val eventIdsToDelete = ArrayList<String>()
+        importIdsMap.keys.filter { !fetchedEventIds.contains(it) }.forEach {
+            val caldavEventId = it
+            existingEvents.forEach {
+                if (it.importId == caldavEventId) {
+                    eventIdsToDelete.add(it.id.toString())
+                }
+            }
+        }
+
+        eventIdsToDelete.forEach {
+            context.dbHelper.deleteEvents(eventIdsToDelete.toTypedArray(), false)
+        }
+    }
+
+    fun insertCalDAVEvent(event: Event) {
+        val uri = CalendarContract.Events.CONTENT_URI
+        val values = fillEventContentValues(event)
+        val newUri = context.contentResolver.insert(uri, values)
+
+        val calendarId = event.getCalDAVCalendarId()
+        val eventRemoteID = java.lang.Long.parseLong(newUri.lastPathSegment)
+        event.importId = getCalDAVEventImportId(calendarId, eventRemoteID)
+
+        setupCalDAVEventReminders(event)
+        setupCalDAVEventImportId(event)
+    }
+
+    fun updateCalDAVEvent(event: Event) {
+        val uri = CalendarContract.Events.CONTENT_URI
+        val values = fillEventContentValues(event)
+        val eventRemoteID = event.getCalDAVEventId()
+        event.importId = getCalDAVEventImportId(event.getCalDAVCalendarId(), eventRemoteID)
+
+        val newUri = ContentUris.withAppendedId(uri, eventRemoteID)
+        context.contentResolver.update(newUri, values, null, null)
+
+        setupCalDAVEventReminders(event)
+        setupCalDAVEventImportId(event)
+    }
+
+    private fun setupCalDAVEventReminders(event: Event) {
+        clearEventReminders(event)
+        event.getReminders().forEach {
+            ContentValues().apply {
+                put(Reminders.MINUTES, it)
+                put(Reminders.EVENT_ID, event.getCalDAVEventId())
+                put(Reminders.METHOD, Reminders.METHOD_ALERT)
+                context.contentResolver.insert(Reminders.CONTENT_URI, this)
+            }
+        }
+    }
+
+    private fun setupCalDAVEventImportId(event: Event) {
+        context.dbHelper.updateEventImportIdAndSource(event.id, event.importId, "$CALDAV-${event.getCalDAVCalendarId()}")
+    }
+
+    private fun fillEventContentValues(event: Event): ContentValues {
+        return ContentValues().apply {
+            put(CalendarContract.Events.CALENDAR_ID, event.getCalDAVCalendarId())
+            put(CalendarContract.Events.TITLE, event.title)
+            put(CalendarContract.Events.DESCRIPTION, event.description)
+            put(CalendarContract.Events.DTSTART, event.startTS * 1000L)
+            put(CalendarContract.Events.ALL_DAY, if (event.getIsAllDay()) 1 else 0)
+            put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().toString())
+            put(CalendarContract.Events.EVENT_LOCATION, event.location)
+            put(CalendarContract.Events.STATUS, CalendarContract.Events.STATUS_CONFIRMED)
+
+            val repeatRule = Parser().getRepeatCode(event)
+            if (repeatRule.isEmpty()) {
+                putNull(CalendarContract.Events.RRULE)
+            } else {
+                put(CalendarContract.Events.RRULE, repeatRule)
+            }
+
+            if (event.getIsAllDay() && event.endTS > event.startTS)
+                event.endTS += DAY
+
+            if (event.repeatInterval > 0) {
+                put(CalendarContract.Events.DURATION, getDurationCode(event))
+                putNull(CalendarContract.Events.DTEND)
+            } else {
+                put(CalendarContract.Events.DTEND, event.endTS * 1000L)
+                putNull(CalendarContract.Events.DURATION)
+            }
+        }
+    }
+
+    private fun clearEventReminders(event: Event) {
+        val selection = "${Reminders.EVENT_ID} = ?"
+        val selectionArgs = arrayOf(event.getCalDAVEventId().toString())
+        context.contentResolver.delete(Reminders.CONTENT_URI, selection, selectionArgs)
+    }
+
+    private fun getDurationCode(event: Event): String {
+        return if (event.getIsAllDay()) {
+            val dur = Math.max(1, (event.endTS - event.startTS) / DAY)
+            "P${dur}D"
+        } else {
+            Parser().getDurationCode((event.endTS - event.startTS) / 60)
+        }
+    }
+
+    fun deleteCalDAVCalendarEvents(calendarId: Long) {
+        val events = context.dbHelper.getCalDAVCalendarEvents(calendarId)
+        val eventIds = events.map { it.id.toString() }.toTypedArray()
+        context.dbHelper.deleteEvents(eventIds, false)
+    }
+
+    fun deleteCalDAVEvent(event: Event) {
+        val uri = CalendarContract.Events.CONTENT_URI
+        val contentUri = ContentUris.withAppendedId(uri, event.getCalDAVEventId())
+        try {
+            context.contentResolver.delete(contentUri, null, null)
+        } catch (ignored: Exception) {
+        }
+    }
+
+    fun insertEventRepeatException(event: Event, occurrenceTS: Int): Long {
+        val uri = CalendarContract.Events.CONTENT_URI
+        val values = fillEventRepeatExceptionValues(event, occurrenceTS)
+        val newUri = context.contentResolver.insert(uri, values)
+        return java.lang.Long.parseLong(newUri.lastPathSegment)
+    }
+
+    private fun fillEventRepeatExceptionValues(event: Event, occurrenceTS: Int): ContentValues {
+        return ContentValues().apply {
+            put(CalendarContract.Events.CALENDAR_ID, event.getCalDAVCalendarId())
+            put(CalendarContract.Events.DTSTART, occurrenceTS)
+            put(CalendarContract.Events.DTEND, occurrenceTS + (event.endTS - event.startTS))
+            put(CalendarContract.Events.ORIGINAL_ID, event.getCalDAVEventId())
+            put(CalendarContract.Events.EVENT_TIMEZONE, TimeZone.getDefault().toString())
+            put(CalendarContract.Events.ORIGINAL_INSTANCE_TIME, occurrenceTS * 1000L)
+        }
+    }
+
+    private fun getCalDAVEventReminders(eventId: Long): List<Int> {
+        val reminders = ArrayList<Int>()
+        val uri = CalendarContract.Reminders.CONTENT_URI
+        val projection = arrayOf(
+                CalendarContract.Reminders.MINUTES,
+                CalendarContract.Reminders.METHOD)
+        val selection = "${CalendarContract.Reminders.EVENT_ID} = $eventId"
+        var cursor: Cursor? = null
+        try {
+            cursor = context.contentResolver.query(uri, projection, selection, null, null)
+            if (cursor != null && cursor.moveToFirst()) {
+                do {
+                    val minutes = cursor.getIntValue(CalendarContract.Reminders.MINUTES)
+                    val method = cursor.getIntValue(CalendarContract.Reminders.METHOD)
+                    if (method == CalendarContract.Reminders.METHOD_ALERT) {
+                        reminders.add(minutes)
+                    }
+                } while (cursor.moveToNext())
+            }
+        } finally {
+            cursor?.close()
+        }
+        return reminders
+    }
+
+    private fun getCalDAVEventImportId(calendarId: Int, eventId: Long) = "$CALDAV-$calendarId-$eventId"
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Config.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Config.kt
new file mode 100644
index 0000000000000000000000000000000000000000..9d6acaa2a0f4236228388a59f3e6dac505acfebd
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Config.kt
@@ -0,0 +1,132 @@
+package com.simplemobiletools.calendar.helpers
+
+import android.content.Context
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.scheduleCalDAVSync
+import com.simplemobiletools.commons.extensions.getDefaultAlarmTitle
+import com.simplemobiletools.commons.extensions.getDefaultAlarmUri
+import com.simplemobiletools.commons.helpers.ALARM_SOUND_TYPE_NOTIFICATION
+import com.simplemobiletools.commons.helpers.BaseConfig
+import com.simplemobiletools.commons.helpers.DAY_MINUTES
+import java.util.*
+
+class Config(context: Context) : BaseConfig(context) {
+    companion object {
+        fun newInstance(context: Context) = Config(context)
+    }
+
+    var showWeekNumbers: Boolean
+        get() = prefs.getBoolean(WEEK_NUMBERS, false)
+        set(showWeekNumbers) = prefs.edit().putBoolean(WEEK_NUMBERS, showWeekNumbers).apply()
+
+    var startWeeklyAt: Int
+        get() = prefs.getInt(START_WEEKLY_AT, 7)
+        set(startWeeklyAt) = prefs.edit().putInt(START_WEEKLY_AT, startWeeklyAt).apply()
+
+    var endWeeklyAt: Int
+        get() = prefs.getInt(END_WEEKLY_AT, 23)
+        set(endWeeklyAt) = prefs.edit().putInt(END_WEEKLY_AT, endWeeklyAt).apply()
+
+    var vibrateOnReminder: Boolean
+        get() = prefs.getBoolean(VIBRATE, false)
+        set(vibrate) = prefs.edit().putBoolean(VIBRATE, vibrate).apply()
+
+    var reminderSoundUri: String
+        get() = prefs.getString(REMINDER_SOUND_URI, context.getDefaultAlarmUri(ALARM_SOUND_TYPE_NOTIFICATION).toString())
+        set(reminderSoundUri) = prefs.edit().putString(REMINDER_SOUND_URI, reminderSoundUri).apply()
+
+    var reminderSoundTitle: String
+        get() = prefs.getString(REMINDER_SOUND_TITLE, context.getDefaultAlarmTitle(ALARM_SOUND_TYPE_NOTIFICATION))
+        set(reminderSoundTitle) = prefs.edit().putString(REMINDER_SOUND_TITLE, reminderSoundTitle).apply()
+
+    var storedView: Int
+        get() = prefs.getInt(VIEW, MONTHLY_VIEW)
+        set(view) = prefs.edit().putInt(VIEW, view).apply()
+
+    var defaultReminderMinutes: Int
+        get() = prefs.getInt(REMINDER_MINUTES, 10)
+        set(defaultReminderMinutes) = prefs.edit().putInt(REMINDER_MINUTES, defaultReminderMinutes).apply()
+
+    var defaultReminderMinutes2: Int
+        get() = prefs.getInt(REMINDER_MINUTES_2, REMINDER_OFF)
+        set(defaultReminderMinutes2) = prefs.edit().putInt(REMINDER_MINUTES_2, defaultReminderMinutes2).apply()
+
+    var defaultReminderMinutes3: Int
+        get() = prefs.getInt(REMINDER_MINUTES_3, REMINDER_OFF)
+        set(defaultReminderMinutes3) = prefs.edit().putInt(REMINDER_MINUTES_3, defaultReminderMinutes3).apply()
+
+    var displayPastEvents: Int
+        get() = prefs.getInt(DISPLAY_PAST_EVENTS, DAY_MINUTES)
+        set(displayPastEvents) = prefs.edit().putInt(DISPLAY_PAST_EVENTS, displayPastEvents).apply()
+
+    var displayEventTypes: Set<String>
+        get() = prefs.getStringSet(DISPLAY_EVENT_TYPES, HashSet<String>())
+        set(displayEventTypes) = prefs.edit().remove(DISPLAY_EVENT_TYPES).putStringSet(DISPLAY_EVENT_TYPES, displayEventTypes).apply()
+
+    var fontSize: Int
+        get() = prefs.getInt(FONT_SIZE, FONT_SIZE_MEDIUM)
+        set(size) = prefs.edit().putInt(FONT_SIZE, size).apply()
+
+    var caldavSync: Boolean
+        get() = prefs.getBoolean(CALDAV_SYNC, false)
+        set(caldavSync) {
+            context.scheduleCalDAVSync(caldavSync)
+            prefs.edit().putBoolean(CALDAV_SYNC, caldavSync).apply()
+        }
+
+    var caldavSyncedCalendarIDs: String
+        get() = prefs.getString(CALDAV_SYNCED_CALENDAR_IDS, "")
+        set(calendarIDs) = prefs.edit().putString(CALDAV_SYNCED_CALENDAR_IDS, calendarIDs).apply()
+
+    var lastUsedCaldavCalendarId: Int
+        get() = prefs.getInt(LAST_USED_CALDAV_CALENDAR, getSyncedCalendarIdsAsList().first().toInt())
+        set(calendarId) = prefs.edit().putInt(LAST_USED_CALDAV_CALENDAR, calendarId).apply()
+
+    var lastUsedLocalEventTypeId: Int
+        get() = prefs.getInt(LAST_USED_LOCAL_EVENT_TYPE_ID, DBHelper.REGULAR_EVENT_TYPE_ID)
+        set(lastUsedLocalEventTypeId) = prefs.edit().putInt(LAST_USED_LOCAL_EVENT_TYPE_ID, lastUsedLocalEventTypeId).apply()
+
+    var replaceDescription: Boolean
+        get() = prefs.getBoolean(REPLACE_DESCRIPTION, false)
+        set(replaceDescription) = prefs.edit().putBoolean(REPLACE_DESCRIPTION, replaceDescription).apply()
+
+    var showGrid: Boolean
+        get() = prefs.getBoolean(SHOW_GRID, false)
+        set(showGrid) = prefs.edit().putBoolean(SHOW_GRID, showGrid).apply()
+
+    var loopReminders: Boolean
+        get() = prefs.getBoolean(LOOP_REMINDERS, false)
+        set(loopReminders) = prefs.edit().putBoolean(LOOP_REMINDERS, loopReminders).apply()
+
+    var dimPastEvents: Boolean
+        get() = prefs.getBoolean(DIM_PAST_EVENTS, true)
+        set(dimPastEvents) = prefs.edit().putBoolean(DIM_PAST_EVENTS, dimPastEvents).apply()
+
+    fun getSyncedCalendarIdsAsList() = caldavSyncedCalendarIDs.split(",").filter { it.trim().isNotEmpty() } as ArrayList<String>
+
+    fun addDisplayEventType(type: String) {
+        addDisplayEventTypes(HashSet<String>(Arrays.asList(type)))
+    }
+
+    private fun addDisplayEventTypes(types: Set<String>) {
+        val currDisplayEventTypes = HashSet<String>(displayEventTypes)
+        currDisplayEventTypes.addAll(types)
+        displayEventTypes = currDisplayEventTypes
+    }
+
+    fun removeDisplayEventTypes(types: Set<String>) {
+        val currDisplayEventTypes = HashSet<String>(displayEventTypes)
+        currDisplayEventTypes.removeAll(types)
+        displayEventTypes = currDisplayEventTypes
+    }
+
+    fun getFontSize() = when (fontSize) {
+        FONT_SIZE_SMALL -> getSmallFontSize()
+        FONT_SIZE_MEDIUM -> getMediumFontSize()
+        else -> getLargeFontSize()
+    }
+
+    private fun getSmallFontSize() = getMediumFontSize() - 3f
+    private fun getMediumFontSize() = context.resources.getDimension(R.dimen.day_text_size) / context.resources.displayMetrics.density
+    private fun getLargeFontSize() = getMediumFontSize() + 3f
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Constants.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Constants.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c6dd89719d53c13b852764191e46e5f9863a7291
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Constants.kt
@@ -0,0 +1,126 @@
+package com.simplemobiletools.calendar.helpers
+
+const val LOW_ALPHA = .3f
+const val MEDIUM_ALPHA = .6f
+const val STORED_LOCALLY_ONLY = 0
+
+const val DAY_CODE = "day_code"
+const val YEAR_LABEL = "year"
+const val EVENT_ID = "event_id"
+const val IS_DUPLICATE_INTENT = "is_duplicate_intent"
+const val EVENT_OCCURRENCE_TS = "event_occurrence_ts"
+const val NEW_EVENT_START_TS = "new_event_start_ts"
+const val WEEK_START_TIMESTAMP = "week_start_timestamp"
+const val NEW_EVENT_SET_HOUR_DURATION = "new_event_set_hour_duration"
+const val WEEK_START_DATE_TIME = "week_start_date_time"
+const val CALDAV = "Caldav"
+const val OPEN_MONTH = "open_month"
+
+const val MONTHLY_VIEW = 1
+const val YEARLY_VIEW = 2
+const val EVENTS_LIST_VIEW = 3
+const val WEEKLY_VIEW = 4
+const val DAILY_VIEW = 5
+
+const val REMINDER_OFF = -1
+
+const val DAY = 86400
+const val WEEK = 604800
+const val MONTH = 2592001    // exact value not taken into account, Joda is used for adding months and years
+const val YEAR = 31536000
+
+// Shared Preferences
+const val WEEK_NUMBERS = "week_numbers"
+const val START_WEEKLY_AT = "start_weekly_at"
+const val END_WEEKLY_AT = "end_weekly_at"
+const val VIBRATE = "vibrate"
+const val REMINDER_SOUND_URI = "reminder_sound_uri"
+const val REMINDER_SOUND_TITLE = "reminder_sound_title"
+const val VIEW = "view"
+const val REMINDER_MINUTES = "reminder_minutes"
+const val REMINDER_MINUTES_2 = "reminder_minutes_2"
+const val REMINDER_MINUTES_3 = "reminder_minutes_3"
+const val DISPLAY_EVENT_TYPES = "display_event_types"
+const val FONT_SIZE = "font_size"
+const val CALDAV_SYNC = "caldav_sync"
+const val CALDAV_SYNCED_CALENDAR_IDS = "caldav_synced_calendar_ids"
+const val LAST_USED_CALDAV_CALENDAR = "last_used_caldav_calendar"
+const val LAST_USED_LOCAL_EVENT_TYPE_ID = "last_used_local_event_type_id"
+const val DISPLAY_PAST_EVENTS = "display_past_events"
+const val REPLACE_DESCRIPTION = "replace_description"
+const val SHOW_GRID = "show_grid"
+const val LOOP_REMINDERS = "loop_reminders"
+const val DIM_PAST_EVENTS = "dim_past_events"
+
+// repeat_rule for monthly and yearly repetition
+const val REPEAT_SAME_DAY = 1                           // i.e. 25th every month, or 3rd june (if yearly repetition)
+const val REPEAT_ORDER_WEEKDAY_USE_LAST = 2             // i.e. every last sunday. 4th if a month has 4 sundays, 5th if 5 (or last sunday in june, if yearly)
+const val REPEAT_LAST_DAY = 3                           // i.e. every last day of the month
+const val REPEAT_ORDER_WEEKDAY = 4                      // i.e. every 4th sunday, even if a month has 4 sundays only (will stay 4th even at months with 5)
+
+// special event flags
+const val FLAG_ALL_DAY = 1
+
+// constants related to ICS file exporting / importing
+const val BEGIN_CALENDAR = "BEGIN:VCALENDAR"
+const val END_CALENDAR = "END:VCALENDAR"
+const val CALENDAR_PRODID = "PRODID:-//Simple Mobile Tools//NONSGML Event Calendar//EN"
+const val CALENDAR_VERSION = "VERSION:2.0"
+const val BEGIN_EVENT = "BEGIN:VEVENT"
+const val END_EVENT = "END:VEVENT"
+const val BEGIN_ALARM = "BEGIN:VALARM"
+const val END_ALARM = "END:VALARM"
+const val DTSTART = "DTSTART"
+const val DTEND = "DTEND"
+const val LAST_MODIFIED = "LAST-MODIFIED"
+const val DURATION = "DURATION:"
+const val SUMMARY = "SUMMARY"
+const val DESCRIPTION = "DESCRIPTION:"
+const val UID = "UID:"
+const val ACTION = "ACTION:"
+const val TRIGGER = "TRIGGER:"
+const val RRULE = "RRULE:"
+const val CATEGORIES = "CATEGORIES:"
+const val STATUS = "STATUS:"
+const val EXDATE = "EXDATE"
+const val BYDAY = "BYDAY"
+const val BYMONTHDAY = "BYMONTHDAY"
+const val BYMONTH = "BYMONTH"
+const val LOCATION = "LOCATION"
+
+// this tag isn't a standard ICS tag, but there's no official way of adding a category color in an ics file
+const val CATEGORY_COLOR = "CATEGORY_COLOR:"
+
+const val DISPLAY = "DISPLAY"
+const val FREQ = "FREQ"
+const val UNTIL = "UNTIL"
+const val COUNT = "COUNT"
+const val INTERVAL = "INTERVAL"
+const val CONFIRMED = "CONFIRMED"
+const val VALUE = "VALUE"
+const val DATE = "DATE"
+
+const val DAILY = "DAILY"
+const val WEEKLY = "WEEKLY"
+const val MONTHLY = "MONTHLY"
+const val YEARLY = "YEARLY"
+
+const val MO = "MO"
+const val TU = "TU"
+const val WE = "WE"
+const val TH = "TH"
+const val FR = "FR"
+const val SA = "SA"
+const val SU = "SU"
+
+// font sizes
+const val FONT_SIZE_SMALL = 0
+const val FONT_SIZE_MEDIUM = 1
+const val FONT_SIZE_LARGE = 2
+
+const val SOURCE_SIMPLE_CALENDAR = "simple-calendar"
+const val SOURCE_IMPORTED_ICS = "imported-ics"
+const val SOURCE_CONTACT_BIRTHDAY = "contact-birthday"
+const val SOURCE_CONTACT_ANNIVERSARY = "contact-anniversary"
+
+fun getNowSeconds() = (System.currentTimeMillis() / 1000).toInt()
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/DBHelper.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/DBHelper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..4bf65c12100fe1456ae520821cfe36dd915829fc
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/DBHelper.kt
@@ -0,0 +1,1052 @@
+package com.simplemobiletools.calendar.helpers
+
+import android.content.ContentValues
+import android.content.Context
+import android.database.Cursor
+import android.database.sqlite.SQLiteDatabase
+import android.database.sqlite.SQLiteException
+import android.database.sqlite.SQLiteOpenHelper
+import android.database.sqlite.SQLiteQueryBuilder
+import android.text.TextUtils
+import android.util.SparseIntArray
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.*
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.commons.extensions.getIntValue
+import com.simplemobiletools.commons.extensions.getLongValue
+import com.simplemobiletools.commons.extensions.getStringValue
+import org.joda.time.DateTime
+import java.util.*
+import kotlin.collections.ArrayList
+
+class DBHelper private constructor(val context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {
+    private val MAIN_TABLE_NAME = "events"
+    private val COL_ID = "id"
+    private val COL_START_TS = "start_ts"
+    private val COL_END_TS = "end_ts"
+    private val COL_TITLE = "title"
+    private val COL_DESCRIPTION = "description"
+    private val COL_REMINDER_MINUTES = "reminder_minutes"
+    private val COL_REMINDER_MINUTES_2 = "reminder_minutes_2"
+    private val COL_REMINDER_MINUTES_3 = "reminder_minutes_3"
+    private val COL_IMPORT_ID = "import_id"
+    private val COL_FLAGS = "flags"
+    private val COL_EVENT_TYPE = "event_type"
+    private val COL_OFFSET = "offset"
+    private val COL_IS_DST_INCLUDED = "is_dst_included"
+    private val COL_LAST_UPDATED = "last_updated"
+    private val COL_EVENT_SOURCE = "event_source"
+    private val COL_LOCATION = "location"
+
+    private val META_TABLE_NAME = "events_meta"
+    private val COL_EVENT_ID = "event_id"
+    private val COL_REPEAT_START = "repeat_start"
+    private val COL_REPEAT_INTERVAL = "repeat_interval"
+    private val COL_REPEAT_RULE = "repeat_rule"
+    private val COL_REPEAT_LIMIT = "repeat_limit"
+
+    private val TYPES_TABLE_NAME = "event_types"
+    private val COL_TYPE_ID = "event_type_id"
+    private val COL_TYPE_TITLE = "event_type_title"
+    private val COL_TYPE_COLOR = "event_type_color"
+    private val COL_TYPE_CALDAV_CALENDAR_ID = "event_caldav_calendar_id"
+    private val COL_TYPE_CALDAV_DISPLAY_NAME = "event_caldav_display_name"
+    private val COL_TYPE_CALDAV_EMAIL = "event_caldav_email"
+
+    private val EXCEPTIONS_TABLE_NAME = "event_repeat_exceptions"
+    private val COL_EXCEPTION_ID = "event_exception_id"
+    private val COL_OCCURRENCE_TIMESTAMP = "event_occurrence_timestamp"
+    private val COL_OCCURRENCE_DAYCODE = "event_occurrence_daycode"
+    private val COL_PARENT_EVENT_ID = "event_parent_id"
+    private val COL_CHILD_EVENT_ID = "event_child_id"
+
+    private val mDb: SQLiteDatabase = writableDatabase
+
+    companion object {
+        private const val DB_VERSION = 19
+        const val DB_NAME = "events.db"
+        const val REGULAR_EVENT_TYPE_ID = 1
+        var dbInstance: DBHelper? = null
+
+        fun newInstance(context: Context): DBHelper {
+            if (dbInstance == null)
+                dbInstance = DBHelper(context)
+
+            return dbInstance!!
+        }
+    }
+
+    override fun onCreate(db: SQLiteDatabase) {
+        db.execSQL("CREATE TABLE $MAIN_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_START_TS INTEGER, $COL_END_TS INTEGER, " +
+                "$COL_TITLE TEXT, $COL_DESCRIPTION TEXT, $COL_REMINDER_MINUTES INTEGER, $COL_REMINDER_MINUTES_2 INTEGER, $COL_REMINDER_MINUTES_3 INTEGER, " +
+                "$COL_IMPORT_ID TEXT, $COL_FLAGS INTEGER, $COL_EVENT_TYPE INTEGER NOT NULL DEFAULT $REGULAR_EVENT_TYPE_ID, " +
+                "$COL_PARENT_EVENT_ID INTEGER, $COL_OFFSET TEXT, $COL_IS_DST_INCLUDED INTEGER, $COL_LAST_UPDATED INTEGER, $COL_EVENT_SOURCE TEXT, " +
+                "$COL_LOCATION TEXT)")
+
+        createMetaTable(db)
+        createTypesTable(db)
+        createExceptionsTable(db)
+    }
+
+    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
+        if (oldVersion == 1) {
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_REMINDER_MINUTES INTEGER DEFAULT -1")
+        }
+
+        if (oldVersion < 3) {
+            createMetaTable(db)
+        }
+
+        if (oldVersion < 4) {
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_IMPORT_ID TEXT DEFAULT ''")
+        }
+
+        if (oldVersion < 5) {
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_FLAGS INTEGER NOT NULL DEFAULT 0")
+            db.execSQL("ALTER TABLE $META_TABLE_NAME ADD COLUMN $COL_REPEAT_LIMIT INTEGER NOT NULL DEFAULT 0")
+        }
+
+        if (oldVersion < 6) {
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_REMINDER_MINUTES_2 INTEGER NOT NULL DEFAULT -1")
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_REMINDER_MINUTES_3 INTEGER NOT NULL DEFAULT -1")
+        }
+
+        if (oldVersion < 7) {
+            createTypesTable(db)
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_EVENT_TYPE INTEGER NOT NULL DEFAULT $REGULAR_EVENT_TYPE_ID")
+        }
+
+        if (oldVersion < 8) {
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_PARENT_EVENT_ID INTEGER NOT NULL DEFAULT 0")
+            createExceptionsTable(db)
+        }
+
+        if (oldVersion < 9) {
+            try {
+                db.execSQL("ALTER TABLE $EXCEPTIONS_TABLE_NAME ADD COLUMN $COL_OCCURRENCE_DAYCODE INTEGER NOT NULL DEFAULT 0")
+            } catch (ignored: SQLiteException) {
+            }
+            convertExceptionTimestampToDaycode(db)
+        }
+
+        if (oldVersion < 11) {
+            db.execSQL("ALTER TABLE $META_TABLE_NAME ADD COLUMN $COL_REPEAT_RULE INTEGER NOT NULL DEFAULT 0")
+            setupRepeatRules(db)
+        }
+
+        if (oldVersion < 12) {
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_OFFSET TEXT DEFAULT ''")
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_IS_DST_INCLUDED INTEGER NOT NULL DEFAULT 0")
+        }
+
+        if (oldVersion < 13) {
+            try {
+                createExceptionsTable(db)
+            } catch (e: Exception) {
+                try {
+                    db.execSQL("ALTER TABLE $EXCEPTIONS_TABLE_NAME ADD COLUMN $COL_CHILD_EVENT_ID INTEGER NOT NULL DEFAULT 0")
+                } catch (e: Exception) {
+
+                }
+            }
+        }
+
+        if (oldVersion < 14) {
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_LAST_UPDATED INTEGER NOT NULL DEFAULT 0")
+        }
+
+        if (oldVersion < 15) {
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_EVENT_SOURCE TEXT DEFAULT ''")
+        }
+
+        if (oldVersion in 7..15) {
+            db.execSQL("ALTER TABLE $TYPES_TABLE_NAME ADD COLUMN $COL_TYPE_CALDAV_CALENDAR_ID INTEGER NOT NULL DEFAULT 0")
+        }
+
+        if (oldVersion in 7..17) {
+            db.execSQL("ALTER TABLE $TYPES_TABLE_NAME ADD COLUMN $COL_TYPE_CALDAV_DISPLAY_NAME TEXT DEFAULT ''")
+            db.execSQL("ALTER TABLE $TYPES_TABLE_NAME ADD COLUMN $COL_TYPE_CALDAV_EMAIL TEXT DEFAULT ''")
+        }
+
+        if (oldVersion < 18) {
+            updateOldMonthlyEvents(db)
+        }
+
+        if (oldVersion < 19) {
+            db.execSQL("ALTER TABLE $MAIN_TABLE_NAME ADD COLUMN $COL_LOCATION TEXT DEFAULT ''")
+        }
+    }
+
+    private fun createMetaTable(db: SQLiteDatabase) {
+        db.execSQL("CREATE TABLE $META_TABLE_NAME ($COL_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_EVENT_ID INTEGER UNIQUE, $COL_REPEAT_START INTEGER, " +
+                "$COL_REPEAT_INTERVAL INTEGER, $COL_REPEAT_LIMIT INTEGER, $COL_REPEAT_RULE INTEGER)")
+    }
+
+    private fun createTypesTable(db: SQLiteDatabase) {
+        db.execSQL("CREATE TABLE $TYPES_TABLE_NAME ($COL_TYPE_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_TYPE_TITLE TEXT, $COL_TYPE_COLOR INTEGER, " +
+                "$COL_TYPE_CALDAV_CALENDAR_ID INTEGER, $COL_TYPE_CALDAV_DISPLAY_NAME TEXT, $COL_TYPE_CALDAV_EMAIL TEXT)")
+        addRegularEventType(db)
+    }
+
+    private fun createExceptionsTable(db: SQLiteDatabase) {
+        db.execSQL("CREATE TABLE $EXCEPTIONS_TABLE_NAME ($COL_EXCEPTION_ID INTEGER PRIMARY KEY AUTOINCREMENT, $COL_PARENT_EVENT_ID INTEGER, " +
+                "$COL_OCCURRENCE_TIMESTAMP INTEGER, $COL_OCCURRENCE_DAYCODE INTEGER, $COL_CHILD_EVENT_ID INTEGER)")
+    }
+
+    private fun addRegularEventType(db: SQLiteDatabase) {
+        val regularEvent = context.resources.getString(R.string.regular_event)
+        val eventType = EventType(REGULAR_EVENT_TYPE_ID, regularEvent, context.config.primaryColor)
+        addEventType(eventType, db)
+    }
+
+    fun insert(event: Event, addToCalDAV: Boolean, callback: (id: Int) -> Unit) {
+        if (event.startTS > event.endTS) {
+            callback(0)
+            return
+        }
+
+        val eventValues = fillEventValues(event)
+        val id = mDb.insert(MAIN_TABLE_NAME, null, eventValues)
+        event.id = id.toInt()
+
+        if (event.repeatInterval != 0 && event.parentId == 0) {
+            val metaValues = fillMetaValues(event)
+            mDb.insert(META_TABLE_NAME, null, metaValues)
+        }
+
+        context.updateWidgets()
+        context.scheduleNextEventReminder(event, this)
+
+        if (addToCalDAV && event.source != SOURCE_SIMPLE_CALENDAR && context.config.caldavSync) {
+            CalDAVHandler(context).insertCalDAVEvent(event)
+        }
+
+        callback(event.id)
+    }
+
+    fun insertEvents(events: ArrayList<Event>, addToCalDAV: Boolean) {
+        mDb.beginTransaction()
+        try {
+            for (event in events) {
+                if (event.startTS > event.endTS) {
+                    continue
+                }
+
+                val eventValues = fillEventValues(event)
+                val id = mDb.insert(MAIN_TABLE_NAME, null, eventValues)
+                event.id = id.toInt()
+
+                if (event.repeatInterval != 0 && event.parentId == 0) {
+                    val metaValues = fillMetaValues(event)
+                    mDb.insert(META_TABLE_NAME, null, metaValues)
+                }
+
+                context.scheduleNextEventReminder(event, this)
+                if (addToCalDAV && event.source != SOURCE_SIMPLE_CALENDAR && event.source != SOURCE_IMPORTED_ICS && context.config.caldavSync) {
+                    CalDAVHandler(context).insertCalDAVEvent(event)
+                }
+            }
+            mDb.setTransactionSuccessful()
+        } finally {
+            mDb.endTransaction()
+            context.updateWidgets()
+        }
+    }
+
+    fun update(event: Event, updateAtCalDAV: Boolean, callback: (() -> Unit)? = null) {
+        val values = fillEventValues(event)
+        val selection = "$COL_ID = ?"
+        val selectionArgs = arrayOf(event.id.toString())
+        mDb.update(MAIN_TABLE_NAME, values, selection, selectionArgs)
+
+        if (event.repeatInterval == 0) {
+            val metaSelection = "$COL_EVENT_ID = ?"
+            mDb.delete(META_TABLE_NAME, metaSelection, selectionArgs)
+        } else {
+            val metaValues = fillMetaValues(event)
+            mDb.insertWithOnConflict(META_TABLE_NAME, null, metaValues, SQLiteDatabase.CONFLICT_REPLACE)
+        }
+
+        context.updateWidgets()
+        context.scheduleNextEventReminder(event, this)
+        if (updateAtCalDAV && event.source != SOURCE_SIMPLE_CALENDAR && context.config.caldavSync) {
+            CalDAVHandler(context).updateCalDAVEvent(event)
+        }
+        callback?.invoke()
+    }
+
+    private fun fillEventValues(event: Event): ContentValues {
+        return ContentValues().apply {
+            put(COL_START_TS, event.startTS)
+            put(COL_END_TS, event.endTS)
+            put(COL_TITLE, event.title)
+            put(COL_DESCRIPTION, event.description)
+            put(COL_REMINDER_MINUTES, event.reminder1Minutes)
+            put(COL_REMINDER_MINUTES_2, event.reminder2Minutes)
+            put(COL_REMINDER_MINUTES_3, event.reminder3Minutes)
+            put(COL_IMPORT_ID, event.importId)
+            put(COL_FLAGS, event.flags)
+            put(COL_EVENT_TYPE, event.eventType)
+            put(COL_PARENT_EVENT_ID, event.parentId)
+            put(COL_OFFSET, event.offset)
+            put(COL_IS_DST_INCLUDED, if (event.isDstIncluded) 1 else 0)
+            put(COL_LAST_UPDATED, event.lastUpdated)
+            put(COL_EVENT_SOURCE, event.source)
+            put(COL_LOCATION, event.location)
+        }
+    }
+
+    private fun fillMetaValues(event: Event): ContentValues {
+        return ContentValues().apply {
+            put(COL_EVENT_ID, event.id)
+            put(COL_REPEAT_START, event.startTS)
+            put(COL_REPEAT_INTERVAL, event.repeatInterval)
+            put(COL_REPEAT_LIMIT, event.repeatLimit)
+            put(COL_REPEAT_RULE, event.repeatRule)
+        }
+    }
+
+    private fun addEventType(eventType: EventType, db: SQLiteDatabase) {
+        insertEventType(eventType, db)
+    }
+
+    fun insertEventType(eventType: EventType, db: SQLiteDatabase = mDb): Int {
+        val values = fillEventTypeValues(eventType)
+        val insertedId = db.insert(TYPES_TABLE_NAME, null, values).toInt()
+        context.config.addDisplayEventType(insertedId.toString())
+        return insertedId
+    }
+
+    fun updateEventType(eventType: EventType): Int {
+        return if (eventType.caldavCalendarId != 0) {
+            if (CalDAVHandler(context).updateCalDAVCalendar(eventType)) {
+                updateLocalEventType(eventType)
+            } else {
+                -1
+            }
+        } else {
+            updateLocalEventType(eventType)
+        }
+    }
+
+    fun updateLocalEventType(eventType: EventType): Int {
+        val selectionArgs = arrayOf(eventType.id.toString())
+        val values = fillEventTypeValues(eventType)
+        val selection = "$COL_TYPE_ID = ?"
+        return mDb.update(TYPES_TABLE_NAME, values, selection, selectionArgs)
+    }
+
+    private fun fillEventTypeValues(eventType: EventType): ContentValues {
+        return ContentValues().apply {
+            put(COL_TYPE_TITLE, eventType.title)
+            put(COL_TYPE_COLOR, eventType.color)
+            put(COL_TYPE_CALDAV_CALENDAR_ID, eventType.caldavCalendarId)
+            put(COL_TYPE_CALDAV_DISPLAY_NAME, eventType.caldavDisplayName)
+            put(COL_TYPE_CALDAV_EMAIL, eventType.caldavEmail)
+        }
+    }
+
+    private fun fillExceptionValues(parentEventId: Int, occurrenceTS: Int, addToCalDAV: Boolean, childImportId: String?, callback: (values: ContentValues) -> Unit) {
+        val childEvent = getEventWithId(parentEventId)
+        if (childEvent == null) {
+            callback(ContentValues())
+            return
+        }
+
+        childEvent.apply {
+            id = 0
+            parentId = parentEventId
+            startTS = 0
+            endTS = 0
+            if (childImportId != null) {
+                importId = childImportId
+            }
+        }
+
+        insert(childEvent, false) {
+            val childEventId = it
+            val exceptionValues = ContentValues().apply {
+                put(COL_PARENT_EVENT_ID, parentEventId)
+                put(COL_OCCURRENCE_TIMESTAMP, occurrenceTS)
+                put(COL_OCCURRENCE_DAYCODE, Formatter.getDayCodeFromTS(occurrenceTS))
+                put(COL_CHILD_EVENT_ID, childEventId)
+            }
+            callback(exceptionValues)
+
+            Thread {
+                if (addToCalDAV && context.config.caldavSync) {
+                    val parentEvent = getEventWithId(parentEventId)
+                    if (parentEvent != null) {
+                        val newId = CalDAVHandler(context).insertEventRepeatException(parentEvent, occurrenceTS)
+                        val newImportId = "${parentEvent.source}-$newId"
+                        updateEventImportIdAndSource(childEventId, newImportId, parentEvent.source)
+                    }
+                }
+            }.start()
+        }
+    }
+
+    fun getEventTypeIdWithTitle(title: String): Int {
+        val cols = arrayOf(COL_TYPE_ID)
+        val selection = "$COL_TYPE_TITLE = ? COLLATE NOCASE"
+        val selectionArgs = arrayOf(title)
+        var cursor: Cursor? = null
+        try {
+            cursor = mDb.query(TYPES_TABLE_NAME, cols, selection, selectionArgs, null, null, null)
+            if (cursor?.moveToFirst() == true) {
+                return cursor.getIntValue(COL_TYPE_ID)
+            }
+        } finally {
+            cursor?.close()
+        }
+        return -1
+    }
+
+    fun getEventTypeWithCalDAVCalendarId(calendarId: Int): EventType? {
+        val cols = arrayOf(COL_TYPE_ID)
+        val selection = "$COL_TYPE_CALDAV_CALENDAR_ID = ?"
+        val selectionArgs = arrayOf(calendarId.toString())
+        var cursor: Cursor? = null
+        try {
+            cursor = mDb.query(TYPES_TABLE_NAME, cols, selection, selectionArgs, null, null, null)
+            if (cursor?.moveToFirst() == true) {
+                return getEventType(cursor.getIntValue(COL_TYPE_ID))
+            }
+        } finally {
+            cursor?.close()
+        }
+        return null
+    }
+
+    fun getEventType(id: Int): EventType? {
+        val cols = arrayOf(COL_TYPE_TITLE, COL_TYPE_COLOR, COL_TYPE_CALDAV_CALENDAR_ID, COL_TYPE_CALDAV_DISPLAY_NAME, COL_TYPE_CALDAV_EMAIL)
+        val selection = "$COL_TYPE_ID = ?"
+        val selectionArgs = arrayOf(id.toString())
+        var cursor: Cursor? = null
+        try {
+            cursor = mDb.query(TYPES_TABLE_NAME, cols, selection, selectionArgs, null, null, null)
+            if (cursor?.moveToFirst() == true) {
+                val title = cursor.getStringValue(COL_TYPE_TITLE)
+                val color = cursor.getIntValue(COL_TYPE_COLOR)
+                val calendarId = cursor.getIntValue(COL_TYPE_CALDAV_CALENDAR_ID)
+                val displayName = cursor.getStringValue(COL_TYPE_CALDAV_DISPLAY_NAME)
+                val email = cursor.getStringValue(COL_TYPE_CALDAV_EMAIL)
+                return EventType(id, title, color, calendarId, displayName, email)
+            }
+        } finally {
+            cursor?.close()
+        }
+        return null
+    }
+
+    fun getBirthdays(): List<Event> {
+        val selection = "$MAIN_TABLE_NAME.$COL_EVENT_SOURCE = ?"
+        val selectionArgs = arrayOf(SOURCE_CONTACT_BIRTHDAY)
+        val cursor = getEventsCursor(selection, selectionArgs)
+        return fillEvents(cursor)
+    }
+
+    fun getAnniversaries(): List<Event> {
+        val selection = "$MAIN_TABLE_NAME.$COL_EVENT_SOURCE = ?"
+        val selectionArgs = arrayOf(SOURCE_CONTACT_ANNIVERSARY)
+        val cursor = getEventsCursor(selection, selectionArgs)
+        return fillEvents(cursor)
+    }
+
+    fun deleteAllEvents() {
+        val cursor = getEventsCursor()
+        val events = fillEvents(cursor).map { it.id.toString() }.toTypedArray()
+        deleteEvents(events, true)
+    }
+
+    fun deleteEvents(ids: Array<String>, deleteFromCalDAV: Boolean) {
+        val args = TextUtils.join(", ", ids)
+        val selection = "$MAIN_TABLE_NAME.$COL_ID IN ($args)"
+        val cursor = getEventsCursor(selection)
+        val events = fillEvents(cursor).filter { it.importId.isNotEmpty() }
+
+        mDb.delete(MAIN_TABLE_NAME, selection, null)
+
+        val metaSelection = "$COL_EVENT_ID IN ($args)"
+        mDb.delete(META_TABLE_NAME, metaSelection, null)
+
+        val exceptionSelection = "$COL_PARENT_EVENT_ID IN ($args)"
+        mDb.delete(EXCEPTIONS_TABLE_NAME, exceptionSelection, null)
+
+        context.updateWidgets()
+
+        ids.forEach {
+            context.cancelNotification(it.toInt())
+        }
+
+        if (deleteFromCalDAV && context.config.caldavSync) {
+            events.forEach {
+                CalDAVHandler(context).deleteCalDAVEvent(it)
+            }
+        }
+
+        deleteChildEvents(args, deleteFromCalDAV)
+    }
+
+    private fun deleteChildEvents(ids: String, deleteFromCalDAV: Boolean) {
+        val projection = arrayOf(COL_ID)
+        val selection = "$COL_PARENT_EVENT_ID IN ($ids)"
+        val childIds = ArrayList<String>()
+
+        var cursor: Cursor? = null
+        try {
+            cursor = mDb.query(MAIN_TABLE_NAME, projection, selection, null, null, null, null)
+            if (cursor?.moveToFirst() == true) {
+                do {
+                    childIds.add(cursor.getStringValue(COL_ID))
+                } while (cursor.moveToNext())
+            }
+        } finally {
+            cursor?.close()
+        }
+
+        if (childIds.isNotEmpty())
+            deleteEvents(childIds.toTypedArray(), deleteFromCalDAV)
+    }
+
+    fun getCalDAVCalendarEvents(calendarId: Long): List<Event> {
+        val selection = "$MAIN_TABLE_NAME.$COL_EVENT_SOURCE = (?)"
+        val selectionArgs = arrayOf("$CALDAV-$calendarId")
+        val cursor = getEventsCursor(selection, selectionArgs)
+        return fillEvents(cursor).filter { it.importId.isNotEmpty() }
+    }
+
+    private fun updateOldMonthlyEvents(db: SQLiteDatabase) {
+        val OLD_MONTH = 2592000
+        val projection = arrayOf(COL_ID, COL_REPEAT_INTERVAL)
+        val selection = "$COL_REPEAT_INTERVAL != 0 AND $COL_REPEAT_INTERVAL % $OLD_MONTH == 0"
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(META_TABLE_NAME, projection, selection, null, null, null, null)
+            if (cursor?.moveToFirst() == true) {
+                do {
+                    val id = cursor.getIntValue(COL_ID)
+                    val repeatInterval = cursor.getIntValue(COL_REPEAT_INTERVAL)
+                    val multiplies = repeatInterval / OLD_MONTH
+
+                    val values = ContentValues().apply {
+                        put(COL_REPEAT_INTERVAL, multiplies * MONTH)
+                    }
+
+                    val updateSelection = "$COL_ID = $id"
+                    db.update(META_TABLE_NAME, values, updateSelection, null)
+                } while (cursor.moveToNext())
+            }
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    fun addEventRepeatException(parentEventId: Int, occurrenceTS: Int, addToCalDAV: Boolean, childImportId: String? = null) {
+        fillExceptionValues(parentEventId, occurrenceTS, addToCalDAV, childImportId) {
+            mDb.insert(EXCEPTIONS_TABLE_NAME, null, it)
+
+            val parentEvent = getEventWithId(parentEventId)
+            context.scheduleNextEventReminder(parentEvent, this)
+        }
+    }
+
+    fun deleteEventTypes(eventTypes: ArrayList<EventType>, deleteEvents: Boolean, callback: (deletedCnt: Int) -> Unit) {
+        var deleteIds = eventTypes.filter { it.caldavCalendarId == 0 }.map { it.id }
+        deleteIds = deleteIds.filter { it != DBHelper.REGULAR_EVENT_TYPE_ID } as ArrayList<Int>
+
+        val deletedSet = HashSet<String>()
+        deleteIds.map { deletedSet.add(it.toString()) }
+        context.config.removeDisplayEventTypes(deletedSet)
+        if (deleteIds.isEmpty())
+            return
+
+        for (eventTypeId in deleteIds) {
+            if (deleteEvents) {
+                deleteEventsWithType(eventTypeId)
+            } else {
+                resetEventsWithType(eventTypeId)
+            }
+        }
+
+        val args = TextUtils.join(", ", deleteIds)
+        val selection = "$COL_TYPE_ID IN ($args)"
+        callback(mDb.delete(TYPES_TABLE_NAME, selection, null))
+    }
+
+    fun deleteEventTypesWithCalendarId(calendarIds: String) {
+        val selection = "$COL_TYPE_CALDAV_CALENDAR_ID IN ($calendarIds)"
+        mDb.delete(TYPES_TABLE_NAME, selection, null)
+    }
+
+    private fun deleteEventsWithType(eventTypeId: Int) {
+        val selection = "$MAIN_TABLE_NAME.$COL_EVENT_TYPE = ?"
+        val selectionArgs = arrayOf(eventTypeId.toString())
+        val cursor = getEventsCursor(selection, selectionArgs)
+        val events = fillEvents(cursor)
+        val eventIDs = Array(events.size, { i -> (events[i].id.toString()) })
+        deleteEvents(eventIDs, true)
+    }
+
+    private fun resetEventsWithType(eventTypeId: Int) {
+        val values = ContentValues()
+        values.put(COL_EVENT_TYPE, REGULAR_EVENT_TYPE_ID)
+
+        val selection = "$COL_EVENT_TYPE = ?"
+        val selectionArgs = arrayOf(eventTypeId.toString())
+        mDb.update(MAIN_TABLE_NAME, values, selection, selectionArgs)
+    }
+
+    fun updateEventImportIdAndSource(eventId: Int, importId: String, source: String) {
+        val values = ContentValues()
+        values.put(COL_IMPORT_ID, importId)
+        values.put(COL_EVENT_SOURCE, source)
+
+        val selection = "$MAIN_TABLE_NAME.$COL_ID = ?"
+        val selectionArgs = arrayOf(eventId.toString())
+        mDb.update(MAIN_TABLE_NAME, values, selection, selectionArgs)
+    }
+
+    fun getEventsWithImportIds() = getEvents("").filter { it.importId.trim().isNotEmpty() } as ArrayList<Event>
+
+    fun getEventWithId(id: Int): Event? {
+        val selection = "$MAIN_TABLE_NAME.$COL_ID = ?"
+        val selectionArgs = arrayOf(id.toString())
+        val cursor = getEventsCursor(selection, selectionArgs)
+        val events = fillEvents(cursor)
+        return if (events.isNotEmpty()) {
+            events.first()
+        } else {
+            null
+        }
+    }
+
+    fun getEventIdWithImportId(id: String): Int {
+        val selection = "$MAIN_TABLE_NAME.$COL_IMPORT_ID = ?"
+        val selectionArgs = arrayOf(id)
+        val cursor = getEventsCursor(selection, selectionArgs)
+        val events = fillEvents(cursor)
+        return if (events.isNotEmpty()) {
+            events.minBy { it.id }?.id ?: 0
+        } else {
+            0
+        }
+    }
+
+    fun getEventIdWithLastImportId(id: String): Int {
+        val selection = "$MAIN_TABLE_NAME.$COL_IMPORT_ID LIKE ?"
+        val selectionArgs = arrayOf("%-$id")
+        val cursor = getEventsCursor(selection, selectionArgs)
+        val events = fillEvents(cursor)
+        return if (events.isNotEmpty()) {
+            events.minBy { it.id }?.id ?: 0
+        } else {
+            0
+        }
+    }
+
+    fun getEventsWithSearchQuery(text: String, callback: (searchedText: String, events: List<Event>) -> Unit) {
+        Thread {
+            val searchQuery = "%$text%"
+            val selection = "$MAIN_TABLE_NAME.$COL_TITLE LIKE ? OR $MAIN_TABLE_NAME.$COL_LOCATION LIKE ? OR $MAIN_TABLE_NAME.$COL_DESCRIPTION LIKE ?"
+            val selectionArgs = arrayOf(searchQuery, searchQuery, searchQuery)
+            val cursor = getEventsCursor(selection, selectionArgs)
+            val events = fillEvents(cursor)
+
+            val displayEventTypes = context.config.displayEventTypes
+            val filteredEvents = events.filter { displayEventTypes.contains(it.eventType.toString()) }
+            callback(text, filteredEvents)
+        }.start()
+    }
+
+    fun getEvents(fromTS: Int, toTS: Int, eventId: Int = -1, callback: (events: ArrayList<Event>) -> Unit) {
+        Thread {
+            getEventsInBackground(fromTS, toTS, eventId, callback)
+        }.start()
+    }
+
+    fun getEventsInBackground(fromTS: Int, toTS: Int, eventId: Int = -1, callback: (events: ArrayList<Event>) -> Unit) {
+        val events = ArrayList<Event>()
+
+        var selection = "$COL_START_TS <= ? AND $COL_END_TS >= ? AND $COL_REPEAT_INTERVAL IS NULL AND $COL_START_TS != 0"
+        if (eventId != -1)
+            selection += " AND $MAIN_TABLE_NAME.$COL_ID = $eventId"
+        val selectionArgs = arrayOf(toTS.toString(), fromTS.toString())
+        val cursor = getEventsCursor(selection, selectionArgs)
+        events.addAll(fillEvents(cursor))
+
+        events.addAll(getRepeatableEventsFor(fromTS, toTS, eventId))
+
+        events.addAll(getAllDayEvents(fromTS, eventId))
+
+        val filtered = events.distinct().filterNot { it.ignoreEventOccurrences.contains(Formatter.getDayCodeFromTS(it.startTS).toInt()) } as ArrayList<Event>
+        callback(filtered)
+    }
+
+    fun getRepeatableEventsFor(fromTS: Int, toTS: Int, eventId: Int = -1): List<Event> {
+        val newEvents = ArrayList<Event>()
+
+        // get repeatable events
+        var selection = "$COL_REPEAT_INTERVAL != 0 AND $COL_START_TS <= $toTS AND $COL_START_TS != 0"
+        if (eventId != -1)
+            selection += " AND $MAIN_TABLE_NAME.$COL_ID = $eventId"
+        val events = getEvents(selection)
+        val startTimes = SparseIntArray(events.size)
+        events.forEach {
+            startTimes.put(it.id, it.startTS)
+            if (it.repeatLimit >= 0) {
+                newEvents.addAll(getEventsRepeatingTillDateOrForever(fromTS, toTS, startTimes, it))
+            } else {
+                newEvents.addAll(getEventsRepeatingXTimes(fromTS, toTS, startTimes, it))
+            }
+        }
+
+        return newEvents
+    }
+
+    private fun getEventsRepeatingTillDateOrForever(fromTS: Int, toTS: Int, startTimes: SparseIntArray, event: Event): ArrayList<Event> {
+        val original = event.copy()
+        val events = ArrayList<Event>()
+        while (event.startTS <= toTS && (event.repeatLimit == 0 || event.repeatLimit >= event.startTS)) {
+            if (event.endTS >= fromTS) {
+                if (event.repeatInterval.isXWeeklyRepetition()) {
+                    if (event.startTS.isTsOnProperDay(event)) {
+                        if (isOnProperWeek(event, startTimes)) {
+                            events.add(event.copy(isPastEvent = getIsPastEvent(event)))
+                        }
+                    }
+                } else {
+                    events.add(event.copy(isPastEvent = getIsPastEvent(event)))
+                }
+            }
+
+            if (event.getIsAllDay()) {
+                if (event.repeatInterval.isXWeeklyRepetition()) {
+                    if (event.endTS >= toTS && event.startTS.isTsOnProperDay(event)) {
+                        if (isOnProperWeek(event, startTimes)) {
+                            events.add(event.copy(isPastEvent = getIsPastEvent(event)))
+                        }
+                    }
+                } else {
+                    val dayCode = Formatter.getDayCodeFromTS(fromTS)
+                    val endDayCode = Formatter.getDayCodeFromTS(event.endTS)
+                    if (dayCode == endDayCode) {
+                        events.add(event.copy(isPastEvent = getIsPastEvent(event)))
+                    }
+                }
+            }
+            event.addIntervalTime(original)
+        }
+        return events
+    }
+
+    private fun getEventsRepeatingXTimes(fromTS: Int, toTS: Int, startTimes: SparseIntArray, event: Event): ArrayList<Event> {
+        val original = event.copy()
+        val events = ArrayList<Event>()
+        while (event.repeatLimit < 0 && event.startTS <= toTS) {
+            if (event.repeatInterval.isXWeeklyRepetition()) {
+                if (event.startTS.isTsOnProperDay(event)) {
+                    if (isOnProperWeek(event, startTimes)) {
+                        if (event.endTS >= fromTS) {
+                            events.add(event.copy(isPastEvent = getIsPastEvent(event)))
+                        }
+                        event.repeatLimit++
+                    }
+                }
+            } else {
+                if (event.endTS >= fromTS) {
+                    events.add(event.copy())
+                } else if (event.getIsAllDay()) {
+                    val dayCode = Formatter.getDayCodeFromTS(fromTS)
+                    val endDayCode = Formatter.getDayCodeFromTS(event.endTS)
+                    if (dayCode == endDayCode) {
+                        events.add(event.copy(isPastEvent = getIsPastEvent(event)))
+                    }
+                }
+                event.repeatLimit++
+            }
+            event.addIntervalTime(original)
+        }
+        return events
+    }
+
+    private fun getAllDayEvents(fromTS: Int, eventId: Int = -1): List<Event> {
+        val events = ArrayList<Event>()
+        var selection = "($COL_FLAGS & $FLAG_ALL_DAY) != 0"
+        if (eventId != -1)
+            selection += " AND $MAIN_TABLE_NAME.$COL_ID = $eventId"
+
+        val dayCode = Formatter.getDayCodeFromTS(fromTS)
+        val cursor = getEventsCursor(selection)
+        events.addAll(fillEvents(cursor).filter { dayCode == Formatter.getDayCodeFromTS(it.startTS) })
+        return events
+    }
+
+    // check if its the proper week, for events repeating by x weeks
+    private fun isOnProperWeek(event: Event, startTimes: SparseIntArray): Boolean {
+        val initialWeekOfYear = Formatter.getDateTimeFromTS(startTimes[event.id]).weekOfWeekyear
+        val currentWeekOfYear = Formatter.getDateTimeFromTS(event.startTS).weekOfWeekyear
+        return (currentWeekOfYear - initialWeekOfYear) % (event.repeatInterval / WEEK) == 0
+    }
+
+    fun getRunningEvents(): List<Event> {
+        val events = ArrayList<Event>()
+        val ts = getNowSeconds()
+
+        val selection = "$COL_START_TS <= ? AND $COL_END_TS >= ? AND $COL_REPEAT_INTERVAL IS 0 AND $COL_START_TS != 0"
+        val selectionArgs = arrayOf(ts.toString(), ts.toString())
+        val cursor = getEventsCursor(selection, selectionArgs)
+        events.addAll(fillEvents(cursor))
+
+        events.addAll(getRepeatableEventsFor(ts, ts))
+        return events
+    }
+
+    private fun getEvents(selection: String): List<Event> {
+        val events = ArrayList<Event>()
+        var cursor: Cursor? = null
+        try {
+            cursor = getEventsCursor(selection)
+            if (cursor != null) {
+                val currEvents = fillEvents(cursor)
+                events.addAll(currEvents)
+            }
+        } finally {
+            cursor?.close()
+        }
+
+        return events
+    }
+
+    fun getEventsWithIds(ids: List<Int>): ArrayList<Event> {
+        val args = TextUtils.join(", ", ids)
+        val selection = "$MAIN_TABLE_NAME.$COL_ID IN ($args)"
+        return getEvents(selection) as ArrayList<Event>
+    }
+
+    fun getEventsAtReboot(): List<Event> {
+        val selection = "$COL_REMINDER_MINUTES != -1 AND ($COL_START_TS > ? OR $COL_REPEAT_INTERVAL != 0) AND $COL_START_TS != 0"
+        val selectionArgs = arrayOf(DateTime.now().seconds().toString())
+        val cursor = getEventsCursor(selection, selectionArgs)
+        return fillEvents(cursor)
+    }
+
+    fun getEventsToExport(includePast: Boolean): ArrayList<Event> {
+        val currTime = getNowSeconds().toString()
+        var events = ArrayList<Event>()
+
+        // non repeating events
+        var cursor = if (includePast) {
+            getEventsCursor()
+        } else {
+            val selection = "$COL_END_TS > ?"
+            val selectionArgs = arrayOf(currTime)
+            getEventsCursor(selection, selectionArgs)
+        }
+        events.addAll(fillEvents(cursor))
+
+        // repeating events
+        if (!includePast) {
+            val selection = "$COL_REPEAT_INTERVAL != 0 AND ($COL_REPEAT_LIMIT == 0 OR $COL_REPEAT_LIMIT > ?)"
+            val selectionArgs = arrayOf(currTime)
+            cursor = getEventsCursor(selection, selectionArgs)
+            events.addAll(fillEvents(cursor))
+        }
+
+        events = events.distinctBy { it.id } as ArrayList<Event>
+        return events
+    }
+
+    fun getEventsFromCalDAVCalendar(calendarId: Int): List<Event> {
+        val selection = "$MAIN_TABLE_NAME.$COL_EVENT_SOURCE = ?"
+        val selectionArgs = arrayOf("$CALDAV-$calendarId")
+        val cursor = getEventsCursor(selection, selectionArgs)
+        return fillEvents(cursor)
+    }
+
+    private fun getEventsCursor(selection: String = "", selectionArgs: Array<String>? = null): Cursor? {
+        val builder = SQLiteQueryBuilder()
+        builder.tables = "$MAIN_TABLE_NAME LEFT OUTER JOIN $META_TABLE_NAME ON $COL_EVENT_ID = $MAIN_TABLE_NAME.$COL_ID"
+        val projection = allColumns
+        return builder.query(mDb, projection, selection, selectionArgs, "$MAIN_TABLE_NAME.$COL_ID", null, COL_START_TS)
+    }
+
+    private val allColumns: Array<String>
+        get() = arrayOf("$MAIN_TABLE_NAME.$COL_ID", COL_START_TS, COL_END_TS, COL_TITLE, COL_DESCRIPTION, COL_REMINDER_MINUTES, COL_REMINDER_MINUTES_2,
+                COL_REMINDER_MINUTES_3, COL_REPEAT_INTERVAL, COL_REPEAT_RULE, COL_IMPORT_ID, COL_FLAGS, COL_REPEAT_LIMIT, COL_EVENT_TYPE, COL_OFFSET,
+                COL_IS_DST_INCLUDED, COL_LAST_UPDATED, COL_EVENT_SOURCE, COL_LOCATION)
+
+    private fun fillEvents(cursor: Cursor?): List<Event> {
+        val eventTypeColors = SparseIntArray()
+        getEventTypesSync().forEach {
+            eventTypeColors.put(it.id, it.color)
+        }
+
+        val events = ArrayList<Event>()
+        cursor?.use {
+            if (cursor.moveToFirst()) {
+                do {
+                    val id = cursor.getIntValue(COL_ID)
+                    val startTS = cursor.getIntValue(COL_START_TS)
+                    val endTS = cursor.getIntValue(COL_END_TS)
+                    val reminder1Minutes = cursor.getIntValue(COL_REMINDER_MINUTES)
+                    val reminder2Minutes = cursor.getIntValue(COL_REMINDER_MINUTES_2)
+                    val reminder3Minutes = cursor.getIntValue(COL_REMINDER_MINUTES_3)
+                    val repeatInterval = cursor.getIntValue(COL_REPEAT_INTERVAL)
+                    var repeatRule = cursor.getIntValue(COL_REPEAT_RULE)
+                    val title = cursor.getStringValue(COL_TITLE)
+                    val description = cursor.getStringValue(COL_DESCRIPTION)
+                    val importId = cursor.getStringValue(COL_IMPORT_ID) ?: ""
+                    val flags = cursor.getIntValue(COL_FLAGS)
+                    val repeatLimit = cursor.getIntValue(COL_REPEAT_LIMIT)
+                    val eventType = cursor.getIntValue(COL_EVENT_TYPE)
+                    val offset = cursor.getStringValue(COL_OFFSET)
+                    val isDstIncluded = cursor.getIntValue(COL_IS_DST_INCLUDED) == 1
+                    val lastUpdated = cursor.getLongValue(COL_LAST_UPDATED)
+                    val source = cursor.getStringValue(COL_EVENT_SOURCE)
+                    val location = cursor.getStringValue(COL_LOCATION)
+                    val color = eventTypeColors[eventType]
+
+                    val ignoreEventOccurrences = if (repeatInterval != 0) {
+                        getIgnoredOccurrences(id)
+                    } else {
+                        ArrayList()
+                    }
+
+                    if (repeatInterval > 0 && repeatRule == 0 && (repeatInterval % MONTH == 0 || repeatInterval % YEAR == 0)) {
+                        repeatRule = REPEAT_SAME_DAY
+                    }
+
+                    val isPastEvent = endTS < getNowSeconds()
+
+                    val event = Event(id, startTS, endTS, title, description, reminder1Minutes, reminder2Minutes, reminder3Minutes,
+                            repeatInterval, importId, flags, repeatLimit, repeatRule, eventType, ignoreEventOccurrences, offset, isDstIncluded,
+                            0, lastUpdated, source, color, location, isPastEvent)
+
+                    events.add(event)
+                } while (cursor.moveToNext())
+            }
+        }
+        return events
+    }
+
+    fun getEventTypes(callback: (types: ArrayList<EventType>) -> Unit) {
+        Thread {
+            callback(getEventTypesSync())
+        }.start()
+    }
+
+    fun getEventTypesSync(): ArrayList<EventType> {
+        val eventTypes = ArrayList<EventType>(4)
+        val cols = arrayOf(COL_TYPE_ID, COL_TYPE_TITLE, COL_TYPE_COLOR, COL_TYPE_CALDAV_CALENDAR_ID, COL_TYPE_CALDAV_DISPLAY_NAME, COL_TYPE_CALDAV_EMAIL)
+        var cursor: Cursor? = null
+        try {
+            cursor = mDb.query(TYPES_TABLE_NAME, cols, null, null, null, null, "$COL_TYPE_TITLE ASC")
+            if (cursor?.moveToFirst() == true) {
+                do {
+                    val id = cursor.getIntValue(COL_TYPE_ID)
+                    val title = cursor.getStringValue(COL_TYPE_TITLE)
+                    val color = cursor.getIntValue(COL_TYPE_COLOR)
+                    val calendarId = cursor.getIntValue(COL_TYPE_CALDAV_CALENDAR_ID)
+                    val displayName = cursor.getStringValue(COL_TYPE_CALDAV_DISPLAY_NAME)
+                    val email = cursor.getStringValue(COL_TYPE_CALDAV_EMAIL)
+                    val eventType = EventType(id, title, color, calendarId, displayName, email)
+                    eventTypes.add(eventType)
+                } while (cursor.moveToNext())
+            }
+        } finally {
+            cursor?.close()
+        }
+
+        return eventTypes
+    }
+
+    fun doEventTypesContainEvent(types: ArrayList<EventType>): Boolean {
+        val args = TextUtils.join(", ", types.map { it.id })
+        val columns = arrayOf(COL_ID)
+        val selection = "$COL_EVENT_TYPE IN ($args)"
+        var cursor: Cursor? = null
+        try {
+            cursor = mDb.query(MAIN_TABLE_NAME, columns, selection, null, null, null, null)
+            return cursor?.moveToFirst() == true
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    private fun getIgnoredOccurrences(eventId: Int): ArrayList<Int> {
+        val projection = arrayOf(COL_OCCURRENCE_DAYCODE)
+        val selection = "$COL_PARENT_EVENT_ID = ?"
+        val selectionArgs = arrayOf(eventId.toString())
+        val daycodes = ArrayList<Int>()
+
+        var cursor: Cursor? = null
+        try {
+            cursor = mDb.query(EXCEPTIONS_TABLE_NAME, projection, selection, selectionArgs, null, null, COL_OCCURRENCE_DAYCODE)
+            if (cursor?.moveToFirst() == true) {
+                do {
+                    daycodes.add(cursor.getIntValue(COL_OCCURRENCE_DAYCODE))
+                } while (cursor.moveToNext())
+            }
+        } finally {
+            cursor?.close()
+        }
+        return daycodes
+    }
+
+    private fun convertExceptionTimestampToDaycode(db: SQLiteDatabase) {
+        val projection = arrayOf(COL_EXCEPTION_ID, COL_OCCURRENCE_TIMESTAMP)
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(EXCEPTIONS_TABLE_NAME, projection, null, null, null, null, null)
+            if (cursor?.moveToFirst() == true) {
+                do {
+                    val id = cursor.getIntValue(COL_EXCEPTION_ID)
+                    val ts = cursor.getIntValue(COL_OCCURRENCE_TIMESTAMP)
+                    val values = ContentValues()
+                    values.put(COL_OCCURRENCE_DAYCODE, Formatter.getDayCodeFromTS(ts))
+
+                    val selection = "$COL_EXCEPTION_ID = ?"
+                    val selectionArgs = arrayOf(id.toString())
+                    db.update(EXCEPTIONS_TABLE_NAME, values, selection, selectionArgs)
+                } while (cursor.moveToNext())
+            }
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    private fun setupRepeatRules(db: SQLiteDatabase) {
+        val projection = arrayOf(COL_EVENT_ID, COL_REPEAT_INTERVAL, COL_REPEAT_START)
+        val selection = "$COL_REPEAT_INTERVAL != 0"
+        var cursor: Cursor? = null
+        try {
+            cursor = db.query(META_TABLE_NAME, projection, selection, null, null, null, null)
+            if (cursor?.moveToFirst() == true) {
+                do {
+                    val interval = cursor.getIntValue(COL_REPEAT_INTERVAL)
+                    if (interval != MONTH && interval % WEEK != 0)
+                        continue
+
+                    val eventId = cursor.getIntValue(COL_EVENT_ID)
+                    val start = cursor.getIntValue(COL_REPEAT_START)
+                    var rule = Math.pow(2.0, (Formatter.getDateTimeFromTS(start).dayOfWeek - 1).toDouble()).toInt()
+                    if (interval == MONTH) {
+                        rule = REPEAT_SAME_DAY
+                    }
+
+                    val values = ContentValues()
+                    values.put(COL_REPEAT_RULE, rule)
+                    val curSelection = "$COL_EVENT_ID = ?"
+                    val curSelectionArgs = arrayOf(eventId.toString())
+                    db.update(META_TABLE_NAME, values, curSelection, curSelectionArgs)
+                } while (cursor.moveToNext())
+            }
+        } finally {
+            cursor?.close()
+        }
+    }
+
+    private fun getIsPastEvent(event: Event) = event.endTS < getNowSeconds()
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Formatter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Formatter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..bc9ac956f6cf370950c1dbe8b9d78b41dee22e01
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Formatter.kt
@@ -0,0 +1,109 @@
+package com.simplemobiletools.calendar.helpers
+
+import android.content.Context
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.seconds
+import org.joda.time.DateTime
+import org.joda.time.DateTimeZone
+import org.joda.time.LocalDate
+import org.joda.time.format.DateTimeFormat
+
+object Formatter {
+    const val DAYCODE_PATTERN = "YYYYMMdd"
+    const val YEAR_PATTERN = "YYYY"
+    const val TIME_PATTERN = "HHmmss"
+    private const val DAY_PATTERN = "d"
+    private const val DAY_OF_WEEK_PATTERN = "EEE"
+    private const val LONGEST_PATTERN = "MMMM dd YYYY (EEEE)"
+    private const val PATTERN_TIME_12 = "hh:mm a"
+    private const val PATTERN_TIME_24 = "HH:mm"
+
+    private const val PATTERN_HOURS_12 = "h a"
+    private const val PATTERN_HOURS_24 = "HH"
+
+    fun getDateFromCode(context: Context, dayCode: String, shortMonth: Boolean = false): String {
+        val dateTime = getDateTimeFromCode(dayCode)
+        val day = dateTime.toString(DAY_PATTERN)
+        val year = dateTime.toString(YEAR_PATTERN)
+        val monthIndex = Integer.valueOf(dayCode.substring(4, 6))!!
+        var month = getMonthName(context, monthIndex)
+        if (shortMonth)
+            month = month.substring(0, Math.min(month.length, 3))
+        var date = "$month $day"
+        if (year != DateTime().toString(YEAR_PATTERN))
+            date += " $year"
+        return date
+    }
+
+    fun getDayTitle(context: Context, dayCode: String, addDayOfWeek: Boolean = true): String {
+        val date = getDateFromCode(context, dayCode)
+        val dateTime = getDateTimeFromCode(dayCode)
+        val day = dateTime.toString(DAY_OF_WEEK_PATTERN)
+        return if (addDayOfWeek)
+            "$date ($day)"
+        else
+            date
+    }
+
+    fun getLongestDate(ts: Int) = getDateTimeFromTS(ts).toString(LONGEST_PATTERN)
+
+    fun getDate(context: Context, dateTime: DateTime, addDayOfWeek: Boolean = true) = getDayTitle(context, getDayCodeFromDateTime(dateTime), addDayOfWeek)
+
+    fun getFullDate(context: Context, dateTime: DateTime): String {
+        val day = dateTime.toString(DAY_PATTERN)
+        val year = dateTime.toString(YEAR_PATTERN)
+        val monthIndex = dateTime.monthOfYear
+        val month = getMonthName(context, monthIndex)
+        return "$month $day $year"
+    }
+
+    fun getTodayCode(context: Context) = Formatter.getDayCodeFromTS(getNowSeconds())
+
+    fun getHours(context: Context, dateTime: DateTime) = dateTime.toString(getHourPattern(context))
+
+    fun getTime(context: Context, dateTime: DateTime) = dateTime.toString(getTimePattern(context))
+
+    fun getDateTimeFromCode(dayCode: String) = DateTimeFormat.forPattern(DAYCODE_PATTERN).withZone(DateTimeZone.UTC).parseDateTime(dayCode)
+
+    fun getLocalDateTimeFromCode(dayCode: String) = DateTimeFormat.forPattern(DAYCODE_PATTERN).withZone(DateTimeZone.getDefault()).parseDateTime(dayCode)
+
+    fun getTimeFromTS(context: Context, ts: Int) = getTime(context, getDateTimeFromTS(ts))
+
+    fun getDayStartTS(dayCode: String) = getLocalDateTimeFromCode(dayCode).seconds()
+
+    fun getDayEndTS(dayCode: String) = getLocalDateTimeFromCode(dayCode).plusDays(1).minusMinutes(1).seconds()
+
+    fun getDayCodeFromDateTime(dateTime: DateTime) = dateTime.toString(DAYCODE_PATTERN)
+
+    fun getDateFromTS(ts: Int) = LocalDate(ts * 1000L, DateTimeZone.getDefault())
+
+    fun getDateTimeFromTS(ts: Int) = DateTime(ts * 1000L, DateTimeZone.getDefault())
+
+    fun getUTCDateTimeFromTS(ts: Int) = DateTime(ts * 1000L, DateTimeZone.UTC)
+
+    // use manually translated month names, as DateFormat and Joda have issues with a lot of languages
+    fun getMonthName(context: Context, id: Int) = context.resources.getStringArray(R.array.months)[id - 1]
+
+    fun getYear(dateTime: DateTime) = dateTime.toString(YEAR_PATTERN)
+
+    fun getHourPattern(context: Context) = if (context.config.use24HourFormat) PATTERN_HOURS_24 else PATTERN_HOURS_12
+
+    fun getTimePattern(context: Context) = if (context.config.use24HourFormat) PATTERN_TIME_24 else PATTERN_TIME_12
+
+    fun getExportedTime(ts: Long): String {
+        val dateTime = DateTime(ts, DateTimeZone.UTC)
+        return "${dateTime.toString(DAYCODE_PATTERN)}T${dateTime.toString(TIME_PATTERN)}Z"
+    }
+
+    fun getDayCodeFromTS(ts: Int): String {
+        val daycode = getDateTimeFromTS(ts).toString(DAYCODE_PATTERN)
+        return if (daycode.isNotEmpty()) {
+            daycode
+        } else {
+            "0"
+        }
+    }
+
+    fun getShiftedImportTimestamp(ts: Int) = getUTCDateTimeFromTS(ts).withTime(13, 0, 0, 0).withZoneRetainFields(DateTimeZone.getDefault()).seconds()
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/IcsExporter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/IcsExporter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..472c967f6726f39e7947600dd69d0979d9e9732c
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/IcsExporter.kt
@@ -0,0 +1,99 @@
+package com.simplemobiletools.calendar.helpers
+
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.helpers.IcsExporter.ExportResult.*
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.commons.activities.BaseSimpleActivity
+import com.simplemobiletools.commons.extensions.getFileOutputStream
+import com.simplemobiletools.commons.extensions.toast
+import com.simplemobiletools.commons.extensions.writeLn
+import com.simplemobiletools.commons.models.FileDirItem
+import java.io.BufferedWriter
+import java.io.File
+
+class IcsExporter {
+    enum class ExportResult {
+        EXPORT_FAIL, EXPORT_OK, EXPORT_PARTIAL
+    }
+
+    private var eventsExported = 0
+    private var eventsFailed = 0
+
+    fun exportEvents(activity: BaseSimpleActivity, file: File, events: ArrayList<Event>, showExportingToast: Boolean, callback: (result: ExportResult) -> Unit) {
+        val fileDirItem = FileDirItem(file.absolutePath, file.name)
+        activity.getFileOutputStream(fileDirItem, true) {
+            if (it == null) {
+                callback(EXPORT_FAIL)
+                return@getFileOutputStream
+            }
+
+            if (showExportingToast) {
+                activity.toast(R.string.exporting)
+            }
+
+            it.bufferedWriter().use { out ->
+                out.writeLn(BEGIN_CALENDAR)
+                out.writeLn(CALENDAR_PRODID)
+                out.writeLn(CALENDAR_VERSION)
+                for (event in events) {
+                    out.writeLn(BEGIN_EVENT)
+                    event.title.replace("\n", "\\n").let { if (it.isNotEmpty()) out.writeLn("$SUMMARY:$it") }
+                    event.description.replace("\n", "\\n").let { if (it.isNotEmpty()) out.writeLn("$DESCRIPTION$it") }
+                    event.importId.let { if (it.isNotEmpty()) out.writeLn("$UID$it") }
+                    event.eventType.let { out.writeLn("$CATEGORY_COLOR${activity.dbHelper.getEventType(it)?.color}") }
+                    event.eventType.let { out.writeLn("$CATEGORIES${activity.dbHelper.getEventType(it)?.title}") }
+                    event.lastUpdated.let { out.writeLn("$LAST_MODIFIED:${Formatter.getExportedTime(it)}") }
+                    event.location.let { if (it.isNotEmpty()) out.writeLn("$LOCATION$it") }
+
+                    if (event.getIsAllDay()) {
+                        out.writeLn("$DTSTART;$VALUE=$DATE:${Formatter.getDayCodeFromTS(event.startTS)}")
+                        out.writeLn("$DTEND;$VALUE=$DATE:${Formatter.getDayCodeFromTS(event.endTS + DAY)}")
+                    } else {
+                        event.startTS.let { out.writeLn("$DTSTART:${Formatter.getExportedTime(it * 1000L)}") }
+                        event.endTS.let { out.writeLn("$DTEND:${Formatter.getExportedTime(it * 1000L)}") }
+                    }
+
+                    out.writeLn("$STATUS$CONFIRMED")
+                    Parser().getRepeatCode(event).let { if (it.isNotEmpty()) out.writeLn("$RRULE$it") }
+
+                    fillReminders(event, out)
+                    fillIgnoredOccurrences(event, out)
+
+                    eventsExported++
+                    out.writeLn(END_EVENT)
+                }
+                out.writeLn(END_CALENDAR)
+            }
+
+            callback(when {
+                eventsExported == 0 -> EXPORT_FAIL
+                eventsFailed > 0 -> EXPORT_PARTIAL
+                else -> EXPORT_OK
+            })
+        }
+    }
+
+    private fun fillReminders(event: Event, out: BufferedWriter) {
+        checkReminder(event.reminder1Minutes, out)
+        checkReminder(event.reminder2Minutes, out)
+        checkReminder(event.reminder3Minutes, out)
+    }
+
+    private fun checkReminder(minutes: Int, out: BufferedWriter) {
+        if (minutes != -1) {
+            out.apply {
+                writeLn(BEGIN_ALARM)
+                writeLn("$ACTION$DISPLAY")
+                writeLn("$TRIGGER-${Parser().getDurationCode(minutes)}")
+                writeLn(END_ALARM)
+            }
+        }
+    }
+
+    private fun fillIgnoredOccurrences(event: Event, out: BufferedWriter) {
+        event.ignoreEventOccurrences.forEach {
+            out.writeLn("$EXDATE:$it}")
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/IcsImporter.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/IcsImporter.kt
new file mode 100644
index 0000000000000000000000000000000000000000..1df27de0e4e0672a6fb34a8a15c478daf5d7873b
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/IcsImporter.kt
@@ -0,0 +1,259 @@
+package com.simplemobiletools.calendar.helpers
+
+import android.content.Context
+import android.widget.Toast
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SimpleActivity
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.helpers.IcsImporter.ImportResult.*
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.calendar.models.EventType
+import com.simplemobiletools.commons.extensions.areDigitsOnly
+import com.simplemobiletools.commons.extensions.showErrorToast
+import java.io.File
+
+class IcsImporter(val activity: SimpleActivity) {
+    enum class ImportResult {
+        IMPORT_FAIL, IMPORT_OK, IMPORT_PARTIAL
+    }
+
+    private var curStart = -1
+    private var curEnd = -1
+    private var curTitle = ""
+    private var curDescription = ""
+    private var curImportId = ""
+    private var curFlags = 0
+    private var curReminderMinutes = ArrayList<Int>()
+    private var curRepeatExceptions = ArrayList<Int>()
+    private var curRepeatInterval = 0
+    private var curRepeatLimit = 0
+    private var curRepeatRule = 0
+    private var curEventTypeId = DBHelper.REGULAR_EVENT_TYPE_ID
+    private var curLastModified = 0L
+    private var curLocation = ""
+    private var curCategoryColor = -2
+    private var isNotificationDescription = false
+    private var isProperReminderAction = false
+    private var isDescription = false
+    private var curReminderTriggerMinutes = -1
+
+    private var eventsImported = 0
+    private var eventsFailed = 0
+
+    fun importEvents(path: String, defaultEventTypeId: Int, calDAVCalendarId: Int, overrideFileEventTypes: Boolean): ImportResult {
+        try {
+            val eventTypes = activity.dbHelper.getEventTypesSync()
+            val existingEvents = activity.dbHelper.getEventsWithImportIds()
+            val eventsToInsert = ArrayList<Event>()
+            var prevLine = ""
+
+            val inputStream = if (path.contains("/")) {
+                File(path).inputStream()
+            } else {
+                activity.assets.open(path)
+            }
+
+            inputStream.bufferedReader().use {
+                while (true) {
+                    var line = it.readLine() ?: break
+                    if (line.trim().isEmpty()) {
+                        continue
+                    }
+
+                    if (line.substring(0, 1) == " ") {
+                        line = prevLine + line.trim()
+                        eventsFailed--
+                    }
+
+                    if (isDescription) {
+                        if (line.startsWith('\t')) {
+                            curDescription += line.trimStart('\t').replace("\\n", "\n")
+                        } else {
+                            isDescription = false
+                        }
+                    }
+
+                    if (line == BEGIN_EVENT) {
+                        resetValues()
+                        curEventTypeId = defaultEventTypeId
+                    } else if (line.startsWith(DTSTART)) {
+                        curStart = getTimestamp(line.substring(DTSTART.length))
+                    } else if (line.startsWith(DTEND)) {
+                        curEnd = getTimestamp(line.substring(DTEND.length))
+                    } else if (line.startsWith(DURATION)) {
+                        val duration = line.substring(DURATION.length)
+                        curEnd = curStart + Parser().parseDurationSeconds(duration)
+                    } else if (line.startsWith(SUMMARY) && !isNotificationDescription) {
+                        curTitle = line.substring(SUMMARY.length)
+                        curTitle = getTitle(curTitle).replace("\\n", "\n").replace("\\,", ",")
+                    } else if (line.startsWith(DESCRIPTION) && !isNotificationDescription) {
+                        curDescription = line.substring(DESCRIPTION.length).replace("\\n", "\n").replace("\\,", ",")
+                        isDescription = true
+                    } else if (line.startsWith(UID)) {
+                        curImportId = line.substring(UID.length).trim()
+                    } else if (line.startsWith(RRULE)) {
+                        val repeatRule = Parser().parseRepeatInterval(line.substring(RRULE.length), curStart)
+                        curRepeatRule = repeatRule.repeatRule
+                        curRepeatInterval = repeatRule.repeatInterval
+                        curRepeatLimit = repeatRule.repeatLimit
+                    } else if (line.startsWith(ACTION)) {
+                        isNotificationDescription = true
+                        isProperReminderAction = line.substring(ACTION.length) == DISPLAY
+                    } else if (line.startsWith(TRIGGER)) {
+                        curReminderTriggerMinutes = Parser().parseDurationSeconds(line.substring(TRIGGER.length)) / 60
+                    } else if (line.startsWith(CATEGORY_COLOR)) {
+                        val color = line.substring(CATEGORY_COLOR.length)
+                        if (color.trimStart('-').areDigitsOnly()) {
+                            curCategoryColor = Integer.parseInt(color)
+                        }
+                    } else if (line.startsWith(CATEGORIES) && !overrideFileEventTypes) {
+                        val categories = line.substring(CATEGORIES.length)
+                        tryAddCategories(categories, activity)
+                    } else if (line.startsWith(LAST_MODIFIED)) {
+                        curLastModified = getTimestamp(line.substring(LAST_MODIFIED.length)) * 1000L
+                    } else if (line.startsWith(EXDATE)) {
+                        var value = line.substring(EXDATE.length)
+                        if (value.endsWith('}')) {
+                            value = value.substring(0, value.length - 1)
+                        }
+
+                        curRepeatExceptions.add(getTimestamp(value))
+                    } else if (line.startsWith(LOCATION)) {
+                        curLocation = getLocation(line.substring(LOCATION.length).replace("\\,", ","))
+                    } else if (line == END_ALARM) {
+                        if (isProperReminderAction && curReminderTriggerMinutes != -1) {
+                            curReminderMinutes.add(curReminderTriggerMinutes)
+                        }
+                    } else if (line == END_EVENT) {
+                        if (curStart != -1 && curEnd == -1) {
+                            curEnd = curStart
+                        }
+
+                        if (curTitle.isEmpty() || curStart == -1) {
+                            continue
+                        }
+
+                        val eventToUpdate = existingEvents.firstOrNull { curImportId.isNotEmpty() && curImportId == it.importId }
+                        if (eventToUpdate != null && eventToUpdate.lastUpdated >= curLastModified) {
+                            continue
+                        }
+
+                        val eventType = eventTypes.firstOrNull { it.id == curEventTypeId }
+                        val source = if (calDAVCalendarId == 0 || eventType?.isSyncedEventType() == false) SOURCE_IMPORTED_ICS else "$CALDAV-$calDAVCalendarId"
+                        val event = Event(0, curStart, curEnd, curTitle, curDescription, curReminderMinutes.getOrElse(0, { -1 }),
+                                curReminderMinutes.getOrElse(1, { -1 }), curReminderMinutes.getOrElse(2, { -1 }), curRepeatInterval,
+                                curImportId, curFlags, curRepeatLimit, curRepeatRule, curEventTypeId, lastUpdated = curLastModified,
+                                source = source, location = curLocation)
+
+                        if (event.getIsAllDay() && curEnd > curStart) {
+                            event.endTS -= DAY
+                        }
+
+                        if (eventToUpdate == null) {
+                            if (curRepeatExceptions.isEmpty()) {
+                                eventsToInsert.add(event)
+                            } else {
+                                activity.dbHelper.insert(event, true) {
+                                    for (exceptionTS in curRepeatExceptions) {
+                                        activity.dbHelper.addEventRepeatException(it, exceptionTS, true)
+                                    }
+                                    existingEvents.add(event)
+                                }
+                            }
+                        } else {
+                            event.id = eventToUpdate.id
+                            activity.dbHelper.update(event, true)
+                        }
+                        eventsImported++
+                        resetValues()
+                    }
+                    prevLine = line
+                }
+            }
+
+            activity.dbHelper.insertEvents(eventsToInsert, true)
+        } catch (e: Exception) {
+            activity.showErrorToast(e, Toast.LENGTH_LONG)
+            eventsFailed++
+        }
+
+        return when {
+            eventsImported == 0 -> IMPORT_FAIL
+            eventsFailed > 0 -> IMPORT_PARTIAL
+            else -> IMPORT_OK
+        }
+    }
+
+    private fun getTimestamp(fullString: String): Int {
+        return try {
+            if (fullString.startsWith(';')) {
+                val value = fullString.substring(fullString.lastIndexOf(':') + 1)
+                if (!value.contains("T")) {
+                    curFlags = curFlags or FLAG_ALL_DAY
+                }
+
+                Parser().parseDateTimeValue(value)
+            } else {
+                Parser().parseDateTimeValue(fullString.substring(1))
+            }
+        } catch (e: Exception) {
+            activity.showErrorToast(e, Toast.LENGTH_LONG)
+            eventsFailed++
+            -1
+        }
+    }
+
+    private fun getLocation(fullString: String): String {
+        return if (fullString.startsWith(":")) {
+            fullString.trimStart(':')
+        } else {
+            fullString.substringAfter(':').trim()
+        }
+    }
+
+    private fun tryAddCategories(categories: String, context: Context) {
+        val eventTypeTitle = if (categories.contains(",")) {
+            categories.split(",")[0]
+        } else {
+            categories
+        }
+
+        val eventId = context.dbHelper.getEventTypeIdWithTitle(eventTypeTitle)
+        curEventTypeId = if (eventId == -1) {
+            val newTypeColor = if (curCategoryColor == -2) context.resources.getColor(R.color.color_primary) else curCategoryColor
+            val eventType = EventType(0, eventTypeTitle, newTypeColor)
+            context.dbHelper.insertEventType(eventType)
+        } else {
+            eventId
+        }
+    }
+
+    private fun getTitle(title: String): String {
+        return if (title.startsWith(";") && title.contains(":")) {
+            title.substring(title.lastIndexOf(':') + 1)
+        } else {
+            title.substring(1, Math.min(title.length, 80))
+        }
+    }
+
+    private fun resetValues() {
+        curStart = -1
+        curEnd = -1
+        curTitle = ""
+        curDescription = ""
+        curImportId = ""
+        curFlags = 0
+        curReminderMinutes = ArrayList()
+        curRepeatExceptions = ArrayList()
+        curRepeatInterval = 0
+        curRepeatLimit = 0
+        curRepeatRule = 0
+        curEventTypeId = DBHelper.REGULAR_EVENT_TYPE_ID
+        curLastModified = 0L
+        curCategoryColor = -2
+        curLocation = ""
+        isNotificationDescription = false
+        isProperReminderAction = false
+        curReminderTriggerMinutes = -1
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MonthlyCalendarImpl.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MonthlyCalendarImpl.kt
new file mode 100644
index 0000000000000000000000000000000000000000..2c6fa6b5d23710cead082e147482425509f3a9c3
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MonthlyCalendarImpl.kt
@@ -0,0 +1,141 @@
+package com.simplemobiletools.calendar.helpers
+
+import android.content.Context
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.getFilteredEvents
+import com.simplemobiletools.calendar.extensions.seconds
+import com.simplemobiletools.calendar.interfaces.MonthlyCalendar
+import com.simplemobiletools.calendar.models.DayMonthly
+import com.simplemobiletools.calendar.models.Event
+import org.joda.time.DateTime
+import java.util.*
+import kotlin.collections.ArrayList
+
+class MonthlyCalendarImpl(val mCallback: MonthlyCalendar, val mContext: Context) {
+    private val DAYS_CNT = 42
+    private val YEAR_PATTERN = "YYYY"
+
+    private val mToday: String = DateTime().toString(Formatter.DAYCODE_PATTERN)
+    private var mEvents = ArrayList<Event>()
+    private var mFilterEventTypes = true
+
+    lateinit var mTargetDate: DateTime
+
+    fun updateMonthlyCalendar(targetDate: DateTime, filterEventTypes: Boolean = true) {
+        mFilterEventTypes = filterEventTypes
+        mTargetDate = targetDate
+        val startTS = mTargetDate.minusDays(7).seconds()
+        val endTS = mTargetDate.plusDays(43).seconds()
+        mContext.dbHelper.getEvents(startTS, endTS) {
+            gotEvents(it as ArrayList<Event>)
+        }
+    }
+
+    fun getMonth(targetDate: DateTime) {
+        updateMonthlyCalendar(targetDate)
+    }
+
+    fun getDays(markDaysWithEvents: Boolean) {
+        val days = ArrayList<DayMonthly>(DAYS_CNT)
+        val currMonthDays = mTargetDate.dayOfMonth().maximumValue
+        var firstDayIndex = mTargetDate.withDayOfMonth(1).dayOfWeek
+        if (!mContext.config.isSundayFirst)
+            firstDayIndex -= 1
+        val prevMonthDays = mTargetDate.minusMonths(1).dayOfMonth().maximumValue
+
+        var isThisMonth = false
+        var isToday: Boolean
+        var value = prevMonthDays - firstDayIndex + 1
+        var curDay = mTargetDate
+
+        for (i in 0 until DAYS_CNT) {
+            when {
+                i < firstDayIndex -> {
+                    isThisMonth = false
+                    curDay = mTargetDate.withDayOfMonth(1).minusMonths(1)
+                }
+                i == firstDayIndex -> {
+                    value = 1
+                    isThisMonth = true
+                    curDay = mTargetDate
+                }
+                value == currMonthDays + 1 -> {
+                    value = 1
+                    isThisMonth = false
+                    curDay = mTargetDate.withDayOfMonth(1).plusMonths(1)
+                }
+            }
+
+            isToday = isToday(curDay, value)
+
+            val newDay = curDay.withDayOfMonth(value)
+            val dayCode = Formatter.getDayCodeFromDateTime(newDay)
+            val day = DayMonthly(value, isThisMonth, isToday, dayCode, newDay.weekOfWeekyear, ArrayList(), i)
+            days.add(day)
+            value++
+        }
+
+        if (markDaysWithEvents) {
+            markDaysWithEvents(days)
+        } else {
+            mCallback.updateMonthlyCalendar(mContext, monthName, days, false)
+        }
+    }
+
+    // it works more often than not, dont touch
+    private fun markDaysWithEvents(days: ArrayList<DayMonthly>) {
+        mContext.dbHelper.getEventTypes {
+            val dayEvents = HashMap<String, ArrayList<Event>>()
+            mEvents.forEach {
+                val startDateTime = Formatter.getDateTimeFromTS(it.startTS)
+                val endDateTime = Formatter.getDateTimeFromTS(it.endTS)
+                val endCode = Formatter.getDayCodeFromDateTime(endDateTime)
+
+                var currDay = startDateTime
+                var dayCode = Formatter.getDayCodeFromDateTime(currDay)
+                var currDayEvents = dayEvents[dayCode] ?: ArrayList()
+                currDayEvents.add(it)
+                dayEvents[dayCode] = currDayEvents
+
+                while (Formatter.getDayCodeFromDateTime(currDay) != endCode) {
+                    currDay = currDay.plusDays(1)
+                    dayCode = Formatter.getDayCodeFromDateTime(currDay)
+                    currDayEvents = dayEvents[dayCode] ?: ArrayList()
+                    currDayEvents.add(it)
+                    dayEvents[dayCode] = currDayEvents
+                }
+            }
+
+            days.filter { dayEvents.keys.contains(it.code) }.forEach {
+                it.dayEvents = dayEvents[it.code]!!
+            }
+            mCallback.updateMonthlyCalendar(mContext, monthName, days, true)
+        }
+    }
+
+    private fun isToday(targetDate: DateTime, curDayInMonth: Int): Boolean {
+        val targetMonthDays = targetDate.dayOfMonth().maximumValue
+        return targetDate.withDayOfMonth(Math.min(curDayInMonth, targetMonthDays)).toString(Formatter.DAYCODE_PATTERN) == mToday
+    }
+
+    private val monthName: String
+        get() {
+            var month = Formatter.getMonthName(mContext, mTargetDate.monthOfYear)
+            val targetYear = mTargetDate.toString(YEAR_PATTERN)
+            if (targetYear != DateTime().toString(YEAR_PATTERN)) {
+                month += " $targetYear"
+            }
+            return month
+        }
+
+    private fun gotEvents(events: ArrayList<Event>) {
+        mEvents = if (mFilterEventTypes) {
+            mContext.getFilteredEvents(events) as ArrayList<Event>
+        } else {
+            events
+        }
+
+        getDays(true)
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetListProvider.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetListProvider.kt
new file mode 100644
index 0000000000000000000000000000000000000000..2e2903d86c5fb5b8f34faba488a62add9c63fa72
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetListProvider.kt
@@ -0,0 +1,89 @@
+package com.simplemobiletools.calendar.helpers
+
+import android.app.PendingIntent
+import android.appwidget.AppWidgetManager
+import android.appwidget.AppWidgetProvider
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.net.Uri
+import android.widget.RemoteViews
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SplashActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.launchNewEventIntent
+import com.simplemobiletools.calendar.services.WidgetService
+import com.simplemobiletools.commons.extensions.*
+import org.joda.time.DateTime
+
+class MyWidgetListProvider : AppWidgetProvider() {
+    private val NEW_EVENT = "new_event"
+    private val LAUNCH_TODAY = "launch_today"
+
+    override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
+        performUpdate(context)
+    }
+
+    private fun performUpdate(context: Context) {
+        val fontSize = context.config.getFontSize()
+        val textColor = context.config.widgetTextColor
+
+        val appWidgetManager = AppWidgetManager.getInstance(context)
+        appWidgetManager.getAppWidgetIds(getComponentName(context)).forEach {
+            val views = RemoteViews(context.packageName, R.layout.widget_event_list).apply {
+                setBackgroundColor(R.id.widget_event_list_holder, context.config.widgetBgColor)
+                setTextColor(R.id.widget_event_list_empty, textColor)
+                setTextSize(R.id.widget_event_list_empty, fontSize)
+
+                setTextColor(R.id.widget_event_list_today, textColor)
+                setTextSize(R.id.widget_event_list_today, fontSize)
+            }
+
+            val todayText = Formatter.getLongestDate(getNowSeconds())
+            views.setText(R.id.widget_event_list_today, todayText)
+
+            views.setImageViewBitmap(R.id.widget_event_new_event, context.resources.getColoredBitmap(R.drawable.ic_plus, textColor))
+            setupIntent(context, views, NEW_EVENT, R.id.widget_event_new_event)
+            setupIntent(context, views, LAUNCH_TODAY, R.id.widget_event_list_today)
+
+            Intent(context, WidgetService::class.java).apply {
+                data = Uri.parse(this.toUri(Intent.URI_INTENT_SCHEME))
+                views.setRemoteAdapter(R.id.widget_event_list, this)
+            }
+
+            val startActivityIntent = context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)
+            val startActivityPendingIntent = PendingIntent.getActivity(context, 0, startActivityIntent, PendingIntent.FLAG_UPDATE_CURRENT)
+            views.setPendingIntentTemplate(R.id.widget_event_list, startActivityPendingIntent)
+            views.setEmptyView(R.id.widget_event_list, R.id.widget_event_list_empty)
+
+            appWidgetManager.updateAppWidget(it, views)
+            appWidgetManager.notifyAppWidgetViewDataChanged(it, R.id.widget_event_list)
+        }
+    }
+
+    private fun getComponentName(context: Context) = ComponentName(context, MyWidgetListProvider::class.java)
+
+    private fun setupIntent(context: Context, views: RemoteViews, action: String, id: Int) {
+        Intent(context, MyWidgetListProvider::class.java).apply {
+            this.action = action
+            val pendingIntent = PendingIntent.getBroadcast(context, 0, this, 0)
+            views.setOnClickPendingIntent(id, pendingIntent)
+        }
+    }
+
+    override fun onReceive(context: Context, intent: Intent) {
+        when (intent.action) {
+            NEW_EVENT -> context.launchNewEventIntent()
+            LAUNCH_TODAY -> launchDayActivity(context)
+            else -> super.onReceive(context, intent)
+        }
+    }
+
+    private fun launchDayActivity(context: Context) {
+        (context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)).apply {
+            putExtra(DAY_CODE, Formatter.getDayCodeFromDateTime(DateTime()))
+            addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
+            context.startActivity(this)
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetMonthlyProvider.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetMonthlyProvider.kt
new file mode 100644
index 0000000000000000000000000000000000000000..672b39dfa4455f82257c477ceda3dc0a661739f1
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/MyWidgetMonthlyProvider.kt
@@ -0,0 +1,212 @@
+package com.simplemobiletools.calendar.helpers
+
+import android.app.PendingIntent
+import android.appwidget.AppWidgetManager
+import android.appwidget.AppWidgetProvider
+import android.content.ComponentName
+import android.content.Context
+import android.content.Intent
+import android.content.res.Resources
+import android.view.View
+import android.widget.RemoteViews
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.activities.SplashActivity
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.launchNewEventIntent
+import com.simplemobiletools.calendar.interfaces.MonthlyCalendar
+import com.simplemobiletools.calendar.models.DayMonthly
+import com.simplemobiletools.commons.extensions.*
+import org.joda.time.DateTime
+
+class MyWidgetMonthlyProvider : AppWidgetProvider() {
+    private val PREV = "prev"
+    private val NEXT = "next"
+    private val NEW_EVENT = "new_event"
+
+    companion object {
+        private var targetDate = DateTime.now().withDayOfMonth(1)
+    }
+
+    override fun onUpdate(context: Context, appWidgetManager: AppWidgetManager, appWidgetIds: IntArray) {
+        performUpdate(context)
+    }
+
+    private fun performUpdate(context: Context) {
+        MonthlyCalendarImpl(monthlyCalendar, context).getMonth(targetDate)
+    }
+
+    private fun getComponentName(context: Context) = ComponentName(context, MyWidgetMonthlyProvider::class.java)
+
+    private fun setupIntent(context: Context, views: RemoteViews, action: String, id: Int) {
+        Intent(context, MyWidgetMonthlyProvider::class.java).apply {
+            this.action = action
+            val pendingIntent = PendingIntent.getBroadcast(context, 0, this, 0)
+            views.setOnClickPendingIntent(id, pendingIntent)
+        }
+    }
+
+    private fun setupAppOpenIntent(context: Context, views: RemoteViews, id: Int, dayCode: String) {
+        (context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)).apply {
+            putExtra(DAY_CODE, dayCode)
+            putExtra(OPEN_MONTH, true)
+            val pendingIntent = PendingIntent.getActivity(context, Integer.parseInt(dayCode.substring(0, 6)), this, 0)
+            views.setOnClickPendingIntent(id, pendingIntent)
+        }
+    }
+
+    private fun setupDayOpenIntent(context: Context, views: RemoteViews, id: Int, dayCode: String) {
+        (context.getLaunchIntent() ?: Intent(context, SplashActivity::class.java)).apply {
+            putExtra(DAY_CODE, dayCode)
+            val pendingIntent = PendingIntent.getActivity(context, Integer.parseInt(dayCode), this, 0)
+            views.setOnClickPendingIntent(id, pendingIntent)
+        }
+    }
+
+    override fun onReceive(context: Context, intent: Intent) {
+        when (intent.action) {
+            PREV -> getPrevMonth(context)
+            NEXT -> getNextMonth(context)
+            NEW_EVENT -> context.launchNewEventIntent()
+            else -> super.onReceive(context, intent)
+        }
+    }
+
+    private fun getPrevMonth(context: Context) {
+        targetDate = targetDate!!.minusMonths(1)
+        MonthlyCalendarImpl(monthlyCalendar, context).getMonth(targetDate!!)
+    }
+
+    private fun getNextMonth(context: Context) {
+        targetDate = targetDate!!.plusMonths(1)
+        MonthlyCalendarImpl(monthlyCalendar, context).getMonth(targetDate!!)
+    }
+
+    private fun updateDays(context: Context, views: RemoteViews, days: List<DayMonthly>) {
+        val displayWeekNumbers = context.config.showWeekNumbers
+        val textColor = context.config.widgetTextColor
+        val dimPastEvents = context.config.dimPastEvents
+        val smallerFontSize = context.config.getFontSize() - 3f
+        val res = context.resources
+        val len = days.size
+        val packageName = context.packageName
+        views.apply {
+            setTextColor(R.id.week_num, textColor)
+            setTextSize(R.id.week_num, smallerFontSize)
+            setViewVisibility(R.id.week_num, if (displayWeekNumbers) View.VISIBLE else View.GONE)
+        }
+
+        for (i in 0..5) {
+            val id = res.getIdentifier("week_num_$i", "id", packageName)
+            views.apply {
+                setText(id, "${days[i * 7 + 3].weekOfYear}:")    // fourth day of the week matters at determining week of the year
+                setTextColor(id, textColor)
+                setTextSize(id, smallerFontSize)
+                setViewVisibility(id, if (displayWeekNumbers) View.VISIBLE else View.GONE)
+            }
+        }
+
+        val weakTextColor = textColor.adjustAlpha(LOW_ALPHA)
+        for (i in 0 until len) {
+            val day = days[i]
+            val currTextColor = if (day.isThisMonth) textColor else weakTextColor
+            val id = res.getIdentifier("day_$i", "id", packageName)
+            views.removeAllViews(id)
+            addDayNumber(context, views, day, currTextColor, id)
+            setupDayOpenIntent(context, views, id, day.code)
+
+            day.dayEvents.forEach {
+                var backgroundColor = it.color
+                var eventTextColor = backgroundColor.getContrastColor()
+
+                if (!day.isThisMonth || (dimPastEvents && it.isPastEvent)) {
+                    eventTextColor = eventTextColor.adjustAlpha(0.25f)
+                    backgroundColor = backgroundColor.adjustAlpha(0.25f)
+                }
+
+                val newRemoteView = RemoteViews(packageName, R.layout.day_monthly_event_view).apply {
+                    setText(R.id.day_monthly_event_id, it.title.replace(" ", "\u00A0"))
+                    setTextColor(R.id.day_monthly_event_id, eventTextColor)
+                    setTextSize(R.id.day_monthly_event_id, smallerFontSize - 3f)
+                    setBackgroundColor(R.id.day_monthly_event_id, backgroundColor)
+                }
+                views.addView(id, newRemoteView)
+            }
+        }
+    }
+
+    private fun addDayNumber(context: Context, views: RemoteViews, day: DayMonthly, textColor: Int, id: Int) {
+        val newRemoteView = RemoteViews(context.packageName, R.layout.day_monthly_number_view).apply {
+            setText(R.id.day_monthly_number_id, day.value.toString())
+            setTextSize(R.id.day_monthly_number_id, context.config.getFontSize() - 3f)
+
+            if (day.isToday) {
+                setBackgroundColor(R.id.day_monthly_number_id, textColor)
+                setTextColor(R.id.day_monthly_number_id, textColor.getContrastColor())
+            } else {
+                setTextColor(R.id.day_monthly_number_id, textColor)
+            }
+        }
+        views.addView(id, newRemoteView)
+    }
+
+    private val monthlyCalendar = object : MonthlyCalendar {
+        override fun updateMonthlyCalendar(context: Context, month: String, days: ArrayList<DayMonthly>, checkedEvents: Boolean) {
+            val largerFontSize = context.config.getFontSize() + 3f
+            val textColor = context.config.widgetTextColor
+            val resources = context.resources
+
+            val appWidgetManager = AppWidgetManager.getInstance(context)
+            appWidgetManager.getAppWidgetIds(getComponentName(context)).forEach {
+                val views = RemoteViews(context.packageName, R.layout.fragment_month_widget)
+                views.setText(R.id.top_value, month)
+
+                views.setBackgroundColor(R.id.calendar_holder, context.config.widgetBgColor)
+
+                views.setTextColor(R.id.top_value, textColor)
+                views.setTextSize(R.id.top_value, largerFontSize)
+
+                var bmp = resources.getColoredBitmap(R.drawable.ic_pointer_left, textColor)
+                views.setImageViewBitmap(R.id.top_left_arrow, bmp)
+
+                bmp = resources.getColoredBitmap(R.drawable.ic_pointer_right, textColor)
+                views.setImageViewBitmap(R.id.top_right_arrow, bmp)
+
+                bmp = resources.getColoredBitmap(R.drawable.ic_plus, textColor)
+                views.setImageViewBitmap(R.id.top_new_event, bmp)
+                updateDayLabels(context, views, resources, textColor)
+                updateDays(context, views, days)
+
+                setupIntent(context, views, PREV, R.id.top_left_arrow)
+                setupIntent(context, views, NEXT, R.id.top_right_arrow)
+                setupIntent(context, views, NEW_EVENT, R.id.top_new_event)
+
+                val monthCode = days.firstOrNull { it.code.substring(6) == "01" }?.code ?: Formatter.getTodayCode(context)
+                setupAppOpenIntent(context, views, R.id.top_value, monthCode)
+
+                try {
+                    appWidgetManager.updateAppWidget(it, views)
+                } catch (ignored: RuntimeException) {
+                }
+            }
+        }
+    }
+
+    private fun updateDayLabels(context: Context, views: RemoteViews, resources: Resources, textColor: Int) {
+        val sundayFirst = context.config.isSundayFirst
+        val smallerFontSize = context.config.getFontSize()
+        val packageName = context.packageName
+        val letters = context.resources.getStringArray(R.array.week_day_letters)
+        for (i in 0..6) {
+            val id = resources.getIdentifier("label_$i", "id", packageName)
+            views.setTextColor(id, textColor)
+            views.setTextSize(id, smallerFontSize)
+
+            var index = i
+            if (sundayFirst) {
+                index = (index + 6) % letters.size
+            }
+
+            views.setText(id, letters[index])
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Parser.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Parser.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f70989897094fbf2236519047c5e318628df364d
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/Parser.kt
@@ -0,0 +1,222 @@
+package com.simplemobiletools.calendar.helpers
+
+import com.simplemobiletools.calendar.extensions.isXMonthlyRepetition
+import com.simplemobiletools.calendar.extensions.isXWeeklyRepetition
+import com.simplemobiletools.calendar.extensions.isXYearlyRepetition
+import com.simplemobiletools.calendar.extensions.seconds
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.calendar.models.RepeatRule
+import com.simplemobiletools.commons.helpers.*
+import org.joda.time.DateTimeZone
+import org.joda.time.format.DateTimeFormat
+
+class Parser {
+    // from RRULE:FREQ=DAILY;COUNT=5 to Daily, 5x...
+    fun parseRepeatInterval(fullString: String, startTS: Int): RepeatRule {
+        val parts = fullString.split(";")
+        var repeatInterval = 0
+        var repeatRule = 0
+        var repeatLimit = 0
+        if (fullString.isEmpty()) {
+            return RepeatRule(repeatInterval, repeatRule, repeatLimit)
+        }
+
+        for (part in parts) {
+            val keyValue = part.split("=")
+            val key = keyValue[0]
+            val value = keyValue[1]
+            if (key == FREQ) {
+                repeatInterval = getFrequencySeconds(value)
+                if (value == WEEKLY) {
+                    val start = Formatter.getDateTimeFromTS(startTS)
+                    repeatRule = Math.pow(2.0, (start.dayOfWeek - 1).toDouble()).toInt()
+                } else if (value == MONTHLY || value == YEARLY) {
+                    repeatRule = REPEAT_SAME_DAY
+                }
+            } else if (key == COUNT) {
+                repeatLimit = -value.toInt()
+            } else if (key == UNTIL) {
+                repeatLimit = parseDateTimeValue(value)
+            } else if (key == INTERVAL) {
+                repeatInterval *= value.toInt()
+            } else if (key == BYDAY) {
+                if (repeatInterval.isXWeeklyRepetition()) {
+                    repeatRule = handleRepeatRule(value)
+                } else if (repeatInterval.isXMonthlyRepetition() || repeatInterval.isXYearlyRepetition()) {
+                    repeatRule = if (value.startsWith("-1")) REPEAT_ORDER_WEEKDAY_USE_LAST else REPEAT_ORDER_WEEKDAY
+                }
+            } else if (key == BYMONTHDAY && value.toInt() == -1) {
+                repeatRule = REPEAT_LAST_DAY
+            }
+        }
+        return RepeatRule(repeatInterval, repeatRule, repeatLimit)
+    }
+
+    private fun getFrequencySeconds(interval: String) = when (interval) {
+        DAILY -> DAY
+        WEEKLY -> WEEK
+        MONTHLY -> MONTH
+        YEARLY -> YEAR
+        else -> 0
+    }
+
+    private fun handleRepeatRule(value: String): Int {
+        var newRepeatRule = 0
+        if (value.contains(MO))
+            newRepeatRule = newRepeatRule or MONDAY_BIT
+        if (value.contains(TU))
+            newRepeatRule = newRepeatRule or TUESDAY_BIT
+        if (value.contains(WE))
+            newRepeatRule = newRepeatRule or WEDNESDAY_BIT
+        if (value.contains(TH))
+            newRepeatRule = newRepeatRule or THURSDAY_BIT
+        if (value.contains(FR))
+            newRepeatRule = newRepeatRule or FRIDAY_BIT
+        if (value.contains(SA))
+            newRepeatRule = newRepeatRule or SATURDAY_BIT
+        if (value.contains(SU))
+            newRepeatRule = newRepeatRule or SUNDAY_BIT
+        return newRepeatRule
+    }
+
+    fun parseDateTimeValue(value: String): Int {
+        val edited = value.replace("T", "").replace("Z", "")
+        return if (edited.length == 14) {
+            parseLongFormat(edited, value.endsWith("Z"))
+        } else {
+            val dateTimeFormat = DateTimeFormat.forPattern("yyyyMMdd")
+            dateTimeFormat.parseDateTime(edited).withHourOfDay(5).seconds()
+        }
+    }
+
+    private fun parseLongFormat(digitString: String, useUTC: Boolean): Int {
+        val dateTimeFormat = DateTimeFormat.forPattern("yyyyMMddHHmmss")
+        val dateTimeZone = if (useUTC) DateTimeZone.UTC else DateTimeZone.getDefault()
+        return dateTimeFormat.parseDateTime(digitString).withZoneRetainFields(dateTimeZone).seconds()
+    }
+
+    // from Daily, 5x... to RRULE:FREQ=DAILY;COUNT=5
+    fun getRepeatCode(event: Event): String {
+        val repeatInterval = event.repeatInterval
+        if (repeatInterval == 0)
+            return ""
+
+        val freq = getFreq(repeatInterval)
+        val interval = getInterval(repeatInterval)
+        val repeatLimit = getRepeatLimitString(event)
+        val byMonth = getByMonth(event)
+        val byDay = getByDay(event)
+        return "$FREQ=$freq;$INTERVAL=$interval$repeatLimit$byMonth$byDay"
+    }
+
+    private fun getFreq(interval: Int) = when {
+        interval % YEAR == 0 -> YEARLY
+        interval % MONTH == 0 -> MONTHLY
+        interval % WEEK == 0 -> WEEKLY
+        else -> DAILY
+    }
+
+    private fun getInterval(interval: Int) = when {
+        interval % YEAR == 0 -> interval / YEAR
+        interval % MONTH == 0 -> interval / MONTH
+        interval % WEEK == 0 -> interval / WEEK
+        else -> interval / DAY
+    }
+
+    private fun getRepeatLimitString(event: Event) = when {
+        event.repeatLimit == 0 -> ""
+        event.repeatLimit < 0 -> ";$COUNT=${-event.repeatLimit}"
+        else -> ";$UNTIL=${Formatter.getDayCodeFromTS(event.repeatLimit)}"
+    }
+
+    private fun getByMonth(event: Event) = when {
+        event.repeatInterval.isXYearlyRepetition() -> {
+            val start = Formatter.getDateTimeFromTS(event.startTS)
+            ";$BYMONTH=${start.monthOfYear}"
+        }
+        else -> ""
+    }
+
+    private fun getByDay(event: Event) = when {
+        event.repeatInterval.isXWeeklyRepetition() -> {
+            val days = getByDayString(event.repeatRule)
+            ";$BYDAY=$days"
+        }
+        event.repeatInterval.isXMonthlyRepetition() || event.repeatInterval.isXYearlyRepetition() -> when (event.repeatRule) {
+            REPEAT_LAST_DAY -> ";$BYMONTHDAY=-1"
+            REPEAT_ORDER_WEEKDAY_USE_LAST, REPEAT_ORDER_WEEKDAY -> {
+                val start = Formatter.getDateTimeFromTS(event.startTS)
+                val dayOfMonth = start.dayOfMonth
+                val isLastWeekday = start.monthOfYear != start.plusDays(7).monthOfYear
+                val order = if (isLastWeekday) "-1" else ((dayOfMonth - 1) / 7 + 1).toString()
+                val day = getDayLetters(start.dayOfWeek)
+                ";$BYDAY=$order$day"
+            }
+            else -> ""
+        }
+        else -> ""
+    }
+
+    private fun getByDayString(rule: Int): String {
+        var result = ""
+        if (rule and MONDAY_BIT != 0)
+            result += "$MO,"
+        if (rule and TUESDAY_BIT != 0)
+            result += "$TU,"
+        if (rule and WEDNESDAY_BIT != 0)
+            result += "$WE,"
+        if (rule and THURSDAY_BIT != 0)
+            result += "$TH,"
+        if (rule and FRIDAY_BIT != 0)
+            result += "$FR,"
+        if (rule and SATURDAY_BIT != 0)
+            result += "$SA,"
+        if (rule and SUNDAY_BIT != 0)
+            result += "$SU,"
+        return result.trimEnd(',')
+    }
+
+    private fun getDayLetters(dayOfWeek: Int) = when (dayOfWeek) {
+        1 -> MO
+        2 -> TU
+        3 -> WE
+        4 -> TH
+        5 -> FR
+        6 -> SA
+        else -> SU
+    }
+
+    // from P0DT1H5M0S to 3900 (seconds)
+    fun parseDurationSeconds(duration: String): Int {
+        val weeks = getDurationValue(duration, "W")
+        val days = getDurationValue(duration, "D")
+        val hours = getDurationValue(duration, "H")
+        val minutes = getDurationValue(duration, "M")
+        val seconds = getDurationValue(duration, "S")
+
+        val minSecs = 60
+        val hourSecs = minSecs * 60
+        val daySecs = hourSecs * 24
+        val weekSecs = daySecs * 7
+
+        return seconds + (minutes * minSecs) + (hours * hourSecs) + (days * daySecs) + (weeks * weekSecs)
+    }
+
+    private fun getDurationValue(duration: String, char: String) = Regex("[0-9]+(?=$char)").find(duration)?.value?.toInt() ?: 0
+
+    // from 65 to P0DT1H5M0S
+    fun getDurationCode(minutes: Int): String {
+        var days = 0
+        var hours = 0
+        var remainder = minutes
+        if (remainder >= DAY_MINUTES) {
+            days = Math.floor((remainder / DAY_MINUTES).toDouble()).toInt()
+            remainder -= days * DAY_MINUTES
+        }
+        if (remainder >= 60) {
+            hours = Math.floor((remainder / 60).toDouble()).toInt()
+            remainder -= hours * 60
+        }
+        return "P${days}DT${hours}H${remainder}M0S"
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/WeeklyCalendarImpl.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/WeeklyCalendarImpl.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5984a355c52cc942719a2be0922bc61d5420e62b
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/WeeklyCalendarImpl.kt
@@ -0,0 +1,21 @@
+package com.simplemobiletools.calendar.helpers
+
+import android.content.Context
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.interfaces.WeeklyCalendar
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.commons.helpers.WEEK_SECONDS
+import java.util.*
+
+class WeeklyCalendarImpl(val mCallback: WeeklyCalendar, val mContext: Context) {
+    var mEvents = ArrayList<Event>()
+
+    fun updateWeeklyCalendar(weekStartTS: Int) {
+        val startTS = weekStartTS
+        val endTS = startTS + WEEK_SECONDS
+        mContext.dbHelper.getEvents(startTS, endTS) {
+            mEvents = it as ArrayList<Event>
+            mCallback.updateWeeklyCalendar(it)
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/YearlyCalendarImpl.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/YearlyCalendarImpl.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ab1974cc3be08e55d8ba715209bd297268fd4acd
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/helpers/YearlyCalendarImpl.kt
@@ -0,0 +1,61 @@
+package com.simplemobiletools.calendar.helpers
+
+import android.content.Context
+import android.util.SparseArray
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.getFilteredEvents
+import com.simplemobiletools.calendar.extensions.seconds
+import com.simplemobiletools.calendar.interfaces.YearlyCalendar
+import com.simplemobiletools.calendar.models.DayYearly
+import com.simplemobiletools.calendar.models.Event
+import org.joda.time.DateTime
+import java.util.*
+
+class YearlyCalendarImpl(val callback: YearlyCalendar, val context: Context, val year: Int) {
+
+    fun getEvents(year: Int) {
+        val startDateTime = DateTime().withTime(0, 0, 0, 0).withDate(year, 1, 1)
+        val startTS = startDateTime.seconds()
+        val endTS = startDateTime.plusYears(1).minusSeconds(1).seconds()
+        context.dbHelper.getEvents(startTS, endTS) {
+            gotEvents(it)
+        }
+    }
+
+    private fun gotEvents(events: MutableList<Event>) {
+        val filtered = context.getFilteredEvents(events)
+        val arr = SparseArray<ArrayList<DayYearly>>(12)
+
+        filtered.forEach {
+            val startDateTime = Formatter.getDateTimeFromTS(it.startTS)
+            markDay(arr, startDateTime, it)
+
+            val startCode = Formatter.getDayCodeFromDateTime(startDateTime)
+            val endDateTime = Formatter.getDateTimeFromTS(it.endTS)
+            val endCode = Formatter.getDayCodeFromDateTime(endDateTime)
+            if (startCode != endCode) {
+                var currDateTime = startDateTime
+                while (Formatter.getDayCodeFromDateTime(currDateTime) != endCode) {
+                    currDateTime = currDateTime.plusDays(1)
+                    markDay(arr, currDateTime, it)
+                }
+            }
+        }
+        callback.updateYearlyCalendar(arr, filtered.hashCode())
+    }
+
+    private fun markDay(arr: SparseArray<ArrayList<DayYearly>>, dateTime: DateTime, event: Event) {
+        val month = dateTime.monthOfYear
+        val day = dateTime.dayOfMonth
+
+        if (arr[month] == null) {
+            arr.put(month, ArrayList())
+            for (i in 1..32)
+                arr.get(month).add(DayYearly())
+        }
+
+        if (dateTime.year == year) {
+            arr.get(month)[day].addColor(event.color)
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/DeleteEventTypesListener.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/DeleteEventTypesListener.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f6b5475e976b64150617809670c3248ed3af4cd6
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/DeleteEventTypesListener.kt
@@ -0,0 +1,8 @@
+package com.simplemobiletools.calendar.interfaces
+
+import com.simplemobiletools.calendar.models.EventType
+import java.util.*
+
+interface DeleteEventTypesListener {
+    fun deleteEventTypes(eventTypes: ArrayList<EventType>, deleteEvents: Boolean): Boolean
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/MonthlyCalendar.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/MonthlyCalendar.kt
new file mode 100644
index 0000000000000000000000000000000000000000..1ada47f89c473e1d4f30a9982290d1a86ef1323e
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/MonthlyCalendar.kt
@@ -0,0 +1,8 @@
+package com.simplemobiletools.calendar.interfaces
+
+import android.content.Context
+import com.simplemobiletools.calendar.models.DayMonthly
+
+interface MonthlyCalendar {
+    fun updateMonthlyCalendar(context: Context, month: String, days: ArrayList<DayMonthly>, checkedEvents: Boolean)
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/NavigationListener.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/NavigationListener.kt
new file mode 100644
index 0000000000000000000000000000000000000000..d8a071d020a65088378d709266002c92886e829a
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/NavigationListener.kt
@@ -0,0 +1,11 @@
+package com.simplemobiletools.calendar.interfaces
+
+import org.joda.time.DateTime
+
+interface NavigationListener {
+    fun goLeft()
+
+    fun goRight()
+
+    fun goToDateTime(dateTime: DateTime)
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/WeekFragmentListener.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/WeekFragmentListener.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ba80509839cf601f7fdd21ed9cd3f152d2c94189
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/WeekFragmentListener.kt
@@ -0,0 +1,9 @@
+package com.simplemobiletools.calendar.interfaces
+
+interface WeekFragmentListener {
+    fun scrollTo(y: Int)
+
+    fun updateHoursTopMargin(margin: Int)
+
+    fun getCurrScrollY(): Int
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/WeeklyCalendar.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/WeeklyCalendar.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6c7501506020103243afe63a91fe27a943d72e09
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/WeeklyCalendar.kt
@@ -0,0 +1,7 @@
+package com.simplemobiletools.calendar.interfaces
+
+import com.simplemobiletools.calendar.models.Event
+
+interface WeeklyCalendar {
+    fun updateWeeklyCalendar(events: ArrayList<Event>)
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/YearlyCalendar.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/YearlyCalendar.kt
new file mode 100644
index 0000000000000000000000000000000000000000..cf6ad5da688792814354d8525873e800160faf8d
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/interfaces/YearlyCalendar.kt
@@ -0,0 +1,9 @@
+package com.simplemobiletools.calendar.interfaces
+
+import android.util.SparseArray
+import com.simplemobiletools.calendar.models.DayYearly
+import java.util.*
+
+interface YearlyCalendar {
+    fun updateYearlyCalendar(events: SparseArray<ArrayList<DayYearly>>, hashCode: Int)
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/CalDAVCalendar.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/CalDAVCalendar.kt
new file mode 100644
index 0000000000000000000000000000000000000000..b1f13316a4631f26ab99f0bbd03d43e91c86831a
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/CalDAVCalendar.kt
@@ -0,0 +1,8 @@
+package com.simplemobiletools.calendar.models
+
+data class CalDAVCalendar(val id: Int, val displayName: String, val accountName: String, val accountType: String, val ownerName: String,
+                          val color: Int, val accessLevel: Int) {
+    fun canWrite() = accessLevel >= 500
+
+    fun getFullTitle() = "$displayName ($accountName)"
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/DayMonthly.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/DayMonthly.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8633d330f1001a74437bd58404d5cd613f77e78d
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/DayMonthly.kt
@@ -0,0 +1,5 @@
+package com.simplemobiletools.calendar.models
+
+data class DayMonthly(val value: Int, val isThisMonth: Boolean, val isToday: Boolean, val code: String, val weekOfYear: Int, var dayEvents: ArrayList<Event>,
+                      var indexOnMonthView: Int) {
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/DayYearly.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/DayYearly.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5a965a3c6872c08e1b3f90ae59f0571247b07ce9
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/DayYearly.kt
@@ -0,0 +1,5 @@
+package com.simplemobiletools.calendar.models
+
+data class DayYearly(var eventColors: HashSet<Int> = HashSet()) {
+    fun addColor(color: Int) = eventColors.add(color)
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/Event.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/Event.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6c5de919dff2850758f6f9047393ec9808ff4044
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/Event.kt
@@ -0,0 +1,128 @@
+package com.simplemobiletools.calendar.models
+
+import com.simplemobiletools.calendar.extensions.seconds
+import com.simplemobiletools.calendar.helpers.*
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.commons.helpers.DAY_SECONDS
+import org.joda.time.DateTime
+import java.io.Serializable
+import java.util.*
+
+data class Event(var id: Int = 0, var startTS: Int = 0, var endTS: Int = 0, var title: String = "", var description: String = "",
+                 var reminder1Minutes: Int = -1, var reminder2Minutes: Int = -1, var reminder3Minutes: Int = -1, var repeatInterval: Int = 0,
+                 var importId: String = "", var flags: Int = 0, var repeatLimit: Int = 0, var repeatRule: Int = 0,
+                 var eventType: Int = DBHelper.REGULAR_EVENT_TYPE_ID, var ignoreEventOccurrences: ArrayList<Int> = ArrayList(),
+                 var offset: String = "", var isDstIncluded: Boolean = false, var parentId: Int = 0, var lastUpdated: Long = 0L,
+                 var source: String = SOURCE_SIMPLE_CALENDAR, var color: Int = 0, var location: String = "", var isPastEvent: Boolean = false)
+    : Serializable {
+
+    companion object {
+        private const val serialVersionUID = -32456795132345616L
+    }
+
+    fun addIntervalTime(original: Event) {
+        when (repeatInterval) {
+            DAY -> {
+                startTS += DAY_SECONDS
+                endTS += DAY_SECONDS
+            }
+            else -> {
+                val currStart = Formatter.getDateTimeFromTS(startTS)
+                val newStart = when {
+                    repeatInterval % YEAR == 0 -> when (repeatRule) {
+                        REPEAT_ORDER_WEEKDAY -> addXthDayInterval(currStart, original, false)
+                        REPEAT_ORDER_WEEKDAY_USE_LAST -> addXthDayInterval(currStart, original, true)
+                        else -> currStart.plusYears(repeatInterval / YEAR)
+                    }
+                    repeatInterval % MONTH == 0 -> when (repeatRule) {
+                        REPEAT_SAME_DAY -> addMonthsWithSameDay(currStart, original)
+                        REPEAT_ORDER_WEEKDAY -> addXthDayInterval(currStart, original, false)
+                        REPEAT_ORDER_WEEKDAY_USE_LAST -> addXthDayInterval(currStart, original, true)
+                        else -> currStart.plusMonths(repeatInterval / MONTH).dayOfMonth().withMaximumValue()
+                    }
+                    repeatInterval % WEEK == 0 -> {
+                        // step through weekly repetition by days, as events can trigger multiple times a week
+                        startTS += DAY_SECONDS
+                        endTS += DAY_SECONDS
+                        return
+                    }
+                    else -> {
+                        startTS += repeatInterval
+                        endTS += repeatInterval
+                        return
+                    }
+                }
+                val newStartTS = newStart.seconds()
+                val newEndTS = newStartTS + (endTS - startTS)
+                startTS = newStartTS
+                endTS = newEndTS
+            }
+        }
+    }
+
+    // if an event should happen on 31st with Same Day monthly repetition, dont show it at all at months with 30 or less days
+    private fun addMonthsWithSameDay(currStart: DateTime, original: Event): DateTime {
+        var newDateTime = currStart.plusMonths(repeatInterval / MONTH)
+        if (newDateTime.dayOfMonth == currStart.dayOfMonth) {
+            return newDateTime
+        }
+
+        while (newDateTime.dayOfMonth().maximumValue < Formatter.getDateTimeFromTS(original.startTS).dayOfMonth().maximumValue) {
+            newDateTime = newDateTime.plusMonths(repeatInterval / MONTH)
+            newDateTime = newDateTime.withDayOfMonth(newDateTime.dayOfMonth().maximumValue)
+        }
+        return newDateTime
+    }
+
+    // handle monthly repetitions like Third Monday
+    private fun addXthDayInterval(currStart: DateTime, original: Event, forceLastWeekday: Boolean): DateTime {
+        val day = currStart.dayOfWeek
+        var order = (currStart.dayOfMonth - 1) / 7
+        val properMonth = currStart.withDayOfMonth(7).plusMonths(repeatInterval / MONTH).withDayOfWeek(day)
+        var firstProperDay = properMonth.dayOfMonth % 7
+        if (firstProperDay == 0)
+            firstProperDay = properMonth.dayOfMonth
+
+        // check if it should be for example Fourth Monday, or Last Monday
+        if (forceLastWeekday && (order == 3 || order == 4)) {
+            val originalDateTime = Formatter.getDateTimeFromTS(original.startTS)
+            val isLastWeekday = originalDateTime.monthOfYear != originalDateTime.plusDays(7).monthOfYear
+            if (isLastWeekday)
+                order = -1
+        }
+
+        val daysCnt = properMonth.dayOfMonth().maximumValue
+        var wantedDay = firstProperDay + order * 7
+        if (wantedDay > daysCnt)
+            wantedDay -= 7
+
+        if (order == -1) {
+            wantedDay = firstProperDay + ((daysCnt - firstProperDay) / 7) * 7
+        }
+
+        return properMonth.withDayOfMonth(wantedDay)
+    }
+
+    fun getIsAllDay() = flags and FLAG_ALL_DAY != 0
+
+    fun getReminders() = setOf(reminder1Minutes, reminder2Minutes, reminder3Minutes).filter { it != REMINDER_OFF }
+
+    // properly return the start time of all-day events as midnight
+    fun getEventStartTS(): Int {
+        return if (getIsAllDay()) {
+            Formatter.getDateTimeFromTS(startTS).withTime(0, 0, 0, 0).seconds()
+        } else {
+            startTS
+        }
+    }
+
+    fun getCalDAVEventId(): Long {
+        return try {
+            (importId.split("-").lastOrNull() ?: "0").toString().toLong()
+        } catch (e: NumberFormatException) {
+            0L
+        }
+    }
+
+    fun getCalDAVCalendarId() = if (source.startsWith(CALDAV)) (source.split("-").lastOrNull() ?: "0").toString().toInt() else 0
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/EventType.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/EventType.kt
new file mode 100644
index 0000000000000000000000000000000000000000..77d063a2b58c81d7cd855a4bbad1e95a51e2be80
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/EventType.kt
@@ -0,0 +1,7 @@
+package com.simplemobiletools.calendar.models
+
+data class EventType(var id: Int = 0, var title: String, var color: Int, var caldavCalendarId: Int = 0, var caldavDisplayName: String = "", var caldavEmail: String = "") {
+    fun getDisplayTitle() = if (caldavCalendarId == 0) title else "$caldavDisplayName ($caldavEmail)"
+
+    fun isSyncedEventType() = caldavCalendarId != 0
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/ListEvent.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/ListEvent.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6b3e7c7617bfaa32378f3e4ecad3e4b8afd2f21c
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/ListEvent.kt
@@ -0,0 +1,4 @@
+package com.simplemobiletools.calendar.models
+
+data class ListEvent(var id: Int = 0, var startTS: Int = 0, var endTS: Int = 0, var title: String = "", var description: String = "",
+                var isAllDay: Boolean, var color: Int, var location: String = "", var isPastEvent: Boolean = false) : ListItem()
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/ListItem.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/ListItem.kt
new file mode 100644
index 0000000000000000000000000000000000000000..41e2ece59c72c6b3772fbaabaa482bfa7b064e04
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/ListItem.kt
@@ -0,0 +1,3 @@
+package com.simplemobiletools.calendar.models
+
+open class ListItem
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/ListSection.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/ListSection.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c4aeb7392b702718385a33ff50d93438c879ed90
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/ListSection.kt
@@ -0,0 +1,3 @@
+package com.simplemobiletools.calendar.models
+
+data class ListSection(val title: String, val code: String, val isToday: Boolean, val isPastSection: Boolean) : ListItem()
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/MonthViewEvent.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/MonthViewEvent.kt
new file mode 100644
index 0000000000000000000000000000000000000000..0d9d8c8ab130739a2d8ad2b49ab7df49b254f0e8
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/MonthViewEvent.kt
@@ -0,0 +1,4 @@
+package com.simplemobiletools.calendar.models
+
+data class MonthViewEvent(val id: Int, val title: String, val startTS: Int, val color: Int, val startDayIndex: Int, val daysCnt: Int, val originalStartDayIndex: Int,
+                          val isAllDay: Boolean, val isPastEvent: Boolean)
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/models/RepeatRule.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/models/RepeatRule.kt
new file mode 100644
index 0000000000000000000000000000000000000000..2e6c20223699a5d7b18786254d6c24b56d4c7a9d
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/models/RepeatRule.kt
@@ -0,0 +1,3 @@
+package com.simplemobiletools.calendar.models
+
+data class RepeatRule(val repeatInterval: Int, val repeatRule: Int, val repeatLimit: Int)
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/receivers/BootCompletedReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/receivers/BootCompletedReceiver.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5c1c4144f5bb62e2a3a8a9d4171efffda3534a1c
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/receivers/BootCompletedReceiver.kt
@@ -0,0 +1,25 @@
+package com.simplemobiletools.calendar.receivers
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.notifyRunningEvents
+import com.simplemobiletools.calendar.extensions.recheckCalDAVCalendars
+import com.simplemobiletools.calendar.extensions.scheduleAllEvents
+
+class BootCompletedReceiver : BroadcastReceiver() {
+
+    override fun onReceive(context: Context, intent: Intent) {
+        // try just getting a reference to the db so it updates in time
+        context.dbHelper
+
+        Thread {
+            context.apply {
+                scheduleAllEvents()
+                notifyRunningEvents()
+                recheckCalDAVCalendars {}
+            }
+        }.start()
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/receivers/CalDAVSyncReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/receivers/CalDAVSyncReceiver.kt
new file mode 100644
index 0000000000000000000000000000000000000000..1bc2cbb962d9d38e3950c631ad1624f4551b1ce2
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/receivers/CalDAVSyncReceiver.kt
@@ -0,0 +1,12 @@
+package com.simplemobiletools.calendar.receivers
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import com.simplemobiletools.calendar.extensions.recheckCalDAVCalendars
+
+class CalDAVSyncReceiver : BroadcastReceiver() {
+    override fun onReceive(context: Context, intent: Intent) {
+        context.recheckCalDAVCalendars {}
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/receivers/NotificationReceiver.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/receivers/NotificationReceiver.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3fb716f847ec6c451bfbd1fdde7b447bed6512b0
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/receivers/NotificationReceiver.kt
@@ -0,0 +1,42 @@
+package com.simplemobiletools.calendar.receivers
+
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.os.PowerManager
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.notifyEvent
+import com.simplemobiletools.calendar.extensions.scheduleAllEvents
+import com.simplemobiletools.calendar.extensions.updateListWidget
+import com.simplemobiletools.calendar.helpers.EVENT_ID
+import com.simplemobiletools.calendar.helpers.Formatter
+
+class NotificationReceiver : BroadcastReceiver() {
+    override fun onReceive(context: Context, intent: Intent) {
+        val powerManager = context.getSystemService(Context.POWER_SERVICE) as PowerManager
+        val wakelock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Simple Calendar")
+        wakelock.acquire(3000)
+
+        Thread {
+            handleIntent(context, intent)
+        }.start()
+    }
+
+    private fun handleIntent(context: Context, intent: Intent) {
+        val id = intent.getIntExtra(EVENT_ID, -1)
+        if (id == -1) {
+            return
+        }
+
+        context.updateListWidget()
+        val event = context.dbHelper.getEventWithId(id)
+        if (event == null || event.getReminders().isEmpty()) {
+            return
+        }
+
+        if (!event.ignoreEventOccurrences.contains(Formatter.getDayCodeFromTS(event.startTS).toInt())) {
+            context.notifyEvent(event)
+        }
+        context.scheduleAllEvents()
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/services/SnoozeService.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/services/SnoozeService.kt
new file mode 100644
index 0000000000000000000000000000000000000000..a16cbe568e5f88dbb4f1c8bbe680cd5421ddc709
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/services/SnoozeService.kt
@@ -0,0 +1,16 @@
+package com.simplemobiletools.calendar.services
+
+import android.app.IntentService
+import android.content.Intent
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.dbHelper
+import com.simplemobiletools.calendar.extensions.rescheduleReminder
+import com.simplemobiletools.calendar.helpers.EVENT_ID
+
+class SnoozeService : IntentService("Snooze") {
+    override fun onHandleIntent(intent: Intent) {
+        val eventId = intent.getIntExtra(EVENT_ID, 0)
+        val event = dbHelper.getEventWithId(eventId)
+        rescheduleReminder(event, config.snoozeTime)
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/services/WidgetService.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/services/WidgetService.kt
new file mode 100644
index 0000000000000000000000000000000000000000..d0f80454e46c0bde70a8b842b7aa4a43e464a8a7
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/services/WidgetService.kt
@@ -0,0 +1,9 @@
+package com.simplemobiletools.calendar.services
+
+import android.content.Intent
+import android.widget.RemoteViewsService
+import com.simplemobiletools.calendar.adapters.EventListWidgetAdapter
+
+class WidgetService : RemoteViewsService() {
+    override fun onGetViewFactory(intent: Intent) = EventListWidgetAdapter(applicationContext)
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/views/MonthView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/views/MonthView.kt
new file mode 100644
index 0000000000000000000000000000000000000000..1de5995ac6a16028462086f28fb36ccaeed8abc5
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/views/MonthView.kt
@@ -0,0 +1,337 @@
+package com.simplemobiletools.calendar.views
+
+import android.content.Context
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.graphics.RectF
+import android.text.TextPaint
+import android.text.TextUtils
+import android.util.AttributeSet
+import android.util.SparseIntArray
+import android.view.View
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.extensions.seconds
+import com.simplemobiletools.calendar.helpers.Formatter
+import com.simplemobiletools.calendar.helpers.LOW_ALPHA
+import com.simplemobiletools.calendar.models.DayMonthly
+import com.simplemobiletools.calendar.models.Event
+import com.simplemobiletools.calendar.models.MonthViewEvent
+import com.simplemobiletools.commons.extensions.adjustAlpha
+import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
+import com.simplemobiletools.commons.extensions.getContrastColor
+import com.simplemobiletools.commons.extensions.moveLastItemToFront
+import org.joda.time.DateTime
+import org.joda.time.Days
+
+// used in the Monthly view fragment, 1 view per screen
+class MonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(context, attrs, defStyle) {
+    private val BG_CORNER_RADIUS = 4f
+    private val ROW_COUNT = 6
+
+    private var paint: Paint
+    private var eventTitlePaint: TextPaint
+    private var gridPaint: Paint
+    private var dayWidth = 0f
+    private var dayHeight = 0f
+    private var primaryColor = 0
+    private var textColor = 0
+    private var weekDaysLetterHeight = 0
+    private var eventTitleHeight = 0
+    private var currDayOfWeek = 0
+    private var smallPadding = 0
+    private var maxEventsPerDay = 0
+    private var horizontalOffset = 0
+    private var showWeekNumbers = false
+    private var dimPastEvents = true
+    private var allEvents = ArrayList<MonthViewEvent>()
+    private var bgRectF = RectF()
+    private var dayLetters = ArrayList<String>()
+    private var days = ArrayList<DayMonthly>()
+    private var dayVerticalOffsets = SparseIntArray()
+
+    constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0)
+
+    init {
+        primaryColor = context.getAdjustedPrimaryColor()
+        textColor = context.config.textColor
+        showWeekNumbers = context.config.showWeekNumbers
+        dimPastEvents = context.config.dimPastEvents
+
+        smallPadding = resources.displayMetrics.density.toInt()
+        val normalTextSize = resources.getDimensionPixelSize(R.dimen.normal_text_size)
+        weekDaysLetterHeight = normalTextSize * 2
+
+        paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
+            color = textColor
+            textSize = normalTextSize.toFloat()
+            textAlign = Paint.Align.CENTER
+        }
+
+        gridPaint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
+            color = textColor.adjustAlpha(LOW_ALPHA)
+        }
+
+        val smallerTextSize = resources.getDimensionPixelSize(R.dimen.smaller_text_size)
+        eventTitleHeight = smallerTextSize
+        eventTitlePaint = TextPaint(Paint.ANTI_ALIAS_FLAG).apply {
+            color = textColor
+            textSize = smallerTextSize.toFloat()
+            textAlign = Paint.Align.LEFT
+        }
+
+        initWeekDayLetters()
+        setupCurrentDayOfWeekIndex()
+    }
+
+    fun updateDays(newDays: ArrayList<DayMonthly>) {
+        days = newDays
+        showWeekNumbers = context.config.showWeekNumbers
+        horizontalOffset = if (showWeekNumbers) eventTitleHeight * 2 else 0
+        initWeekDayLetters()
+        setupCurrentDayOfWeekIndex()
+        groupAllEvents()
+        invalidate()
+    }
+
+    private fun groupAllEvents() {
+        days.forEach {
+            val day = it
+            day.dayEvents.forEach {
+                val event = it
+
+                // make sure we properly handle events lasting multiple days and repeating ones
+                val lastEvent = allEvents.lastOrNull { it.id == event.id }
+                val daysCnt = getEventLastingDaysCount(event)
+                if (lastEvent == null || lastEvent.startDayIndex + daysCnt <= day.indexOnMonthView) {
+                    val monthViewEvent = MonthViewEvent(event.id, event.title, event.startTS, event.color, day.indexOnMonthView,
+                            daysCnt, day.indexOnMonthView, event.getIsAllDay(), event.isPastEvent)
+                    allEvents.add(monthViewEvent)
+                }
+            }
+        }
+
+        allEvents = allEvents.sortedWith(compareBy({ -it.daysCnt }, { !it.isAllDay }, { it.startTS }, { it.startDayIndex }, { it.title })).toMutableList() as ArrayList<MonthViewEvent>
+    }
+
+    override fun onDraw(canvas: Canvas) {
+        super.onDraw(canvas)
+        dayVerticalOffsets.clear()
+        measureDaySize(canvas)
+
+        if (context.config.showGrid) {
+            drawGrid(canvas)
+        }
+
+        addWeekDayLetters(canvas)
+        if (showWeekNumbers) {
+            addWeekNumbers(canvas)
+        }
+
+        var curId = 0
+        for (y in 0 until ROW_COUNT) {
+            for (x in 0..6) {
+                val day = days.getOrNull(curId)
+                if (day != null) {
+                    dayVerticalOffsets.put(day.indexOnMonthView, dayVerticalOffsets[day.indexOnMonthView] + weekDaysLetterHeight)
+                    val verticalOffset = dayVerticalOffsets[day.indexOnMonthView]
+                    val xPos = x * dayWidth + horizontalOffset
+                    val yPos = y * dayHeight + verticalOffset
+                    val xPosCenter = xPos + dayWidth / 2
+                    if (day.isToday) {
+                        canvas.drawCircle(xPosCenter, yPos + paint.textSize * 0.7f, paint.textSize * 0.75f, getCirclePaint(day))
+                    }
+
+                    canvas.drawText(day.value.toString(), xPosCenter, yPos + paint.textSize, getTextPaint(day))
+                    dayVerticalOffsets.put(day.indexOnMonthView, (verticalOffset + paint.textSize * 2).toInt())
+                }
+                curId++
+            }
+        }
+
+        drawEvents(canvas)
+    }
+
+    private fun drawGrid(canvas: Canvas) {
+        // vertical lines
+        for (i in 0..6) {
+            var lineX = i * dayWidth
+            if (showWeekNumbers) {
+                lineX += horizontalOffset
+            }
+            canvas.drawLine(lineX, 0f, lineX, canvas.height.toFloat(), gridPaint)
+        }
+
+        // horizontal lines
+        canvas.drawLine(0f, 0f, canvas.width.toFloat(), 0f, gridPaint)
+        for (i in 0..5) {
+            canvas.drawLine(0f, i * dayHeight + weekDaysLetterHeight, canvas.width.toFloat(), i * dayHeight + weekDaysLetterHeight, gridPaint)
+        }
+    }
+
+    private fun addWeekDayLetters(canvas: Canvas) {
+        for (i in 0..6) {
+            val xPos = horizontalOffset + (i + 1) * dayWidth - dayWidth / 2
+            var weekDayLetterPaint = paint
+            if (i == currDayOfWeek) {
+                weekDayLetterPaint = getColoredPaint(primaryColor)
+            }
+            canvas.drawText(dayLetters[i], xPos, weekDaysLetterHeight * 0.7f, weekDayLetterPaint)
+        }
+    }
+
+    private fun addWeekNumbers(canvas: Canvas) {
+        val weekNumberPaint = Paint(paint)
+        weekNumberPaint.textAlign = Paint.Align.RIGHT
+
+        for (i in 0 until ROW_COUNT) {
+            // fourth day of the week matters
+            val weekOfYear = days.getOrNull(i * 7 + 3)?.weekOfYear ?: 1
+            val id = "$weekOfYear:"
+
+            val yPos = i * dayHeight + weekDaysLetterHeight
+            canvas.drawText(id, horizontalOffset.toFloat() * 0.9f, yPos + paint.textSize, weekNumberPaint)
+        }
+    }
+
+    private fun measureDaySize(canvas: Canvas) {
+        dayWidth = (canvas.width - horizontalOffset) / 7f
+        dayHeight = (canvas.height - weekDaysLetterHeight) / ROW_COUNT.toFloat()
+        val availableHeightForEvents = dayHeight.toInt() - weekDaysLetterHeight
+        maxEventsPerDay = availableHeightForEvents / eventTitleHeight
+    }
+
+    private fun drawEvents(canvas: Canvas) {
+        for (event in allEvents) {
+            drawEvent(event, canvas)
+        }
+    }
+
+    private fun drawEvent(event: MonthViewEvent, canvas: Canvas) {
+        val verticalOffset = dayVerticalOffsets[event.startDayIndex]
+        val xPos = event.startDayIndex % 7 * dayWidth + horizontalOffset
+        val yPos = (event.startDayIndex / 7) * dayHeight
+        val xPosCenter = xPos + dayWidth / 2
+
+        if (verticalOffset - eventTitleHeight * 2 > dayHeight) {
+            canvas.drawText("...", xPosCenter, yPos + verticalOffset - eventTitleHeight / 2, getTextPaint(days[event.startDayIndex]))
+            return
+        }
+
+        // event background rectangle
+        val backgroundY = yPos + verticalOffset
+        val bgLeft = xPos + smallPadding
+        val bgTop = backgroundY + smallPadding - eventTitleHeight
+        var bgRight = xPos - smallPadding + dayWidth * event.daysCnt
+        val bgBottom = backgroundY + smallPadding * 2
+        if (bgRight > canvas.width.toFloat()) {
+            bgRight = canvas.width.toFloat() - smallPadding
+            val newStartDayIndex = (event.startDayIndex / 7 + 1) * 7
+            if (newStartDayIndex < 42) {
+                val newEvent = event.copy(startDayIndex = newStartDayIndex, daysCnt = event.daysCnt - (newStartDayIndex - event.startDayIndex))
+                drawEvent(newEvent, canvas)
+            }
+        }
+
+        val startDayIndex = days[event.originalStartDayIndex]
+        val endDayIndex = days[Math.min(event.startDayIndex + event.daysCnt - 1, 41)]
+        bgRectF.set(bgLeft, bgTop, bgRight, bgBottom)
+        canvas.drawRoundRect(bgRectF, BG_CORNER_RADIUS, BG_CORNER_RADIUS, getEventBackgroundColor(event, startDayIndex, endDayIndex))
+
+        drawEventTitle(event, canvas, xPos, yPos + verticalOffset, bgRight - bgLeft - smallPadding, startDayIndex, endDayIndex)
+
+        for (i in 0 until Math.min(event.daysCnt, 7 - event.startDayIndex % 7)) {
+            dayVerticalOffsets.put(event.startDayIndex + i, verticalOffset + eventTitleHeight + smallPadding * 2)
+        }
+    }
+
+    private fun drawEventTitle(event: MonthViewEvent, canvas: Canvas, x: Float, y: Float, availableWidth: Float, startDay: DayMonthly, endDay: DayMonthly) {
+        val ellipsized = TextUtils.ellipsize(event.title, eventTitlePaint, availableWidth - smallPadding, TextUtils.TruncateAt.END)
+        canvas.drawText(event.title, 0, ellipsized.length, x + smallPadding * 2, y, getEventTitlePaint(event, startDay, endDay))
+    }
+
+    private fun getTextPaint(startDay: DayMonthly): Paint {
+        var paintColor = textColor
+        if (startDay.isToday) {
+            paintColor = primaryColor.getContrastColor()
+        }
+
+        if (!startDay.isThisMonth) {
+            paintColor = paintColor.adjustAlpha(LOW_ALPHA)
+        }
+
+        return getColoredPaint(paintColor)
+    }
+
+    private fun getColoredPaint(color: Int): Paint {
+        val curPaint = Paint(paint)
+        curPaint.color = color
+        return curPaint
+    }
+
+    private fun getEventBackgroundColor(event: MonthViewEvent, startDay: DayMonthly, endDay: DayMonthly): Paint {
+        var paintColor = event.color
+        if ((!startDay.isThisMonth && !endDay.isThisMonth) || (dimPastEvents && event.isPastEvent)) {
+            paintColor = paintColor.adjustAlpha(LOW_ALPHA)
+        }
+
+        return getColoredPaint(paintColor)
+    }
+
+    private fun getEventTitlePaint(event: MonthViewEvent, startDay: DayMonthly, endDay: DayMonthly): Paint {
+        var paintColor = event.color.getContrastColor()
+        if ((!startDay.isThisMonth && !endDay.isThisMonth) || (dimPastEvents && event.isPastEvent)) {
+            paintColor = paintColor.adjustAlpha(LOW_ALPHA)
+        }
+
+        val curPaint = Paint(eventTitlePaint)
+        curPaint.color = paintColor
+        return curPaint
+    }
+
+    private fun getCirclePaint(day: DayMonthly): Paint {
+        val curPaint = Paint(paint)
+        var paintColor = primaryColor
+        if (!day.isThisMonth) {
+            paintColor = paintColor.adjustAlpha(LOW_ALPHA)
+        }
+        curPaint.color = paintColor
+        return curPaint
+    }
+
+    private fun initWeekDayLetters() {
+        dayLetters = context.resources.getStringArray(R.array.week_day_letters).toList() as ArrayList<String>
+        if (context.config.isSundayFirst) {
+            dayLetters.moveLastItemToFront()
+        }
+    }
+
+    private fun setupCurrentDayOfWeekIndex() {
+        if (days.firstOrNull { it.isToday && it.isThisMonth } == null) {
+            currDayOfWeek = -1
+            return
+        }
+
+        currDayOfWeek = DateTime().dayOfWeek
+        if (context.config.isSundayFirst) {
+            currDayOfWeek %= 7
+        } else {
+            currDayOfWeek--
+        }
+    }
+
+    // take into account cases when an event starts on the previous screen, subtract those days
+    private fun getEventLastingDaysCount(event: Event): Int {
+        val startDateTime = Formatter.getDateTimeFromTS(event.startTS)
+        val endDateTime = Formatter.getDateTimeFromTS(event.endTS)
+        val code = days.first().code
+        val screenStartDateTime = Formatter.getDateTimeFromCode(code).toLocalDate()
+        var eventStartDateTime = Formatter.getDateTimeFromTS(startDateTime.seconds()).toLocalDate()
+        val eventEndDateTime = Formatter.getDateTimeFromTS(endDateTime.seconds()).toLocalDate()
+        val diff = Days.daysBetween(screenStartDateTime, eventStartDateTime).days
+        if (diff < 0) {
+            eventStartDateTime = screenStartDateTime
+        }
+        return Days.daysBetween(eventStartDateTime, eventEndDateTime).days + 1
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/views/MonthViewWrapper.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/views/MonthViewWrapper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..0a3ff142dc47c5252e039b722230ee37ed2c96c7
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/views/MonthViewWrapper.kt
@@ -0,0 +1,99 @@
+package com.simplemobiletools.calendar.views
+
+import android.content.Context
+import android.util.AttributeSet
+import android.view.LayoutInflater
+import android.widget.FrameLayout
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.models.DayMonthly
+import com.simplemobiletools.commons.extensions.onGlobalLayout
+import kotlinx.android.synthetic.main.month_view.view.*
+
+// used in the Monthly view fragment, 1 view per screen
+class MonthViewWrapper(context: Context, attrs: AttributeSet, defStyle: Int) : FrameLayout(context, attrs, defStyle) {
+    private var dayWidth = 0f
+    private var dayHeight = 0f
+    private var weekDaysLetterHeight = 0
+    private var wereViewsAdded = false
+    private var days = ArrayList<DayMonthly>()
+    private var inflater: LayoutInflater
+    private var monthView: MonthView
+    private var horizontalOffset = 0
+    private var dayClickCallback: ((day: DayMonthly) -> Unit)? = null
+
+    constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0)
+
+    init {
+        val normalTextSize = resources.getDimensionPixelSize(R.dimen.normal_text_size).toFloat()
+        weekDaysLetterHeight = 2 * normalTextSize.toInt()
+
+        inflater = LayoutInflater.from(context)
+        monthView = inflater.inflate(R.layout.month_view, this).month_view
+        setupHorizontalOffset()
+
+        onGlobalLayout {
+            if (!wereViewsAdded && days.isNotEmpty()) {
+                measureSizes()
+                addViews()
+                monthView.updateDays(days)
+            }
+        }
+    }
+
+    fun updateDays(newDays: ArrayList<DayMonthly>, callback: ((DayMonthly) -> Unit)? = null) {
+        setupHorizontalOffset()
+        measureSizes()
+        dayClickCallback = callback
+        days = newDays
+        if (dayWidth != 0f && dayHeight != 0f) {
+            addViews()
+        }
+        monthView.updateDays(days)
+    }
+
+    private fun setupHorizontalOffset() {
+        horizontalOffset = if (context.config.showWeekNumbers) resources.getDimensionPixelSize(R.dimen.smaller_text_size) * 2 else 0
+    }
+
+    private fun measureSizes() {
+        dayWidth = (width - horizontalOffset) / 7f
+
+        // avoid updating the height when coming back from a new event screen, when the keyboard was visible
+        val newHeight = (height - weekDaysLetterHeight) / 6f
+        if (newHeight > dayHeight) {
+            dayHeight = (height - weekDaysLetterHeight) / 6f
+        }
+    }
+
+    private fun addViews() {
+        removeAllViews()
+        monthView = inflater.inflate(R.layout.month_view, this).month_view
+        wereViewsAdded = true
+        var curId = 0
+        for (y in 0..5) {
+            for (x in 0..6) {
+                val day = days.getOrNull(curId)
+                if (day != null) {
+                    val xPos = x * dayWidth + horizontalOffset
+                    val yPos = y * dayHeight + weekDaysLetterHeight
+                    addViewBackground(xPos, yPos, day)
+                }
+                curId++
+            }
+        }
+    }
+
+    private fun addViewBackground(xPos: Float, yPos: Float, day: DayMonthly) {
+        inflater.inflate(R.layout.month_view_background, this, false).apply {
+            layoutParams.width = dayWidth.toInt()
+            layoutParams.height = dayHeight.toInt()
+            x = xPos
+            y = yPos
+            setOnClickListener {
+                dayClickCallback?.invoke(day)
+            }
+            addView(this)
+        }
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/views/MyScrollView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/views/MyScrollView.kt
new file mode 100644
index 0000000000000000000000000000000000000000..54c8508821733bee29dbc28c776d5c1b8024ca88
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/views/MyScrollView.kt
@@ -0,0 +1,28 @@
+package com.simplemobiletools.calendar.views
+
+import android.content.Context
+import android.util.AttributeSet
+import android.widget.ScrollView
+
+class MyScrollView : ScrollView {
+    constructor(context: Context) : super(context)
+
+    constructor(context: Context, attrs: AttributeSet) : super(context, attrs)
+
+    constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super(context, attrs, defStyle)
+
+    private var scrollViewListener: ScrollViewListener? = null
+
+    fun setOnScrollviewListener(scrollViewListener: ScrollViewListener) {
+        this.scrollViewListener = scrollViewListener
+    }
+
+    override fun onScrollChanged(x: Int, y: Int, oldx: Int, oldy: Int) {
+        super.onScrollChanged(x, y, oldx, oldy)
+        scrollViewListener?.onScrollChanged(this, x, y, oldx, oldy)
+    }
+
+    interface ScrollViewListener {
+        fun onScrollChanged(scrollView: MyScrollView, x: Int, y: Int, oldx: Int, oldy: Int)
+    }
+}
diff --git a/app/src/main/kotlin/com/simplemobiletools/calendar/views/SmallMonthView.kt b/app/src/main/kotlin/com/simplemobiletools/calendar/views/SmallMonthView.kt
new file mode 100644
index 0000000000000000000000000000000000000000..af53d3b8ca1df6d6e4b6218a3ea138f12f16f3fb
--- /dev/null
+++ b/app/src/main/kotlin/com/simplemobiletools/calendar/views/SmallMonthView.kt
@@ -0,0 +1,104 @@
+package com.simplemobiletools.calendar.views
+
+import android.content.Context
+import android.content.res.Configuration
+import android.graphics.Canvas
+import android.graphics.Paint
+import android.util.AttributeSet
+import android.view.View
+import com.simplemobiletools.calendar.R
+import com.simplemobiletools.calendar.extensions.config
+import com.simplemobiletools.calendar.helpers.MEDIUM_ALPHA
+import com.simplemobiletools.calendar.models.DayYearly
+import com.simplemobiletools.commons.extensions.adjustAlpha
+import com.simplemobiletools.commons.extensions.getAdjustedPrimaryColor
+import java.util.*
+
+// used for displaying months at Yearly view
+class SmallMonthView(context: Context, attrs: AttributeSet, defStyle: Int) : View(context, attrs, defStyle) {
+    private var paint: Paint
+    private var todayCirclePaint: Paint
+    private var dayWidth = 0f
+    private var textColor = 0
+    private var days = 31
+    private var isLandscape = false
+    private var mEvents: ArrayList<DayYearly>? = null
+
+    var firstDay = 0
+    var todaysId = 0
+
+    constructor(context: Context, attrs: AttributeSet) : this(context, attrs, 0)
+
+    fun setDays(days: Int) {
+        this.days = days
+        invalidate()
+    }
+
+    fun setEvents(events: ArrayList<DayYearly>?) {
+        mEvents = events
+        post { invalidate() }
+    }
+
+    init {
+        val attributes = context.theme.obtainStyledAttributes(
+                attrs,
+                R.styleable.SmallMonthView,
+                0, 0)
+
+        try {
+            days = attributes.getInt(R.styleable.SmallMonthView_days, 31)
+        } finally {
+            attributes.recycle()
+        }
+
+        val baseColor = context.config.textColor
+        textColor = baseColor.adjustAlpha(MEDIUM_ALPHA)
+
+        paint = Paint(Paint.ANTI_ALIAS_FLAG).apply {
+            color = textColor
+            textSize = resources.getDimensionPixelSize(R.dimen.year_view_day_text_size).toFloat()
+            textAlign = Paint.Align.RIGHT
+        }
+
+        todayCirclePaint = Paint(paint)
+        todayCirclePaint.color = context.getAdjustedPrimaryColor().adjustAlpha(MEDIUM_ALPHA)
+        isLandscape = resources.configuration.orientation == Configuration.ORIENTATION_LANDSCAPE
+    }
+
+    override fun onDraw(canvas: Canvas) {
+        super.onDraw(canvas)
+        if (dayWidth == 0f) {
+            dayWidth = if (isLandscape) {
+                (canvas.width / 9).toFloat()
+            } else {
+                (canvas.width / 7).toFloat()
+            }
+        }
+
+        var curId = 1 - firstDay
+        for (y in 1..6) {
+            for (x in 1..7) {
+                if (curId in 1..days) {
+                    canvas.drawText(curId.toString(), x * dayWidth, y * dayWidth, getPaint(curId))
+
+                    if (curId == todaysId) {
+                        val dividerConstant = if (isLandscape) 6 else 4
+                        canvas.drawCircle(x * dayWidth - dayWidth / dividerConstant, y * dayWidth - dayWidth / dividerConstant, dayWidth * 0.41f, todayCirclePaint)
+                    }
+                }
+                curId++
+            }
+        }
+    }
+
+    private fun getPaint(curId: Int): Paint {
+        val colors = mEvents?.get(curId)?.eventColors ?: HashSet()
+        if (colors.isNotEmpty()) {
+            val curPaint = Paint(paint)
+            curPaint.color = colors.first()
+            return curPaint
+        }
+
+        return paint
+    }
+}
diff --git a/app/src/main/res/drawable-hdpi/ic_calendar.png b/app/src/main/res/drawable-hdpi/ic_calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..fd7bdc0a5b87fa9c8b2e04fd9b7bbb6cd337b5b5
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_calendar.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_change_view.png b/app/src/main/res/drawable-hdpi/ic_change_view.png
new file mode 100644
index 0000000000000000000000000000000000000000..cc86415c0c93e724c0420f3b7d02db061ffec749
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_change_view.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_color.png b/app/src/main/res/drawable-hdpi/ic_color.png
new file mode 100644
index 0000000000000000000000000000000000000000..9470e79e1f3189d9beb12a8a85f12daa7952da84
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_color.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_pointer_left.png b/app/src/main/res/drawable-hdpi/ic_pointer_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..e8fdcb49c8cf48e60f80fac1c2eac1f8ca6131e7
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_pointer_left.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_pointer_right.png b/app/src/main/res/drawable-hdpi/ic_pointer_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..95856c86c365f57448ae56b4142fa8d41ea45020
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_pointer_right.png differ
diff --git a/app/src/main/res/drawable-hdpi/ic_today.png b/app/src/main/res/drawable-hdpi/ic_today.png
new file mode 100644
index 0000000000000000000000000000000000000000..73a5f63d740c333cc1c8dbaa997a38ba253e4834
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_today.png differ
diff --git a/app/src/main/res/drawable-hdpi/img_widget_list_preview.png b/app/src/main/res/drawable-hdpi/img_widget_list_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..a0581173d5a68c621d4b05ff5a5c21868baa0137
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/img_widget_list_preview.png differ
diff --git a/app/src/main/res/drawable-hdpi/img_widget_monthly_preview.png b/app/src/main/res/drawable-hdpi/img_widget_monthly_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..6ad45f9ed71bfd3a6e00e2660de72ca4d9648198
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/img_widget_monthly_preview.png differ
diff --git a/app/src/main/res/drawable-hdpi/monthly_event_dot.png b/app/src/main/res/drawable-hdpi/monthly_event_dot.png
new file mode 100644
index 0000000000000000000000000000000000000000..dab21e01b5cc6a335a1652174ef22fb1961ce15f
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/monthly_event_dot.png differ
diff --git a/app/src/main/res/drawable-hdpi/weekly_now.9.png b/app/src/main/res/drawable-hdpi/weekly_now.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ec931263b6f125a99852447b66e35f3ce0ebdf6
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/weekly_now.9.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_calendar.png b/app/src/main/res/drawable-xhdpi/ic_calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..2e3cd13c4fa9be7695ad25886fe13e0ebdab6fb6
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_calendar.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_change_view.png b/app/src/main/res/drawable-xhdpi/ic_change_view.png
new file mode 100644
index 0000000000000000000000000000000000000000..6c49e916745979b2b31518b25d595d72cec1bbb1
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_change_view.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_color.png b/app/src/main/res/drawable-xhdpi/ic_color.png
new file mode 100644
index 0000000000000000000000000000000000000000..4af10a4d003116a3ed8f3fa9802edf2203a1f64f
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_color.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_pointer_left.png b/app/src/main/res/drawable-xhdpi/ic_pointer_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..932903fa4510ee64b3d74e4dc1b88ec9c4659ff5
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_pointer_left.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_pointer_right.png b/app/src/main/res/drawable-xhdpi/ic_pointer_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..09bff9fc6c880885217b54ec091f16ace6b43f41
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_pointer_right.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_today.png b/app/src/main/res/drawable-xhdpi/ic_today.png
new file mode 100644
index 0000000000000000000000000000000000000000..76c89b9f9aaab3abd459ac90951dbbfaac5298fb
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_today.png differ
diff --git a/app/src/main/res/drawable-xhdpi/img_widget_list_preview.png b/app/src/main/res/drawable-xhdpi/img_widget_list_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..afd891254ef986cfb10484904ee8b2087c7fc8e6
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/img_widget_list_preview.png differ
diff --git a/app/src/main/res/drawable-xhdpi/img_widget_monthly_preview.png b/app/src/main/res/drawable-xhdpi/img_widget_monthly_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..476a9638c4a7af827db6c9bbd23585b34cd391f4
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/img_widget_monthly_preview.png differ
diff --git a/app/src/main/res/drawable-xhdpi/monthly_event_dot.png b/app/src/main/res/drawable-xhdpi/monthly_event_dot.png
new file mode 100644
index 0000000000000000000000000000000000000000..bd2aa7f7149028c123b52b5b5b4ae7d0458a7fff
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/monthly_event_dot.png differ
diff --git a/app/src/main/res/drawable-xhdpi/weekly_now.9.png b/app/src/main/res/drawable-xhdpi/weekly_now.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef09ff43f1fdfbd71bfcac43ae695df5396c0020
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/weekly_now.9.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_calendar.png b/app/src/main/res/drawable-xxhdpi/ic_calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..0e3a7cf03a5a50afbcd78dbd90ed7415b768172c
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_calendar.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_change_view.png b/app/src/main/res/drawable-xxhdpi/ic_change_view.png
new file mode 100644
index 0000000000000000000000000000000000000000..919d083ee5c5ce8dbf3aaca58aa0a67c5bad3e3d
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_change_view.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_color.png b/app/src/main/res/drawable-xxhdpi/ic_color.png
new file mode 100644
index 0000000000000000000000000000000000000000..119b1fd8cb6dd205a8d1822eeadc85a247141841
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_color.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_pointer_left.png b/app/src/main/res/drawable-xxhdpi/ic_pointer_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..fcdff76a2951bb6e37826acf01e7d52d1b92c6e8
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_pointer_left.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_pointer_right.png b/app/src/main/res/drawable-xxhdpi/ic_pointer_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..75cf3776f7577093ebc98441a8079529c9dda563
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_pointer_right.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_today.png b/app/src/main/res/drawable-xxhdpi/ic_today.png
new file mode 100644
index 0000000000000000000000000000000000000000..d5175f03737b2359a7f94a60302f492b5561039e
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_today.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/img_widget_list_preview.png b/app/src/main/res/drawable-xxhdpi/img_widget_list_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..4188ad48b86ce50b244da5dbb3d981f488660fb9
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/img_widget_list_preview.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/img_widget_monthly_preview.png b/app/src/main/res/drawable-xxhdpi/img_widget_monthly_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c71408abf8f3b70d299e853a5a1ab3933a04518
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/img_widget_monthly_preview.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/monthly_event_dot.png b/app/src/main/res/drawable-xxhdpi/monthly_event_dot.png
new file mode 100644
index 0000000000000000000000000000000000000000..e2fe432596b0f7f8b637770116e76da786619815
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/monthly_event_dot.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/weekly_now.9.png b/app/src/main/res/drawable-xxhdpi/weekly_now.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..21f144cdfbf61833aa82e0f75779a91118b18bc1
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/weekly_now.9.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_calendar.png b/app/src/main/res/drawable-xxxhdpi/ic_calendar.png
new file mode 100644
index 0000000000000000000000000000000000000000..47247db2578723f688c4edabf5fce0009f8c5aae
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_calendar.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_change_view.png b/app/src/main/res/drawable-xxxhdpi/ic_change_view.png
new file mode 100644
index 0000000000000000000000000000000000000000..fa45db74cab924e38fdca6af2d19ca0cb8b98c15
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_change_view.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_color.png b/app/src/main/res/drawable-xxxhdpi/ic_color.png
new file mode 100644
index 0000000000000000000000000000000000000000..dba40d4eb533bc747459496772626051c1747418
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_color.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pointer_left.png b/app/src/main/res/drawable-xxxhdpi/ic_pointer_left.png
new file mode 100644
index 0000000000000000000000000000000000000000..ef5bc95b0f732faed072d86b709a214405e55ce2
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_pointer_left.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_pointer_right.png b/app/src/main/res/drawable-xxxhdpi/ic_pointer_right.png
new file mode 100644
index 0000000000000000000000000000000000000000..6abf6dbfa806d98f00716d5d4a895be61bd4b54c
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_pointer_right.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_today.png b/app/src/main/res/drawable-xxxhdpi/ic_today.png
new file mode 100644
index 0000000000000000000000000000000000000000..37e5996b69d33949bb8c721803bb1014ae3cb42c
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_today.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/img_widget_list_preview.png b/app/src/main/res/drawable-xxxhdpi/img_widget_list_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..cbdf24940e50c1b79ebf51dd8f27245fe4d956ad
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/img_widget_list_preview.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/img_widget_monthly_preview.png b/app/src/main/res/drawable-xxxhdpi/img_widget_monthly_preview.png
new file mode 100644
index 0000000000000000000000000000000000000000..86227a57bf94b0bfc070fbedc96a2043ce3c8d59
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/img_widget_monthly_preview.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/monthly_event_dot.png b/app/src/main/res/drawable-xxxhdpi/monthly_event_dot.png
new file mode 100644
index 0000000000000000000000000000000000000000..76df61cbac639f5fafe1963f2f10788e20138c29
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/monthly_event_dot.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/weekly_now.9.png b/app/src/main/res/drawable-xxxhdpi/weekly_now.9.png
new file mode 100644
index 0000000000000000000000000000000000000000..c0d78341facab3e1bb6aac27fed1161c4ba91695
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/weekly_now.9.png differ
diff --git a/app/src/main/res/drawable/circle_empty.xml b/app/src/main/res/drawable/circle_empty.xml
new file mode 100644
index 0000000000000000000000000000000000000000..767a935c06167b7c5ff2ac533fbcf85545802791
--- /dev/null
+++ b/app/src/main/res/drawable/circle_empty.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android"
+       android:shape="ring"
+       android:thicknessRatio="1"
+       android:useLevel="false">
+    <solid android:color="@android:color/transparent"/>
+
+    <stroke
+        android:width="2dp"
+        android:color="@android:color/white"/>
+</shape>
diff --git a/app/src/main/res/drawable/day_monthly_event_background.xml b/app/src/main/res/drawable/day_monthly_event_background.xml
new file mode 100644
index 0000000000000000000000000000000000000000..16eaa331f0b59f811a7ec0436541ac3df194429a
--- /dev/null
+++ b/app/src/main/res/drawable/day_monthly_event_background.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <corners android:radius="4dp"/>
+    <solid android:color="@android:color/white"/>
+</shape>
diff --git a/app/src/main/res/drawable/divider_width.xml b/app/src/main/res/drawable/divider_width.xml
new file mode 100644
index 0000000000000000000000000000000000000000..04e97ef39fe7ba462f9259a4df21ea20f4a1321e
--- /dev/null
+++ b/app/src/main/res/drawable/divider_width.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:shape="rectangle">
+
+    <size
+        android:width="5000dp"
+        android:height="1dp"/>
+
+    <solid android:color="@color/divider_grey"/>
+
+</shape>
diff --git a/app/src/main/res/drawable/monthly_day_dot.xml b/app/src/main/res/drawable/monthly_day_dot.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1daa66144ee0e73dab2f98a1b90c8c8dc271298e
--- /dev/null
+++ b/app/src/main/res/drawable/monthly_day_dot.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<bitmap
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:gravity="bottom|center_horizontal"
+    android:src="@drawable/monthly_event_dot"
+    android:tileMode="disabled"/>
diff --git a/app/src/main/res/drawable/monthly_day_with_event.xml b/app/src/main/res/drawable/monthly_day_with_event.xml
new file mode 100644
index 0000000000000000000000000000000000000000..424e4a6ddceb62c5da0a78c3bf675125e519df49
--- /dev/null
+++ b/app/src/main/res/drawable/monthly_day_with_event.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:drawable="@drawable/monthly_event_dot"
+        android:gravity="bottom|center_horizontal"/>
+</layer-list>
diff --git a/app/src/main/res/drawable/monthly_day_with_event_today.xml b/app/src/main/res/drawable/monthly_day_with_event_today.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5871a7163b1e43ebf51e845e08f0abf6aa90efed
--- /dev/null
+++ b/app/src/main/res/drawable/monthly_day_with_event_today.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:drawable="@drawable/monthly_day_dot"
+        android:gravity="bottom|center_horizontal"/>
+    <item android:drawable="@drawable/circle_empty"/>
+</layer-list>
diff --git a/app/src/main/res/drawable/stroke_bottom.xml b/app/src/main/res/drawable/stroke_bottom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d851d1192f770717975ffcabd63ef75b5091c4fc
--- /dev/null
+++ b/app/src/main/res/drawable/stroke_bottom.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:bottom="0px"
+        android:left="-2px"
+        android:right="-2px"
+        android:top="-2px">
+
+        <shape android:shape="rectangle">
+            <solid android:color="@android:color/transparent"/>
+            <stroke
+                android:width="1px"
+                android:color="@color/divider_grey"/>
+        </shape>
+    </item>
+</layer-list>
diff --git a/app/src/main/res/drawable/stroke_bottom_right.xml b/app/src/main/res/drawable/stroke_bottom_right.xml
new file mode 100644
index 0000000000000000000000000000000000000000..206722803e9da200127b5edd9a6a6652ae51b9fa
--- /dev/null
+++ b/app/src/main/res/drawable/stroke_bottom_right.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:bottom="0px"
+        android:left="-2px"
+        android:right="0px"
+        android:top="-2px">
+
+        <shape android:shape="rectangle">
+            <solid android:color="@android:color/transparent"/>
+            <stroke
+                android:width="1px"
+                android:color="@color/divider_grey"/>
+        </shape>
+    </item>
+</layer-list>
diff --git a/app/src/main/res/drawable/stroke_right.xml b/app/src/main/res/drawable/stroke_right.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9bd8e42653c2b96c8f15a93ecab7c24ae6e4bc29
--- /dev/null
+++ b/app/src/main/res/drawable/stroke_right.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+    <item
+        android:bottom="-2px"
+        android:left="-2px"
+        android:right="0px"
+        android:top="-2px">
+
+        <shape android:shape="rectangle">
+            <solid android:color="@android:color/transparent"/>
+            <stroke
+                android:width="1px"
+                android:color="@color/divider_grey"/>
+        </shape>
+    </item>
+</layer-list>
diff --git a/app/src/main/res/layout-land/fragment_year.xml b/app/src/main/res/layout-land/fragment_year.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bf36cbba76f9287cd471b7624b7abc099f8b5d04
--- /dev/null
+++ b/app/src/main/res/layout-land/fragment_year.xml
@@ -0,0 +1,339 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TableLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/calendar_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="@dimen/yearly_padding_side">
+
+    <TableRow android:layout_weight="1">
+
+        <RelativeLayout
+            android:id="@+id/month_1_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/yearly_padding_full"
+            android:layout_marginRight="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_1_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/january"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_1"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/month_1_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_2_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_half"
+            android:layout_marginRight="@dimen/yearly_padding_half"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_2_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/february"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_2"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/month_2_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_3_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_full"
+            android:layout_marginStart="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_3_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/march"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_3"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/month_3_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_4_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/yearly_padding_full"
+            android:layout_marginRight="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_4_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/april"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_4"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_4_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"
+                app:days="30"/>
+        </RelativeLayout>
+    </TableRow>
+
+    <TableRow android:layout_weight="1">
+
+        <RelativeLayout
+            android:id="@+id/month_5_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_half"
+            android:layout_marginRight="@dimen/yearly_padding_half"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_5_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/may"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_5"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_5_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_6_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_full"
+            android:layout_marginStart="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_6_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/june"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_6"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_6_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"
+                app:days="30"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_7_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/yearly_padding_full"
+            android:layout_marginRight="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_7_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/july"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_7"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_7_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_8_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_half"
+            android:layout_marginRight="@dimen/yearly_padding_half"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_8_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/august"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_8"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_8_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"/>
+        </RelativeLayout>
+    </TableRow>
+
+    <TableRow android:layout_weight="1">
+
+
+        <RelativeLayout
+            android:id="@+id/month_9_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_full"
+            android:layout_marginStart="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_9_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/september"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_9"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_9_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"
+                app:days="30"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_10_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/yearly_padding_full"
+            android:layout_marginRight="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_10_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/october"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_10"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_10_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_11_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_half"
+            android:layout_marginRight="@dimen/yearly_padding_half"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_11_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/november"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_11"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_11_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"
+                app:days="30"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_12_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_full"
+            android:layout_marginStart="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_12_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/december"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_12"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_12_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"/>
+
+        </RelativeLayout>
+    </TableRow>
+</TableLayout>
diff --git a/app/src/main/res/layout/activity_day.xml b/app/src/main/res/layout/activity_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b484be2ad8614ded04e409b0e734b44a22acb6e6
--- /dev/null
+++ b/app/src/main/res/layout/activity_day.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/day_coordinator"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <com.simplemobiletools.commons.views.MyViewPager
+        android:id="@+id/view_pager"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_marginTop="@dimen/activity_margin"/>
+
+    <com.simplemobiletools.commons.views.MyFloatingActionButton
+        android:id="@+id/day_fab"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom|end"
+        android:layout_margin="@dimen/activity_margin"
+        android:src="@drawable/ic_plus"
+        app:backgroundTint="@color/color_primary"
+        app:rippleColor="@color/pressed_item_foreground"/>
+
+</android.support.design.widget.CoordinatorLayout>
diff --git a/app/src/main/res/layout/activity_event.xml b/app/src/main/res/layout/activity_event.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fac0e585856c1b1cce1e0a367551826fa821ba60
--- /dev/null
+++ b/app/src/main/res/layout/activity_event.xml
@@ -0,0 +1,474 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/event_scrollview"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <RelativeLayout
+        android:id="@+id/event_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <com.simplemobiletools.commons.views.MyEditText
+            android:id="@+id/event_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/activity_margin"
+            android:layout_marginRight="@dimen/activity_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:hint="@string/title"
+            android:inputType="textCapSentences"
+            android:maxLength="80"
+            android:maxLines="1"
+            android:minEms="20"
+            android:textCursorDrawable="@null"
+            android:textSize="@dimen/day_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyEditText
+            android:id="@+id/event_location"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/event_title"
+            android:layout_marginLeft="@dimen/activity_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:layout_toLeftOf="@+id/event_show_on_map"
+            android:hint="@string/location"
+            android:inputType="textCapWords"
+            android:maxLength="80"
+            android:maxLines="1"
+            android:minEms="20"
+            android:textCursorDrawable="@null"
+            android:textSize="@dimen/day_text_size"/>
+
+        <ImageView
+            android:id="@+id/event_show_on_map"
+            style="@style/MyBorderlessBackgroundStyle"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignBottom="@+id/event_location"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+            android:layout_alignTop="@+id/event_location"
+            android:layout_marginEnd="@dimen/activity_margin"
+            android:layout_marginRight="@dimen/activity_margin"
+            android:paddingLeft="@dimen/small_margin"
+            android:paddingRight="@dimen/small_margin"
+            android:src="@drawable/ic_place"/>
+
+        <com.simplemobiletools.commons.views.MyEditText
+            android:id="@+id/event_description"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/event_location"
+            android:layout_marginLeft="@dimen/activity_margin"
+            android:layout_marginRight="@dimen/activity_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:autoLink="all"
+            android:gravity="top"
+            android:hint="@string/description"
+            android:inputType="textCapSentences|textMultiLine"
+            android:linksClickable="true"
+            android:minEms="20"
+            android:textCursorDrawable="@null"
+            android:textSize="@dimen/day_text_size"/>
+
+        <ImageView
+            android:id="@+id/event_description_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:layout_below="@+id/event_description"
+            android:layout_marginBottom="@dimen/normal_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <ImageView
+            android:id="@+id/event_time_image"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignBottom="@+id/event_all_day"
+            android:layout_alignTop="@+id/event_all_day"
+            android:layout_below="@+id/event_description_divider"
+            android:layout_marginLeft="@dimen/normal_margin"
+            android:layout_marginStart="@dimen/normal_margin"
+            android:alpha="0.8"
+            android:padding="@dimen/medium_margin"
+            android:src="@drawable/ic_clock"/>
+
+        <com.simplemobiletools.commons.views.MySwitchCompat
+            android:id="@+id/event_all_day"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+            android:layout_below="@+id/event_description_divider"
+            android:layout_marginEnd="@dimen/normal_margin"
+            android:layout_marginLeft="@dimen/small_margin"
+            android:layout_marginRight="@dimen/normal_margin"
+            android:layout_marginStart="@dimen/small_margin"
+            android:layout_toEndOf="@+id/event_time_image"
+            android:layout_toRightOf="@+id/event_time_image"
+            android:paddingBottom="@dimen/normal_margin"
+            android:paddingTop="@dimen/normal_margin"
+            android:text="@string/all_day"
+            android:textSize="@dimen/day_text_size"
+            app:switchPadding="@dimen/small_margin"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/event_start_date"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignLeft="@+id/event_all_day"
+            android:layout_alignStart="@+id/event_all_day"
+            android:layout_below="@+id/event_time_image"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingEnd="@dimen/activity_margin"
+            android:paddingRight="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:textSize="@dimen/day_text_size"
+            tools:text="January 1 1970"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/event_start_time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+            android:layout_below="@+id/event_time_image"
+            android:background="?attr/selectableItemBackground"
+            android:padding="@dimen/activity_margin"
+            android:textSize="@dimen/day_text_size"
+            tools:text="00:00"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/event_end_date"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignLeft="@+id/event_all_day"
+            android:layout_alignStart="@+id/event_all_day"
+            android:layout_below="@+id/event_start_date"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingEnd="@dimen/activity_margin"
+            android:paddingRight="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:textSize="@dimen/day_text_size"
+            tools:text="January 1 1970"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/event_end_time"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+            android:layout_below="@+id/event_start_time"
+            android:background="?attr/selectableItemBackground"
+            android:padding="@dimen/activity_margin"
+            android:textSize="@dimen/day_text_size"
+            tools:text="00:00"/>
+
+        <ImageView
+            android:id="@+id/event_date_time_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:layout_below="@+id/event_end_date"
+            android:layout_marginBottom="@dimen/medium_margin"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <ImageView
+            android:id="@+id/event_reminder_image"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignBottom="@+id/event_reminder_1"
+            android:layout_alignTop="@+id/event_reminder_1"
+            android:layout_below="@+id/event_date_time_divider"
+            android:layout_marginLeft="@dimen/normal_margin"
+            android:layout_marginStart="@dimen/normal_margin"
+            android:alpha="0.8"
+            android:padding="@dimen/medium_margin"
+            android:src="@drawable/ic_bell"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/event_reminder_1"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/event_date_time_divider"
+            android:layout_marginLeft="@dimen/small_margin"
+            android:layout_marginStart="@dimen/small_margin"
+            android:layout_toEndOf="@+id/event_reminder_image"
+            android:layout_toRightOf="@+id/event_reminder_image"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:textSize="@dimen/day_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/event_reminder_2"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignLeft="@+id/event_reminder_1"
+            android:layout_alignStart="@+id/event_reminder_1"
+            android:layout_below="@+id/event_reminder_1"
+            android:alpha="0.4"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/add_another_reminder"
+            android:textSize="@dimen/day_text_size"
+            android:visibility="gone"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/event_reminder_3"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignLeft="@+id/event_reminder_1"
+            android:layout_alignStart="@+id/event_reminder_1"
+            android:layout_below="@+id/event_reminder_2"
+            android:alpha="0.4"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/add_another_reminder"
+            android:textSize="@dimen/day_text_size"
+            android:visibility="gone"/>
+
+        <ImageView
+            android:id="@+id/event_reminder_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:layout_below="@+id/event_reminder_3"
+            android:layout_marginBottom="@dimen/medium_margin"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <ImageView
+            android:id="@+id/event_repetition_image"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignBottom="@+id/event_repetition"
+            android:layout_alignTop="@+id/event_repetition"
+            android:layout_below="@+id/event_date_time_divider"
+            android:layout_marginLeft="@dimen/normal_margin"
+            android:layout_marginStart="@dimen/normal_margin"
+            android:alpha="0.8"
+            android:padding="@dimen/medium_margin"
+            android:src="@drawable/ic_repeat"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/event_repetition"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/event_reminder_divider"
+            android:layout_marginLeft="@dimen/small_margin"
+            android:layout_marginStart="@dimen/small_margin"
+            android:layout_toEndOf="@+id/event_repetition_image"
+            android:layout_toRightOf="@+id/event_repetition_image"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/normal_margin"
+            android:paddingTop="@dimen/normal_margin"
+            android:textSize="@dimen/day_text_size"/>
+
+        <RelativeLayout
+            android:id="@+id/event_repetition_rule_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignLeft="@+id/event_repetition"
+            android:layout_alignStart="@+id/event_repetition"
+            android:layout_below="@+id/event_repetition"
+            android:background="?attr/selectableItemBackground"
+            android:visibility="gone">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/event_repetition_rule_label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:clickable="false"
+                android:paddingBottom="@dimen/activity_margin"
+                android:paddingTop="@dimen/activity_margin"
+                android:text="@string/repeat_on"
+                android:textSize="@dimen/day_text_size"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/event_repetition_rule"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:layout_alignParentRight="true"
+                android:layout_toEndOf="@+id/event_repetition_rule_label"
+                android:layout_toRightOf="@+id/event_repetition_rule_label"
+                android:clickable="false"
+                android:gravity="end"
+                android:padding="@dimen/activity_margin"
+                android:text="@string/every_day"
+                android:textSize="@dimen/day_text_size"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/event_repetition_limit_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_alignLeft="@+id/event_repetition"
+            android:layout_alignStart="@+id/event_repetition"
+            android:layout_below="@+id/event_repetition_rule_holder"
+            android:background="?attr/selectableItemBackground"
+            android:visibility="gone">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/event_repetition_limit_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_toLeftOf="@+id/event_repetition_limit"
+                android:layout_toStartOf="@+id/event_repetition_limit"
+                android:clickable="false"
+                android:paddingBottom="@dimen/activity_margin"
+                android:paddingTop="@dimen/activity_margin"
+                android:text="@string/repeat_till"
+                android:textSize="@dimen/day_text_size"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/event_repetition_limit"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:layout_alignParentRight="true"
+                android:clickable="false"
+                android:padding="@dimen/activity_margin"
+                android:text="@string/forever"
+                android:textSize="@dimen/day_text_size"/>
+        </RelativeLayout>
+
+        <ImageView
+            android:id="@+id/event_repetition_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:layout_below="@+id/event_repetition_limit_holder"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <ImageView
+            android:id="@+id/event_caldav_calendar_image"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignBottom="@+id/event_caldav_calendar_holder"
+            android:layout_alignTop="@+id/event_caldav_calendar_holder"
+            android:layout_below="@+id/event_repetition_divider"
+            android:layout_marginLeft="@dimen/normal_margin"
+            android:layout_marginStart="@dimen/normal_margin"
+            android:alpha="0.8"
+            android:padding="@dimen/medium_margin"
+            android:src="@drawable/ic_calendar"
+            android:visibility="gone"/>
+
+        <RelativeLayout
+            android:id="@+id/event_caldav_calendar_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/event_repetition_divider"
+            android:layout_toEndOf="@+id/event_caldav_calendar_image"
+            android:layout_toRightOf="@+id/event_caldav_calendar_image"
+            android:background="?attr/selectableItemBackground"
+            android:visibility="gone">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/event_caldav_calendar_name"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/small_margin"
+                android:layout_marginStart="@dimen/small_margin"
+                android:ellipsize="end"
+                android:maxLines="1"
+                android:paddingBottom="@dimen/tiny_margin"
+                android:paddingTop="@dimen/medium_margin"
+                android:textSize="@dimen/day_text_size"
+                tools:text="My calendar"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/event_caldav_calendar_email"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/event_caldav_calendar_name"
+                android:layout_marginLeft="@dimen/small_margin"
+                android:layout_marginStart="@dimen/small_margin"
+                android:ellipsize="end"
+                android:maxLines="1"
+                android:paddingBottom="@dimen/medium_margin"
+                android:textSize="@dimen/meta_text_size"
+                tools:text="hello@simplemobiletools.com"/>
+
+        </RelativeLayout>
+
+        <ImageView
+            android:id="@+id/event_caldav_calendar_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:layout_below="@+id/event_caldav_calendar_holder"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"
+            android:visibility="gone"/>
+
+        <ImageView
+            android:id="@+id/event_type_image"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignBottom="@+id/event_type_holder"
+            android:layout_alignTop="@+id/event_type_holder"
+            android:layout_below="@+id/event_caldav_calendar_divider"
+            android:layout_marginLeft="@dimen/normal_margin"
+            android:layout_marginStart="@dimen/normal_margin"
+            android:alpha="0.8"
+            android:padding="@dimen/medium_margin"
+            android:src="@drawable/ic_color"/>
+
+        <RelativeLayout
+            android:id="@+id/event_type_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/event_caldav_calendar_divider"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:layout_toEndOf="@+id/event_type_image"
+            android:layout_toRightOf="@+id/event_type_image"
+            android:background="?attr/selectableItemBackground">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/event_type"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/small_margin"
+                android:layout_marginRight="@dimen/medium_margin"
+                android:layout_marginStart="@dimen/small_margin"
+                android:layout_toLeftOf="@+id/event_type_color"
+                android:paddingBottom="@dimen/normal_margin"
+                android:paddingTop="@dimen/normal_margin"
+                android:textSize="@dimen/day_text_size"/>
+
+            <ImageView
+                android:id="@+id/event_type_color"
+                android:layout_width="@dimen/color_sample_size"
+                android:layout_height="@dimen/color_sample_size"
+                android:layout_alignParentEnd="true"
+                android:layout_alignParentRight="true"
+                android:layout_centerVertical="true"
+                android:layout_marginEnd="@dimen/activity_margin"
+                android:layout_marginRight="@dimen/activity_margin"
+                android:clickable="false"/>
+
+        </RelativeLayout>
+
+        <ImageView
+            android:id="@+id/event_type_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:layout_below="@+id/event_type_holder"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+    </RelativeLayout>
+</ScrollView>
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e486b4871324e812cd189a644d5b9d492436551a
--- /dev/null
+++ b/app/src/main/res/layout/activity_main.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.design.widget.CoordinatorLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/calendar_coordinator"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <FrameLayout
+        android:id="@+id/fragments_holder"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"/>
+
+    <com.simplemobiletools.commons.views.MyFloatingActionButton
+        android:id="@+id/calendar_fab"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="bottom|end"
+        android:layout_margin="@dimen/activity_margin"
+        android:contentDescription="@string/new_event"
+        android:src="@drawable/ic_plus"
+        app:backgroundTint="@color/color_primary"
+        app:rippleColor="@color/pressed_item_foreground"/>
+
+    <RelativeLayout
+        android:id="@+id/search_holder"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:clickable="true"
+        android:focusable="true"
+        android:visibility="gone">
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/search_placeholder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_centerHorizontal="true"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:gravity="center"
+            android:paddingLeft="@dimen/activity_margin"
+            android:paddingRight="@dimen/activity_margin"
+            android:text="@string/no_items_found"
+            android:textSize="@dimen/bigger_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/search_placeholder_2"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/search_placeholder"
+            android:layout_centerHorizontal="true"
+            android:gravity="center"
+            android:paddingBottom="@dimen/medium_margin"
+            android:paddingLeft="@dimen/activity_margin"
+            android:paddingRight="@dimen/activity_margin"
+            android:paddingTop="@dimen/medium_margin"
+            android:text="@string/type_2_characters"
+            android:textSize="@dimen/bigger_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyRecyclerView
+            android:id="@+id/search_results_list"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:clipToPadding="false"
+            android:scrollbars="vertical"
+            app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
+
+    </RelativeLayout>
+</android.support.design.widget.CoordinatorLayout>
diff --git a/app/src/main/res/layout/activity_manage_event_types.xml b/app/src/main/res/layout/activity_manage_event_types.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c4b9c9f86c3236f6f07182f8d5241c7ddabbe713
--- /dev/null
+++ b/app/src/main/res/layout/activity_manage_event_types.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.simplemobiletools.commons.views.MyRecyclerView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/manage_event_types_list"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:clipToPadding="false"
+    app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1cbb9b137e2a6dd1cd0a9b687d27bd04a56a8f8c
--- /dev/null
+++ b/app/src/main/res/layout/activity_settings.xml
@@ -0,0 +1,730 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/settings_scrollview"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <LinearLayout
+        android:id="@+id/settings_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+        <RelativeLayout
+            android:id="@+id/settings_customize_colors_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_customize_colors_label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/customize_colors"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_manage_event_types_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_manage_event_types_label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/manage_event_types"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_use_english_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_use_english"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/use_english_language"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_hour_format_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_hour_format"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/use_24_hour_time_format"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_sunday_first_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_sunday_first"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/sunday_first"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_avoid_whats_new_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_avoid_whats_new"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/avoid_whats_new"/>
+
+        </RelativeLayout>
+
+        <View
+            android:id="@+id/reminders_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/reminders_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/bigger_margin"
+            android:layout_marginStart="@dimen/bigger_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:text="@string/event_reminders"
+            android:textAllCaps="true"
+            android:textSize="@dimen/smaller_text_size"/>
+
+        <RelativeLayout
+            android:id="@+id/settings_vibrate_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_vibrate"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/vibrate"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_loop_reminders_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_loop_reminders"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/loop_reminders"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_reminder_sound_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/bigger_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/bigger_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_reminder_sound_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_toLeftOf="@+id/settings_reminder_sound"
+                android:layout_toStartOf="@+id/settings_reminder_sound"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingRight="@dimen/medium_margin"
+                android:text="@string/reminder_sound"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_reminder_sound"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:layout_alignParentRight="true"
+                android:layout_marginEnd="@dimen/small_margin"
+                android:layout_marginRight="@dimen/small_margin"
+                android:background="@null"
+                android:clickable="false"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_use_same_snooze_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_use_same_snooze"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/use_same_snooze"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_snooze_time_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/bigger_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/bigger_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_snooze_time_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_toLeftOf="@+id/settings_snooze_time"
+                android:layout_toStartOf="@+id/settings_snooze_time"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingRight="@dimen/medium_margin"
+                android:text="@string/snooze_time"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_snooze_time"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:layout_alignParentRight="true"
+                android:layout_marginEnd="@dimen/small_margin"
+                android:layout_marginRight="@dimen/small_margin"
+                android:background="@null"
+                android:clickable="false"/>
+
+        </RelativeLayout>
+
+        <View
+            android:id="@+id/caldav_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/caldav_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/bigger_margin"
+            android:layout_marginStart="@dimen/bigger_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:text="@string/caldav"
+            android:textAllCaps="true"
+            android:textSize="@dimen/smaller_text_size"/>
+
+        <RelativeLayout
+            android:id="@+id/settings_caldav_sync_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_caldav_sync"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/caldav_sync"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_manage_synced_calendars_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/bigger_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/bigger_margin"
+            android:visibility="gone">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_manage_synced_calendars"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingRight="@dimen/medium_margin"
+                android:text="@string/manage_synced_calendars"/>
+
+        </RelativeLayout>
+
+        <View
+            android:id="@+id/weekly_view_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/weekly_view_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/bigger_margin"
+            android:layout_marginStart="@dimen/bigger_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:text="@string/weekly_view"
+            android:textAllCaps="true"
+            android:textSize="@dimen/smaller_text_size"/>
+
+        <RelativeLayout
+            android:id="@+id/settings_start_weekly_at_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/bigger_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/bigger_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_start_weekly_at_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_toLeftOf="@+id/settings_start_weekly_at"
+                android:layout_toStartOf="@+id/settings_start_weekly_at"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingRight="@dimen/medium_margin"
+                android:text="@string/start_day_at"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_start_weekly_at"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:layout_alignParentRight="true"
+                android:layout_marginEnd="@dimen/small_margin"
+                android:layout_marginRight="@dimen/small_margin"
+                android:background="@null"
+                android:clickable="false"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_end_weekly_at_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/bigger_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/bigger_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_end_weekly_at_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_toLeftOf="@+id/settings_end_weekly_at"
+                android:layout_toStartOf="@+id/settings_end_weekly_at"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingRight="@dimen/medium_margin"
+                android:text="@string/end_day_at"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_end_weekly_at"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:layout_alignParentRight="true"
+                android:layout_marginEnd="@dimen/small_margin"
+                android:layout_marginRight="@dimen/small_margin"
+                android:background="@null"
+                android:clickable="false"/>
+
+        </RelativeLayout>
+
+        <View
+            android:id="@+id/monthly_view_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/monthly_view_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/bigger_margin"
+            android:layout_marginStart="@dimen/bigger_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:text="@string/monthly_view"
+            android:textAllCaps="true"
+            android:textSize="@dimen/smaller_text_size"/>
+
+        <RelativeLayout
+            android:id="@+id/settings_week_numbers_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_week_numbers"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/week_numbers"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_show_grid_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_show_grid"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/show_a_grid"/>
+
+        </RelativeLayout>
+
+        <View
+            android:id="@+id/events_list_view_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/simple_event_list_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/bigger_margin"
+            android:layout_marginStart="@dimen/bigger_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:text="@string/event_lists"
+            android:textAllCaps="true"
+            android:textSize="@dimen/smaller_text_size"/>
+
+        <RelativeLayout
+            android:id="@+id/settings_replace_description_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_replace_description"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/replace_description_with_location"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_display_past_events_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/bigger_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/bigger_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_display_past_events_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_toLeftOf="@+id/settings_display_past_events"
+                android:layout_toStartOf="@+id/settings_display_past_events"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingRight="@dimen/medium_margin"
+                android:text="@string/display_past_events"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_display_past_events"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:layout_alignParentRight="true"
+                android:layout_marginEnd="@dimen/small_margin"
+                android:layout_marginRight="@dimen/small_margin"
+                android:background="@null"
+                android:clickable="false"/>
+
+        </RelativeLayout>
+
+        <View
+            android:id="@+id/widgets_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/widgets_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/bigger_margin"
+            android:layout_marginStart="@dimen/bigger_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:text="@string/widgets"
+            android:textAllCaps="true"
+            android:textSize="@dimen/smaller_text_size"/>
+
+        <RelativeLayout
+            android:id="@+id/settings_font_size_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_font_size_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_toLeftOf="@+id/settings_font_size"
+                android:layout_toStartOf="@+id/settings_font_size"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingRight="@dimen/medium_margin"
+                android:text="@string/font_size"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_font_size"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentEnd="true"
+                android:layout_alignParentRight="true"
+                android:layout_marginEnd="@dimen/small_margin"
+                android:layout_marginRight="@dimen/small_margin"
+                android:background="@null"
+                android:clickable="false"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_customize_widget_colors_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_customize_widget_colors_label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/customize_widget_colors"/>
+
+        </RelativeLayout>
+
+        <View
+            android:id="@+id/events_divider"
+            android:layout_width="match_parent"
+            android:layout_height="1px"
+            android:background="@color/divider_grey"
+            android:importantForAccessibility="no"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/events_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/bigger_margin"
+            android:layout_marginStart="@dimen/bigger_margin"
+            android:layout_marginTop="@dimen/activity_margin"
+            android:text="@string/events"
+            android:textAllCaps="true"
+            android:textSize="@dimen/smaller_text_size"/>
+
+        <RelativeLayout
+            android:id="@+id/settings_dim_past_events_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/activity_margin">
+
+            <com.simplemobiletools.commons.views.MySwitchCompat
+                android:id="@+id/settings_dim_past_events"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:background="@null"
+                android:clickable="false"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingStart="@dimen/medium_margin"
+                android:text="@string/dim_past_events"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/settings_delete_all_events_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:background="?attr/selectableItemBackground"
+            android:paddingBottom="@dimen/bigger_margin"
+            android:paddingLeft="@dimen/normal_margin"
+            android:paddingRight="@dimen/normal_margin"
+            android:paddingTop="@dimen/bigger_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/settings_delete_all_events"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:paddingLeft="@dimen/medium_margin"
+                android:paddingRight="@dimen/medium_margin"
+                android:text="@string/delete_all_events"/>
+
+        </RelativeLayout>
+    </LinearLayout>
+</ScrollView>
diff --git a/app/src/main/res/layout/all_day_events_holder_line.xml b/app/src/main/res/layout/all_day_events_holder_line.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a03a764f6e76b3f730375b53addaabc05ee8fb1f
--- /dev/null
+++ b/app/src/main/res/layout/all_day_events_holder_line.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"/>
diff --git a/app/src/main/res/layout/calendar_item_account.xml b/app/src/main/res/layout/calendar_item_account.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4b8cc0e16eb01fae70e357fd3a27298fd29bfd33
--- /dev/null
+++ b/app/src/main/res/layout/calendar_item_account.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.simplemobiletools.commons.views.MyTextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/calendar_item_account"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:layout_marginBottom="@dimen/activity_margin"
+    android:layout_marginLeft="@dimen/big_margin"
+    android:layout_marginStart="@dimen/big_margin"
+    android:layout_marginTop="@dimen/activity_margin"
+    android:alpha="0.6"
+    android:textAllCaps="true"
+    android:textColor="@color/divider_grey"
+    android:textSize="@dimen/small_text_size"
+    tools:text="Account"/>
diff --git a/app/src/main/res/layout/calendar_item_calendar.xml b/app/src/main/res/layout/calendar_item_calendar.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4aefba01ccce9ec79df1ed90a1a94efa511f76b8
--- /dev/null
+++ b/app/src/main/res/layout/calendar_item_calendar.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/calendar_item_calendar_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?attr/selectableItemBackground">
+
+    <com.simplemobiletools.commons.views.MySwitchCompat
+        android:id="@+id/calendar_item_calendar_switch"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@null"
+        android:clickable="false"
+        android:paddingBottom="@dimen/activity_margin"
+        android:paddingLeft="@dimen/big_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:paddingTop="@dimen/activity_margin"
+        tools:text="Calendar name"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/date_picker.xml b/app/src/main/res/layout/date_picker.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d29e911a8be01bb55963083c6d90877af3cb63c4
--- /dev/null
+++ b/app/src/main/res/layout/date_picker.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<DatePicker
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/date_picker"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:calendarViewShown="false"
+    android:datePickerMode="spinner"/>
diff --git a/app/src/main/res/layout/day_monthly_event_view.xml b/app/src/main/res/layout/day_monthly_event_view.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1f703c368f04bfd0698fda6d47d4765672a0e08f
--- /dev/null
+++ b/app/src/main/res/layout/day_monthly_event_view.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/day_monthly_event_id"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_margin="1dp"
+    android:ellipsize="none"
+    android:gravity="start"
+    android:hyphenationFrequency="none"
+    android:maxLines="1"
+    android:paddingLeft="@dimen/tiny_margin"
+    android:paddingRight="@dimen/tiny_margin"
+    android:textSize="@dimen/day_monthly_text_size"
+    tools:targetApi="m"
+    tools:text="1"/>
diff --git a/app/src/main/res/layout/day_monthly_number_view.xml b/app/src/main/res/layout/day_monthly_number_view.xml
new file mode 100644
index 0000000000000000000000000000000000000000..57954f1adb9b42d0644ecbfbbdd2ce3f61e3a009
--- /dev/null
+++ b/app/src/main/res/layout/day_monthly_number_view.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/day_monthly_number_id"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginLeft="@dimen/tiny_margin"
+    android:layout_marginRight="@dimen/tiny_margin"
+    android:ellipsize="none"
+    android:gravity="center_horizontal"
+    android:maxLines="1"
+    android:paddingLeft="@dimen/tiny_margin"
+    android:paddingRight="@dimen/tiny_margin"
+    android:textSize="@dimen/normal_text_size"
+    tools:text="1"/>
diff --git a/app/src/main/res/layout/dialog_custom_event_repeat_interval.xml b/app/src/main/res/layout/dialog_custom_event_repeat_interval.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f4320996a0323d56c4e726edbbc826c02788a0d1
--- /dev/null
+++ b/app/src/main/res/layout/dialog_custom_event_repeat_interval.xml
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/dialog_custom_repeat_interval_scrollview"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <LinearLayout
+        android:id="@+id/dialog_custom_repeat_interval_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:paddingTop="@dimen/activity_margin">
+
+        <com.simplemobiletools.commons.views.MyEditText
+            android:id="@+id/dialog_custom_repeat_interval_value"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:digits="0123456789"
+            android:ems="3"
+            android:inputType="number"
+            android:maxLength="4"
+            android:textCursorDrawable="@null"
+            android:textSize="@dimen/normal_text_size"/>
+
+        <RadioGroup
+            android:id="@+id/dialog_radio_view"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingTop="@dimen/normal_margin">
+
+            <com.simplemobiletools.commons.views.MyCompatRadioButton
+                android:id="@+id/dialog_radio_days"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingBottom="@dimen/normal_margin"
+                android:paddingTop="@dimen/normal_margin"
+                android:text="@string/days_raw"/>
+
+            <com.simplemobiletools.commons.views.MyCompatRadioButton
+                android:id="@+id/dialog_radio_weeks"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingBottom="@dimen/normal_margin"
+                android:paddingTop="@dimen/normal_margin"
+                android:text="@string/weeks_raw"/>
+
+            <com.simplemobiletools.commons.views.MyCompatRadioButton
+                android:id="@+id/dialog_radio_months"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingBottom="@dimen/normal_margin"
+                android:paddingTop="@dimen/normal_margin"
+                android:text="@string/months_raw"/>
+
+            <com.simplemobiletools.commons.views.MyCompatRadioButton
+                android:id="@+id/dialog_radio_years"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:paddingBottom="@dimen/normal_margin"
+                android:paddingTop="@dimen/normal_margin"
+                android:text="@string/years_raw"/>
+
+        </RadioGroup>
+    </LinearLayout>
+</ScrollView>
diff --git a/app/src/main/res/layout/dialog_delete_event.xml b/app/src/main/res/layout/dialog_delete_event.xml
new file mode 100644
index 0000000000000000000000000000000000000000..25befa8d8d0ada9ff0d5b945cadfb33eeb2f7e83
--- /dev/null
+++ b/app/src/main/res/layout/dialog_delete_event.xml
@@ -0,0 +1,50 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/delete_event_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingLeft="@dimen/big_margin"
+    android:paddingRight="@dimen/big_margin"
+    android:paddingTop="@dimen/big_margin">
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/delete_event_description"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text="@string/proceed_with_deletion"
+        android:textSize="@dimen/bigger_text_size"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/delete_event_repeat_description"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/activity_margin"
+        android:paddingBottom="@dimen/normal_margin"
+        android:text="@string/event_is_repeatable"
+        android:textSize="@dimen/normal_text_size"/>
+
+    <RadioGroup
+        android:id="@+id/delete_event_radio_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <com.simplemobiletools.commons.views.MyCompatRadioButton
+            android:id="@+id/delete_event_one_only"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:checked="true"
+            android:paddingBottom="@dimen/normal_margin"
+            android:paddingTop="@dimen/normal_margin"
+            android:text="@string/delete_one_only"/>
+
+        <com.simplemobiletools.commons.views.MyCompatRadioButton
+            android:id="@+id/delete_event_all"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/normal_margin"
+            android:paddingTop="@dimen/normal_margin"
+            android:text="@string/delete_all_occurrences"/>
+    </RadioGroup>
+</LinearLayout>
diff --git a/app/src/main/res/layout/dialog_edit_repeating_event.xml b/app/src/main/res/layout/dialog_edit_repeating_event.xml
new file mode 100644
index 0000000000000000000000000000000000000000..8b09b47d61f65eaed2687ef0d7be9ab523f2b1d8
--- /dev/null
+++ b/app/src/main/res/layout/dialog_edit_repeating_event.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/edit_repeating_event_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:paddingLeft="@dimen/big_margin"
+    android:paddingRight="@dimen/big_margin"
+    android:paddingTop="@dimen/big_margin">
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/edit_repeating_event_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/activity_margin"
+        android:text="@string/event_is_repeatable"/>
+
+    <RadioGroup
+        android:id="@+id/edit_repeating_event_radiogroup"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/activity_margin">
+
+        <com.simplemobiletools.commons.views.MyCompatRadioButton
+            android:id="@+id/edit_repeating_event_one_only"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/update_one_only"/>
+
+        <com.simplemobiletools.commons.views.MyCompatRadioButton
+            android:id="@+id/edit_repeating_event_all_occurrences"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/activity_margin"
+            android:paddingTop="@dimen/activity_margin"
+            android:text="@string/update_all_occurrences"/>
+
+    </RadioGroup>
+</LinearLayout>
diff --git a/app/src/main/res/layout/dialog_event_type.xml b/app/src/main/res/layout/dialog_event_type.xml
new file mode 100644
index 0000000000000000000000000000000000000000..db7db9d05f7824ecd00db87d549ceeae9a1a19cd
--- /dev/null
+++ b/app/src/main/res/layout/dialog_event_type.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/event_type_dialog_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:paddingLeft="@dimen/activity_margin"
+    android:paddingRight="@dimen/activity_margin"
+    android:paddingTop="@dimen/activity_margin">
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/type_title_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/title"/>
+
+    <com.simplemobiletools.commons.views.MyEditText
+        android:id="@+id/type_title"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginBottom="@dimen/activity_margin"
+        android:layout_marginLeft="@dimen/small_margin"
+        android:layout_marginStart="@dimen/small_margin"
+        android:inputType="textCapSentences"
+        android:maxLength="80"
+        android:singleLine="true"
+        android:textCursorDrawable="@null"
+        android:textSize="@dimen/normal_text_size"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/type_color_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="@string/color"/>
+
+    <ImageView
+        android:id="@+id/type_color"
+        android:layout_width="@dimen/color_sample_size"
+        android:layout_height="@dimen/color_sample_size"
+        android:layout_marginLeft="@dimen/medium_margin"
+        android:layout_marginStart="@dimen/medium_margin"
+        android:layout_marginTop="@dimen/medium_margin"/>
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/dialog_export_events.xml b/app/src/main/res/layout/dialog_export_events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7a662340017ee1c344f1fe582af549b0aa127e2e
--- /dev/null
+++ b/app/src/main/res/layout/dialog_export_events.xml
@@ -0,0 +1,94 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/export_events_scrollview"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <LinearLayout
+        android:id="@+id/export_events_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:paddingTop="@dimen/activity_margin">
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/export_events_folder_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/folder"
+            android:textSize="@dimen/smaller_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/export_events_folder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/activity_margin"
+            android:layout_marginLeft="@dimen/activity_margin"
+            android:paddingBottom="@dimen/small_margin"
+            android:paddingRight="@dimen/small_margin"
+            android:paddingTop="@dimen/small_margin"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/export_events_filename_label"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="@string/filename_without_ics"
+            android:textSize="@dimen/smaller_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyEditText
+            android:id="@+id/export_events_filename"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginBottom="@dimen/activity_margin"
+            android:layout_marginLeft="@dimen/activity_margin"
+            android:paddingRight="@dimen/small_margin"
+            android:paddingTop="@dimen/normal_margin"
+            android:textSize="@dimen/normal_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+            android:id="@+id/export_events_checkbox"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:paddingBottom="@dimen/small_margin"
+            android:paddingTop="@dimen/small_margin"
+            android:text="@string/export_past_events_too"/>
+
+        <LinearLayout
+            android:id="@+id/export_events_pick_types"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical"
+            android:visibility="gone">
+
+            <ImageView
+                android:id="@+id/export_events_divider"
+                android:layout_width="match_parent"
+                android:layout_height="1px"
+                android:layout_marginBottom="@dimen/medium_margin"
+                android:layout_marginTop="@dimen/medium_margin"
+                android:background="@color/divider_grey"
+                android:importantForAccessibility="no"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/export_events_pick_types_label"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="@string/include_event_types"
+                android:textSize="@dimen/smaller_text_size"/>
+
+            <android.support.v7.widget.RecyclerView
+                android:id="@+id/export_events_types_list"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:clipToPadding="false"
+                android:overScrollMode="never"
+                android:paddingTop="@dimen/medium_margin"
+                app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
+
+        </LinearLayout>
+    </LinearLayout>
+</ScrollView>
diff --git a/app/src/main/res/layout/dialog_filter_event_types.xml b/app/src/main/res/layout/dialog_filter_event_types.xml
new file mode 100644
index 0000000000000000000000000000000000000000..572d34b8b5f32465317ece41e1e2cd607da4b3cd
--- /dev/null
+++ b/app/src/main/res/layout/dialog_filter_event_types.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v7.widget.RecyclerView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/filter_event_types_list"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:clipToPadding="false"
+    android:overScrollMode="never"
+    android:paddingTop="@dimen/medium_margin"
+    app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
diff --git a/app/src/main/res/layout/dialog_import_events.xml b/app/src/main/res/layout/dialog_import_events.xml
new file mode 100644
index 0000000000000000000000000000000000000000..acdcc46edd9e322789f68b5e35a36eb72933db75
--- /dev/null
+++ b/app/src/main/res/layout/dialog_import_events.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/import_events_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:paddingRight="@dimen/activity_margin"
+    android:paddingTop="@dimen/activity_margin">
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/import_events_event_type_label"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/activity_margin"
+        android:text="@string/default_event_type"
+        android:textSize="@dimen/smaller_text_size"/>
+
+    <RelativeLayout
+        android:id="@+id/import_event_type_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/activity_margin"
+        android:background="?attr/selectableItemBackground"
+        android:padding="@dimen/small_margin">
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/import_event_type_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:paddingLeft="@dimen/medium_margin"
+            android:paddingRight="@dimen/medium_margin"/>
+
+        <ImageView
+            android:id="@+id/import_event_type_color"
+            android:layout_width="@dimen/color_sample_size"
+            android:layout_height="@dimen/color_sample_size"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+            android:layout_marginEnd="@dimen/medium_margin"
+            android:layout_marginRight="@dimen/medium_margin"
+            android:clickable="false"/>
+
+    </RelativeLayout>
+
+    <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+        android:id="@+id/import_events_checkbox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/normal_margin"
+        android:paddingBottom="@dimen/activity_margin"
+        android:paddingTop="@dimen/activity_margin"
+        android:text="@string/override_event_types"/>
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/dialog_repeat_limit_type_picker.xml b/app/src/main/res/layout/dialog_repeat_limit_type_picker.xml
new file mode 100644
index 0000000000000000000000000000000000000000..21d9a65e1da520bee55199906146450d67e70d44
--- /dev/null
+++ b/app/src/main/res/layout/dialog_repeat_limit_type_picker.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/dialog_repeat_type_picker_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <RadioGroup
+        android:id="@+id/dialog_radio_view"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:padding="@dimen/activity_margin">
+
+        <com.simplemobiletools.commons.views.MyCompatRadioButton
+            android:id="@+id/repeat_type_till_date"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:text="@string/repeat_till_date"/>
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/repeat_type_date"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/repeat_type_margin_start"
+            android:layout_marginStart="@dimen/repeat_type_margin_start"
+            android:paddingBottom="@dimen/normal_margin"
+            android:paddingTop="@dimen/medium_margin"
+            tools:text="January 1 1970"/>
+
+        <com.simplemobiletools.commons.views.MyCompatRadioButton
+            android:id="@+id/repeat_type_x_times"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/small_margin"
+            android:text="@string/repeat_x_times"/>
+
+        <com.simplemobiletools.commons.views.MyEditText
+            android:id="@+id/repeat_type_count"
+            android:layout_width="100dp"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/repeat_type_margin_start"
+            android:layout_marginStart="@dimen/repeat_type_margin_start"
+            android:inputType="number"
+            android:maxLength="5"
+            android:textSize="@dimen/normal_text_size"/>
+
+        <com.simplemobiletools.commons.views.MyCompatRadioButton
+            android:id="@+id/repeat_type_forever"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/medium_margin"
+            android:text="@string/repeat_forever"/>
+
+    </RadioGroup>
+</ScrollView>
diff --git a/app/src/main/res/layout/dialog_select_calendars.xml b/app/src/main/res/layout/dialog_select_calendars.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c0c66b1c77d5d176aa053d7b0fe57305640ae28d
--- /dev/null
+++ b/app/src/main/res/layout/dialog_select_calendars.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/dialog_select_calendars_scrollview"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="@dimen/activity_margin">
+
+    <LinearLayout
+        android:id="@+id/dialog_select_calendars_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical">
+
+    </LinearLayout>
+</ScrollView>
diff --git a/app/src/main/res/layout/dialog_select_radio_group.xml b/app/src/main/res/layout/dialog_select_radio_group.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0da0e43d95d8c1e1236f54a833083dce3fd57892
--- /dev/null
+++ b/app/src/main/res/layout/dialog_select_radio_group.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ScrollView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/dialog_radio_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <RadioGroup
+        android:id="@+id/dialog_radio_group"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingBottom="@dimen/normal_margin"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:paddingTop="@dimen/normal_margin"/>
+
+</ScrollView>
diff --git a/app/src/main/res/layout/dialog_vertical_linear_layout.xml b/app/src/main/res/layout/dialog_vertical_linear_layout.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7fc649528133614e34659148a4d5461a83d0dd40
--- /dev/null
+++ b/app/src/main/res/layout/dialog_vertical_linear_layout.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/dialog_vertical_linear_layout"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical"
+    android:paddingLeft="@dimen/activity_margin"
+    android:paddingRight="@dimen/activity_margin"
+    android:paddingTop="@dimen/activity_margin"/>
diff --git a/app/src/main/res/layout/event_item_day_view.xml b/app/src/main/res/layout/event_item_day_view.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c66c75730b71afc4b1b0947166778e6c87faaae1
--- /dev/null
+++ b/app/src/main/res/layout/event_item_day_view.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/event_item_frame"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?attr/selectableItemBackground"
+    android:clickable="true"
+    android:focusable="true"
+    android:foreground="@drawable/selector"
+    android:paddingLeft="@dimen/activity_margin">
+
+    <RelativeLayout
+        android:id="@+id/event_item_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingBottom="@dimen/medium_margin"
+        android:paddingTop="@dimen/medium_margin">
+
+        <TextView
+            android:id="@+id/event_item_start"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="@dimen/day_text_size"
+            tools:text="13:00"/>
+
+        <TextView
+            android:id="@+id/event_item_end"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/event_item_start"
+            android:text="15:00"
+            android:textSize="@dimen/day_text_size"/>
+
+        <TextView
+            android:id="@+id/event_section_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/activity_margin"
+            android:layout_toLeftOf="@+id/event_item_color"
+            android:layout_toRightOf="@+id/event_item_start"
+            android:ellipsize="end"
+            android:maxLines="1"
+            android:paddingRight="@dimen/activity_margin"
+            android:textSize="@dimen/day_text_size"
+            tools:text="Event title"/>
+
+        <TextView
+            android:id="@+id/event_item_description"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/event_section_title"
+            android:layout_marginLeft="@dimen/activity_margin"
+            android:layout_toLeftOf="@+id/event_item_color"
+            android:layout_toRightOf="@+id/event_item_end"
+            android:ellipsize="end"
+            android:maxLines="1"
+            android:paddingRight="@dimen/activity_margin"
+            android:textSize="@dimen/day_text_size"
+            tools:text="Event description"/>
+
+        <ImageView
+            android:id="@+id/event_item_color"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignBottom="@+id/event_section_title"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+            android:layout_alignTop="@+id/event_section_title"
+            android:paddingRight="@dimen/activity_margin"
+            android:src="@drawable/monthly_event_dot"/>
+
+    </RelativeLayout>
+</FrameLayout>
diff --git a/app/src/main/res/layout/event_list_item.xml b/app/src/main/res/layout/event_list_item.xml
new file mode 100644
index 0000000000000000000000000000000000000000..de5a43714c4cf5d1c04d1e817fb30f51fb0622c2
--- /dev/null
+++ b/app/src/main/res/layout/event_list_item.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/event_item_frame"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?attr/selectableItemBackground"
+    android:clickable="true"
+    android:focusable="true"
+    android:foreground="@drawable/selector"
+    android:paddingLeft="@dimen/activity_margin">
+
+    <RelativeLayout
+        android:id="@+id/event_item_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:paddingBottom="@dimen/medium_margin"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:paddingTop="@dimen/small_margin">
+
+        <TextView
+            android:id="@+id/event_item_start"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="@dimen/day_text_size"
+            tools:text="13:00"/>
+
+        <TextView
+            android:id="@+id/event_item_end"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/event_item_start"
+            android:text="15:00"
+            android:textSize="@dimen/day_text_size"/>
+
+        <TextView
+            android:id="@+id/event_section_title"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="@dimen/activity_margin"
+            android:layout_toLeftOf="@+id/event_item_color"
+            android:layout_toRightOf="@+id/event_item_start"
+            android:ellipsize="end"
+            android:maxLines="1"
+            android:paddingRight="@dimen/activity_margin"
+            android:textSize="@dimen/day_text_size"
+            tools:text="Event title"/>
+
+        <TextView
+            android:id="@+id/event_item_description"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/event_section_title"
+            android:layout_marginLeft="@dimen/activity_margin"
+            android:layout_toLeftOf="@+id/event_item_color"
+            android:layout_toRightOf="@+id/event_item_end"
+            android:ellipsize="end"
+            android:maxLines="1"
+            android:paddingRight="@dimen/activity_margin"
+            android:textSize="@dimen/day_text_size"
+            tools:text="Event description"/>
+
+        <ImageView
+            android:id="@+id/event_item_color"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_alignBottom="@+id/event_section_title"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+            android:layout_alignTop="@+id/event_section_title"
+            android:paddingRight="@dimen/medium_margin"
+            android:src="@drawable/monthly_event_dot"/>
+
+    </RelativeLayout>
+</FrameLayout>
diff --git a/app/src/main/res/layout/event_list_item_widget.xml b/app/src/main/res/layout/event_list_item_widget.xml
new file mode 100644
index 0000000000000000000000000000000000000000..86531f6d030853bf32245123a2b9c777b7e2931e
--- /dev/null
+++ b/app/src/main/res/layout/event_list_item_widget.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/event_item_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content">
+
+    <TextView
+        android:id="@+id/event_item_start"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/activity_margin"
+        android:textSize="@dimen/day_text_size"
+        tools:text="13:00"/>
+
+    <TextView
+        android:id="@+id/event_item_end"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/event_item_start"
+        android:layout_marginLeft="@dimen/activity_margin"
+        android:text="15:00"
+        android:textSize="@dimen/day_text_size"/>
+
+    <TextView
+        android:id="@+id/event_section_title"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginLeft="@dimen/big_margin"
+        android:layout_toLeftOf="@+id/event_item_color"
+        android:layout_toRightOf="@+id/event_item_start"
+        android:ellipsize="end"
+        android:maxLines="1"
+        android:paddingRight="@dimen/activity_margin"
+        android:textSize="@dimen/day_text_size"
+        tools:text="Event title"/>
+
+    <TextView
+        android:id="@+id/event_item_description"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/event_section_title"
+        android:layout_marginLeft="@dimen/big_margin"
+        android:layout_toLeftOf="@+id/event_item_color"
+        android:layout_toRightOf="@+id/event_item_end"
+        android:ellipsize="end"
+        android:maxLines="1"
+        android:paddingRight="@dimen/activity_margin"
+        android:textSize="@dimen/day_text_size"
+        tools:text="Event description"/>
+
+    <ImageView
+        android:id="@+id/event_item_color"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_alignBottom="@+id/event_section_title"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentRight="true"
+        android:layout_alignTop="@+id/event_section_title"
+        android:paddingRight="@dimen/activity_margin"
+        android:src="@drawable/monthly_event_dot"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/event_list_section.xml b/app/src/main/res/layout/event_list_section.xml
new file mode 100644
index 0000000000000000000000000000000000000000..34106cde1ec80f2e18282cc411bd1e644cbc0687
--- /dev/null
+++ b/app/src/main/res/layout/event_list_section.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.simplemobiletools.commons.views.MyTextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/event_section_title"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:clickable="false"
+    android:drawablePadding="1dp"
+    android:drawableTop="@drawable/divider_width"
+    android:focusable="false"
+    android:paddingLeft="@dimen/activity_margin"
+    android:paddingTop="@dimen/medium_margin"
+    android:textSize="@dimen/normal_text_size"
+    android:textStyle="bold"/>
diff --git a/app/src/main/res/layout/event_list_section_widget.xml b/app/src/main/res/layout/event_list_section_widget.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0a8f4507173eade96cf1c695f46ad67d5ecaf71d
--- /dev/null
+++ b/app/src/main/res/layout/event_list_section_widget.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/event_section_title"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:drawablePadding="1dp"
+    android:drawableTop="@drawable/divider_width"
+    android:paddingTop="@dimen/medium_margin"
+    android:textSize="@dimen/normal_text_size"
+    android:textStyle="bold"/>
diff --git a/app/src/main/res/layout/event_list_widget.xml b/app/src/main/res/layout/event_list_widget.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0fb1221e9afa0b5a64d96cc62130356842f878f1
--- /dev/null
+++ b/app/src/main/res/layout/event_list_widget.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/calendar_events_list_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <ListView
+        android:id="@+id/calendar_events_list"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:clipToPadding="false"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingTop="@dimen/medium_margin"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/filter_event_type_view.xml b/app/src/main/res/layout/filter_event_type_view.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c4c1a1c34a526a0733657f6342af58fe575a0d50
--- /dev/null
+++ b/app/src/main/res/layout/filter_event_type_view.xml
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/filter_event_type_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?attr/selectableItemBackground"
+    android:padding="@dimen/normal_margin">
+
+    <com.simplemobiletools.commons.views.MyAppCompatCheckbox
+        android:id="@+id/filter_event_type_checkbox"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginRight="@dimen/medium_margin"
+        android:layout_toLeftOf="@+id/filter_event_type_color"
+        android:clickable="false"
+        android:paddingLeft="@dimen/small_margin"/>
+
+    <ImageView
+        android:id="@+id/filter_event_type_color"
+        android:layout_width="@dimen/color_sample_size"
+        android:layout_height="@dimen/color_sample_size"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:layout_marginEnd="@dimen/medium_margin"
+        android:layout_marginRight="@dimen/medium_margin"
+        android:clickable="false"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/first_row.xml b/app/src/main/res/layout/first_row.xml
new file mode 100644
index 0000000000000000000000000000000000000000..569481f1bcc832d96b3f4219284b600681fa5b1e
--- /dev/null
+++ b/app/src/main/res/layout/first_row.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal"
+    android:paddingBottom="@dimen/small_margin"
+    android:paddingTop="@dimen/small_margin">
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/week_num"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="#"
+        android:visibility="gone"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/label_0"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/monday_letter"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/label_1"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/tuesday_letter"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/label_2"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/wednesday_letter"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/label_3"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/thursday_letter"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/label_4"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/friday_letter"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/label_5"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/saturday_letter"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/label_6"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/sunday_letter"/>
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/first_row_widget.xml b/app/src/main/res/layout/first_row_widget.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0b5145d55dd58197fef161a5c38578d94a12ae3b
--- /dev/null
+++ b/app/src/main/res/layout/first_row_widget.xml
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal"
+    android:paddingBottom="@dimen/small_margin"
+    android:paddingTop="@dimen/small_margin">
+
+    <TextView
+        android:id="@+id/week_num"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="#"/>
+
+    <TextView
+        android:id="@+id/label_0"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/monday_letter"/>
+
+    <TextView
+        android:id="@+id/label_1"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/tuesday_letter"/>
+
+    <TextView
+        android:id="@+id/label_2"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/wednesday_letter"/>
+
+    <TextView
+        android:id="@+id/label_3"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/thursday_letter"/>
+
+    <TextView
+        android:id="@+id/label_4"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/friday_letter"/>
+
+    <TextView
+        android:id="@+id/label_5"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/saturday_letter"/>
+
+    <TextView
+        android:id="@+id/label_6"
+        style="@style/MetaView"
+        android:layout_width="0dp"
+        android:layout_height="match_parent"
+        android:layout_weight="1"
+        android:text="@string/sunday_letter"/>
+
+</LinearLayout>
diff --git a/app/src/main/res/layout/fragment_day.xml b/app/src/main/res/layout/fragment_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1a8eab2008f2ce24bedb91a935f48ccec9b98931
--- /dev/null
+++ b/app/src/main/res/layout/fragment_day.xml
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/day_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:paddingTop="@dimen/medium_margin">
+
+    <include layout="@layout/top_navigation"/>
+
+    <com.simplemobiletools.commons.views.MyRecyclerView
+        android:id="@+id/day_events"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/top_value"
+        android:clipToPadding="false"
+        app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/fragment_days_holder.xml b/app/src/main/res/layout/fragment_days_holder.xml
new file mode 100644
index 0000000000000000000000000000000000000000..686ac134ea9add67b61a968be77d394e82c6f67a
--- /dev/null
+++ b/app/src/main/res/layout/fragment_days_holder.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.simplemobiletools.commons.views.MyViewPager
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/fragment_days_viewpager"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:clickable="true"
+    android:focusable="true"/>
diff --git a/app/src/main/res/layout/fragment_event_list.xml b/app/src/main/res/layout/fragment_event_list.xml
new file mode 100644
index 0000000000000000000000000000000000000000..626f20a5b13316ab41d4fffd2d97abb9fec1a3fc
--- /dev/null
+++ b/app/src/main/res/layout/fragment_event_list.xml
@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/calendar_events_list_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <com.simplemobiletools.commons.views.MyRecyclerView
+        android:id="@+id/calendar_events_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:clipToPadding="false"
+        android:overScrollMode="never"
+        android:paddingTop="@dimen/medium_margin"
+        android:scrollbars="vertical"
+        android:visibility="gone"
+        app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/calendar_empty_list_placeholder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="@dimen/activity_margin"
+        android:gravity="center"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:text="@string/no_upcoming_events"
+        android:textSize="@dimen/bigger_text_size"
+        android:visibility="gone"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/calendar_empty_list_placeholder_2"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/calendar_empty_list_placeholder"
+        android:layout_centerHorizontal="true"
+        android:gravity="center"
+        android:paddingBottom="@dimen/medium_margin"
+        android:paddingTop="@dimen/medium_margin"
+        android:text="@string/create_new_event"
+        android:textSize="@dimen/bigger_text_size"
+        android:visibility="gone"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/fragment_month.xml b/app/src/main/res/layout/fragment_month.xml
new file mode 100644
index 0000000000000000000000000000000000000000..401c4883f4ad796b4ff747c90983faeafe547cd1
--- /dev/null
+++ b/app/src/main/res/layout/fragment_month.xml
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/month_calendar_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingTop="@dimen/medium_margin">
+
+    <include layout="@layout/top_navigation"/>
+
+    <com.simplemobiletools.calendar.views.MonthViewWrapper
+        android:id="@+id/month_view_wrapper"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/top_left_arrow"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/fragment_month_widget.xml b/app/src/main/res/layout/fragment_month_widget.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6a167796127de38239393e350b7e19214fb518b3
--- /dev/null
+++ b/app/src/main/res/layout/fragment_month_widget.xml
@@ -0,0 +1,460 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/calendar_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="@dimen/medium_margin">
+
+    <include layout="@layout/top_navigation_widget"/>
+
+    <include
+        android:id="@+id/first_row_widget"
+        layout="@layout/first_row_widget"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/top_value"
+        tools:ignore="UnknownIdInLayout"/>
+
+    <LinearLayout
+        android:id="@+id/table_holder"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/first_row_widget"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_1"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/week_num_0"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_0"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_1"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_2"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_3"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_4"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_5"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_6"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_2"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/week_num_1"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_7"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_8"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_9"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_10"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_11"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_12"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_13"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_3"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/week_num_2"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_14"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_15"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_16"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_17"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_18"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_19"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_20"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_4"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/week_num_3"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_21"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_22"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_23"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_24"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_25"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_26"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_27"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_5"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/week_num_4"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_28"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_29"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_30"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_31"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_32"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_33"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_34"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_6"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="1"
+            android:orientation="horizontal">
+
+            <TextView
+                android:id="@+id/week_num_5"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_35"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_36"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_37"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_38"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_39"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_40"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_41"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+    </LinearLayout>
+</RelativeLayout>
diff --git a/app/src/main/res/layout/fragment_month_widget_config.xml b/app/src/main/res/layout/fragment_month_widget_config.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a7c627fdbed55d1079e70b215833cd461aaffa8a
--- /dev/null
+++ b/app/src/main/res/layout/fragment_month_widget_config.xml
@@ -0,0 +1,505 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/month_calendar_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:paddingTop="@dimen/medium_margin">
+
+    <include layout="@layout/top_navigation"/>
+
+    <include
+        android:id="@+id/first_row"
+        layout="@layout/first_row"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/top_value"
+        tools:ignore="UnknownIdInLayout"/>
+
+    <LinearLayout
+        android:id="@+id/table_holder"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/first_row"
+        android:gravity="center"
+        android:orientation="vertical">
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_1"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:orientation="horizontal">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_num_0"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_0"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_1"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_2"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_3"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_4"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_5"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_6"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_2"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:orientation="horizontal">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_num_1"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_7"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_8"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_9"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_10"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_11"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_12"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_13"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_3"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:orientation="horizontal">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_num_2"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_14"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_15"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_16"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_17"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_18"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_19"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_20"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_4"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:orientation="horizontal">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_num_3"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_21"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_22"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_23"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_24"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_25"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_26"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_27"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_5"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:orientation="horizontal">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_num_4"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_28"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_29"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_30"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_31"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_32"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_33"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_34"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/month_line_holder_6"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_weight="2"
+            android:orientation="horizontal">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_num_5"
+                style="@style/WeekNumberStyle"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:visibility="gone"/>
+
+            <LinearLayout
+                android:id="@+id/day_35"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_36"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_37"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_38"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_39"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_40"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/day_41"
+                android:layout_width="0dp"
+                android:layout_height="match_parent"
+                android:layout_weight="1"
+                android:background="?attr/selectableItemBackground"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"/>
+        </LinearLayout>
+    </LinearLayout>
+</RelativeLayout>
diff --git a/app/src/main/res/layout/fragment_months_holder.xml b/app/src/main/res/layout/fragment_months_holder.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6f11ba5147760f8a745a640c5f07eb0ccf825cb8
--- /dev/null
+++ b/app/src/main/res/layout/fragment_months_holder.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.simplemobiletools.commons.views.MyViewPager
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/fragment_months_viewpager"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:clickable="true"
+    android:focusable="true"/>
diff --git a/app/src/main/res/layout/fragment_week.xml b/app/src/main/res/layout/fragment_week.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0ec20439188076ad8240817b3699c1eaa15ccc57
--- /dev/null
+++ b/app/src/main/res/layout/fragment_week.xml
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/week_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <LinearLayout
+        android:id="@+id/week_vertical_grid_holder"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:orientation="horizontal"/>
+
+    <com.simplemobiletools.calendar.views.MyScrollView
+        android:id="@+id/week_events_scrollview"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/week_top_holder"
+        android:fillViewport="true"
+        android:overScrollMode="never"
+        android:scrollbars="none">
+
+        <RelativeLayout
+            android:id="@+id/week_events_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content">
+
+            <LinearLayout
+                android:id="@+id/week_horizontal_grid_holder"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/weekly_view_events_height"
+                android:orientation="vertical"/>
+
+            <LinearLayout
+                android:id="@+id/week_events_columns_holder"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/weekly_view_events_height"
+                android:background="@android:color/transparent"
+                android:orientation="horizontal">
+
+                <RelativeLayout
+                    android:id="@+id/week_column_0"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"/>
+
+                <RelativeLayout
+                    android:id="@+id/week_column_1"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"/>
+
+                <RelativeLayout
+                    android:id="@+id/week_column_2"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"/>
+
+                <RelativeLayout
+                    android:id="@+id/week_column_3"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"/>
+
+                <RelativeLayout
+                    android:id="@+id/week_column_4"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"/>
+
+                <RelativeLayout
+                    android:id="@+id/week_column_5"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"/>
+
+                <RelativeLayout
+                    android:id="@+id/week_column_6"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"/>
+
+            </LinearLayout>
+        </RelativeLayout>
+    </com.simplemobiletools.calendar.views.MyScrollView>
+
+    <RelativeLayout
+        android:id="@+id/week_top_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="@drawable/stroke_bottom"
+        android:gravity="center_vertical">
+
+        <LinearLayout
+            android:id="@+id/week_letters_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:gravity="center_vertical"
+            android:orientation="horizontal"
+            android:paddingBottom="@dimen/small_margin">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_day_label_0"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:text="@string/monday_letter"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_day_label_1"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:text="@string/tuesday_letter"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_day_label_2"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:text="@string/wednesday_letter"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_day_label_3"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:text="@string/thursday_letter"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_day_label_4"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:text="@string/friday_letter"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_day_label_5"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:text="@string/saturday_letter"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/week_day_label_6"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_weight="1"
+                android:gravity="center_horizontal"
+                android:text="@string/sunday_letter"
+                android:textSize="@dimen/normal_text_size"/>
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:id="@+id/week_all_day_holder"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/week_letters_holder"
+            android:orientation="vertical">
+
+        </LinearLayout>
+    </RelativeLayout>
+</RelativeLayout>
diff --git a/app/src/main/res/layout/fragment_week_holder.xml b/app/src/main/res/layout/fragment_week_holder.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c608620da1ab6e809ea83340ffe561f0e9c843e0
--- /dev/null
+++ b/app/src/main/res/layout/fragment_week_holder.xml
@@ -0,0 +1,49 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/week_view_main_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:fillViewport="true">
+
+    <RelativeLayout
+        android:id="@+id/week_view_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/week_view_hours_divider"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_alignRight="@+id/week_view_hours_scrollview"
+            android:background="@drawable/stroke_bottom_right"
+            android:importantForAccessibility="no"/>
+
+        <com.simplemobiletools.calendar.views.MyScrollView
+            android:id="@+id/week_view_hours_scrollview"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_below="@+id/week_view_hours_divider"
+            android:background="@drawable/stroke_right"
+            android:overScrollMode="never"
+            android:paddingTop="@dimen/medium_margin"
+            android:scrollbars="none">
+
+            <LinearLayout
+                android:id="@+id/week_view_hours_holder"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:orientation="vertical"
+                android:paddingBottom="@dimen/weekly_view_row_height"/>
+
+        </com.simplemobiletools.calendar.views.MyScrollView>
+
+        <com.simplemobiletools.commons.views.MyViewPager
+            android:id="@+id/week_view_view_pager"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_toRightOf="@+id/week_view_hours_scrollview"/>
+
+    </RelativeLayout>
+</LinearLayout>
diff --git a/app/src/main/res/layout/fragment_year.xml b/app/src/main/res/layout/fragment_year.xml
new file mode 100644
index 0000000000000000000000000000000000000000..eda476cf22eb8e09a278bd35cb732255284e3ee4
--- /dev/null
+++ b/app/src/main/res/layout/fragment_year.xml
@@ -0,0 +1,325 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TableLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/calendar_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:padding="@dimen/yearly_padding_side">
+
+    <TableRow android:layout_weight="1">
+
+        <RelativeLayout
+            android:id="@+id/month_1_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/yearly_padding_full"
+            android:layout_marginRight="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_1_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/january"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_1"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/month_1_label"
+                android:layout_centerInParent="true"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_2_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_half"
+            android:layout_marginRight="@dimen/yearly_padding_half"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_2_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/february"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_2"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/month_2_label"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_3_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_full"
+            android:layout_marginStart="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_3_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/march"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_3"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/month_3_label"/>
+
+        </RelativeLayout>
+    </TableRow>
+
+    <TableRow android:layout_weight="1">
+
+        <RelativeLayout
+            android:id="@+id/month_4_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/yearly_padding_full"
+            android:layout_marginRight="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_4_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/april"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_4"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_4_label"
+                app:days="30"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_5_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_half"
+            android:layout_marginRight="@dimen/yearly_padding_half"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_5_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/may"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_5"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_5_label"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_6_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_full"
+            android:layout_marginStart="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_6_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/june"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_6"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_6_label"
+                app:days="30"/>
+        </RelativeLayout>
+    </TableRow>
+
+    <TableRow android:layout_weight="1">
+
+        <RelativeLayout
+            android:id="@+id/month_7_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/yearly_padding_full"
+            android:layout_marginRight="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_7_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/july"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_7"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_7_label"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_8_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_half"
+            android:layout_marginRight="@dimen/yearly_padding_half"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_8_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/august"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_8"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_8_label"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_9_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_full"
+            android:layout_marginStart="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_9_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/september"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_9"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_9_label"
+                app:days="30"/>
+
+        </RelativeLayout>
+    </TableRow>
+
+    <TableRow android:layout_weight="1">
+
+        <RelativeLayout
+            android:id="@+id/month_10_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginEnd="@dimen/yearly_padding_full"
+            android:layout_marginRight="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_10_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/october"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_10"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_10_label"/>
+
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_11_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_half"
+            android:layout_marginRight="@dimen/yearly_padding_half"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_11_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/november"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_11"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_11_label"
+                android:layout_marginLeft="@dimen/yearly_month_padding"
+                android:layout_marginStart="@dimen/yearly_month_padding"
+                app:days="30"/>
+        </RelativeLayout>
+
+        <RelativeLayout
+            android:id="@+id/month_12_holder"
+            android:layout_width="0dp"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="@dimen/yearly_padding_full"
+            android:layout_marginStart="@dimen/yearly_padding_full"
+            android:layout_weight="1">
+
+            <com.simplemobiletools.commons.views.MyTextView
+                android:id="@+id/month_12_label"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:gravity="center_horizontal"
+                android:text="@string/december"
+                android:textAllCaps="true"
+                android:textSize="@dimen/normal_text_size"/>
+
+            <com.simplemobiletools.calendar.views.SmallMonthView
+                android:id="@+id/month_12"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:layout_below="@+id/month_12_label"/>
+
+        </RelativeLayout>
+    </TableRow>
+</TableLayout>
diff --git a/app/src/main/res/layout/fragment_years_holder.xml b/app/src/main/res/layout/fragment_years_holder.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c5ed08cd6d363e5170a5aa882383a6b50de31e22
--- /dev/null
+++ b/app/src/main/res/layout/fragment_years_holder.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.simplemobiletools.commons.views.MyViewPager
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/fragment_years_viewpager"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:clickable="true"
+    android:focusable="true"/>
diff --git a/app/src/main/res/layout/item_event_type.xml b/app/src/main/res/layout/item_event_type.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a8ea05de18bc9e290c0fe514344ccfbbd135b2fc
--- /dev/null
+++ b/app/src/main/res/layout/item_event_type.xml
@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<FrameLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:id="@+id/event_item_frame"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?attr/selectableItemBackground"
+    android:clickable="true"
+    android:focusable="true"
+    android:foreground="@drawable/selector">
+
+    <RelativeLayout
+        android:id="@+id/event_type_holder"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="?attr/selectableItemBackground"
+        android:padding="@dimen/activity_margin">
+
+        <com.simplemobiletools.commons.views.MyTextView
+            android:id="@+id/event_type_title"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_toLeftOf="@+id/event_type_color"
+            android:paddingLeft="@dimen/medium_margin"
+            android:paddingRight="@dimen/medium_margin"
+            tools:text="Event type"/>
+
+        <ImageView
+            android:id="@+id/event_type_color"
+            android:layout_width="@dimen/color_sample_size"
+            android:layout_height="@dimen/color_sample_size"
+            android:layout_alignParentEnd="true"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true"
+            android:layout_marginEnd="@dimen/medium_margin"
+            android:layout_marginRight="@dimen/medium_margin"
+            android:clickable="false"/>
+
+    </RelativeLayout>
+</FrameLayout>
diff --git a/app/src/main/res/layout/month_view.xml b/app/src/main/res/layout/month_view.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0294b179da448d6934c211ad33e18196b0278c9e
--- /dev/null
+++ b/app/src/main/res/layout/month_view.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.simplemobiletools.calendar.views.MonthView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/month_view"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"/>
diff --git a/app/src/main/res/layout/month_view_background.xml b/app/src/main/res/layout/month_view_background.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f7eb272d582c330b142c28b0d0b39bfeeaba7d41
--- /dev/null
+++ b/app/src/main/res/layout/month_view_background.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<View
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/month_view_background"
+    android:layout_width="0dp"
+    android:layout_height="0dp"
+    android:background="?attr/selectableItemBackground"/>
diff --git a/app/src/main/res/layout/my_checkbox.xml b/app/src/main/res/layout/my_checkbox.xml
new file mode 100644
index 0000000000000000000000000000000000000000..365519af515e0ac2aca8bb4e55bf3e18d60efa52
--- /dev/null
+++ b/app/src/main/res/layout/my_checkbox.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.simplemobiletools.commons.views.MyAppCompatCheckbox
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/my_checkbox"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="?attr/selectableItemBackground"
+    android:paddingBottom="@dimen/activity_margin"
+    android:paddingTop="@dimen/activity_margin"/>
diff --git a/app/src/main/res/layout/radio_button_with_color.xml b/app/src/main/res/layout/radio_button_with_color.xml
new file mode 100644
index 0000000000000000000000000000000000000000..581daf2a9780a18024f2b43c288a443f66979ab0
--- /dev/null
+++ b/app/src/main/res/layout/radio_button_with_color.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="horizontal">
+
+    <com.simplemobiletools.commons.views.MyCompatRadioButton
+        android:id="@+id/dialog_radio_button"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginRight="@dimen/medium_margin"
+        android:layout_toLeftOf="@+id/dialog_radio_color"
+        android:clickable="false"
+        android:paddingBottom="@dimen/activity_margin"
+        android:paddingTop="@dimen/activity_margin"/>
+
+    <ImageView
+        android:id="@+id/dialog_radio_color"
+        android:layout_width="@dimen/color_sample_size"
+        android:layout_height="@dimen/color_sample_size"
+        android:layout_alignParentEnd="true"
+        android:layout_alignParentRight="true"
+        android:layout_centerVertical="true"
+        android:layout_marginEnd="@dimen/medium_margin"
+        android:layout_marginRight="@dimen/medium_margin"
+        android:clickable="false"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/stroke_horizontal_divider.xml b/app/src/main/res/layout/stroke_horizontal_divider.xml
new file mode 100644
index 0000000000000000000000000000000000000000..924faf4a371cfdfd881a9f50de5e65b13fb97b14
--- /dev/null
+++ b/app/src/main/res/layout/stroke_horizontal_divider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ImageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_weight="1"
+    android:background="@drawable/stroke_bottom"/>
diff --git a/app/src/main/res/layout/stroke_vertical_divider.xml b/app/src/main/res/layout/stroke_vertical_divider.xml
new file mode 100644
index 0000000000000000000000000000000000000000..afca637d124297669a204652d6c7e0adf9d8978f
--- /dev/null
+++ b/app/src/main/res/layout/stroke_vertical_divider.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ImageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_weight="1"
+    android:background="@drawable/stroke_right"/>
diff --git a/app/src/main/res/layout/top_navigation.xml b/app/src/main/res/layout/top_navigation.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a3ada46ad21365241e97f614095e877977c65ec5
--- /dev/null
+++ b/app/src/main/res/layout/top_navigation.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/calendar_holder">
+
+    <ImageView
+        android:id="@+id/top_left_arrow"
+        style="@style/ArrowStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_alignBottom="@+id/top_value"
+        android:layout_alignTop="@+id/top_value"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:src="@drawable/ic_pointer_left"/>
+
+    <com.simplemobiletools.commons.views.MyTextView
+        android:id="@+id/top_value"
+        style="@style/MonthStyle"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_toLeftOf="@+id/top_right_arrow"
+        android:layout_toRightOf="@+id/top_left_arrow"
+        android:gravity="center"
+        android:paddingBottom="@dimen/normal_margin"
+        android:paddingTop="@dimen/normal_margin"
+        android:textSize="@dimen/month_text_size"/>
+
+    <ImageView
+        android:id="@+id/top_right_arrow"
+        style="@style/ArrowStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_alignBottom="@+id/top_value"
+        android:layout_alignParentRight="true"
+        android:layout_alignTop="@+id/top_value"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:src="@drawable/ic_pointer_right"/>
+
+</merge>
diff --git a/app/src/main/res/layout/top_navigation_widget.xml b/app/src/main/res/layout/top_navigation_widget.xml
new file mode 100644
index 0000000000000000000000000000000000000000..727ea8020a4821f1bab154f68c9fb99ea20a18e1
--- /dev/null
+++ b/app/src/main/res/layout/top_navigation_widget.xml
@@ -0,0 +1,53 @@
+<?xml version="1.0" encoding="utf-8"?>
+<merge
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/calendar_holder">
+
+    <ImageView
+        android:id="@+id/top_left_arrow"
+        style="@style/ArrowStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_alignBottom="@+id/top_value"
+        android:layout_alignTop="@+id/top_value"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:src="@drawable/ic_pointer_left"/>
+
+    <TextView
+        android:id="@+id/top_value"
+        style="@style/MonthStyle"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_toLeftOf="@+id/top_right_arrow"
+        android:layout_toRightOf="@+id/top_left_arrow"
+        android:gravity="center"
+        android:paddingBottom="@dimen/medium_margin"
+        android:paddingTop="@dimen/medium_margin"
+        android:textSize="@dimen/month_text_size"/>
+
+    <ImageView
+        android:id="@+id/top_right_arrow"
+        style="@style/ArrowStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_alignBottom="@+id/top_value"
+        android:layout_alignTop="@+id/top_value"
+        android:layout_toLeftOf="@+id/top_new_event"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:src="@drawable/ic_pointer_right"/>
+
+    <ImageView
+        android:id="@+id/top_new_event"
+        style="@style/ArrowStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="match_parent"
+        android:layout_alignBottom="@+id/top_value"
+        android:layout_alignParentRight="true"
+        android:layout_alignTop="@+id/top_value"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:src="@drawable/ic_plus"/>
+
+</merge>
diff --git a/app/src/main/res/layout/week_all_day_event_marker.xml b/app/src/main/res/layout/week_all_day_event_marker.xml
new file mode 100644
index 0000000000000000000000000000000000000000..27b2fb05b072f1417d3ce2b2e0e6a3484d9d28cd
--- /dev/null
+++ b/app/src/main/res/layout/week_all_day_event_marker.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="match_parent"
+    android:ellipsize="end"
+    android:maxLines="2"
+    android:padding="@dimen/tiny_margin"
+    android:textColor="@android:color/white"
+    android:textSize="@dimen/small_text_size"/>
diff --git a/app/src/main/res/layout/week_event_marker.xml b/app/src/main/res/layout/week_event_marker.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7763a4c27a500ccd9462e0d1d6f0bf77bc3219b3
--- /dev/null
+++ b/app/src/main/res/layout/week_event_marker.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<TextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:ellipsize="end"
+    android:maxLines="3"
+    android:paddingLeft="@dimen/tiny_margin"
+    android:paddingRight="@dimen/tiny_margin"
+    android:textColor="@android:color/white"
+    android:textSize="@dimen/small_text_size"/>
diff --git a/app/src/main/res/layout/week_grid_item.xml b/app/src/main/res/layout/week_grid_item.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5c792516870673ae67fd8a35514de5b1d1738579
--- /dev/null
+++ b/app/src/main/res/layout/week_grid_item.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ImageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/week_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:scaleType="centerInside"
+    android:src="@drawable/ic_plus"/>
diff --git a/app/src/main/res/layout/week_now_marker.xml b/app/src/main/res/layout/week_now_marker.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0794a7254a0ac5e94a72e42e74b0a28f372ab887
--- /dev/null
+++ b/app/src/main/res/layout/week_now_marker.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<ImageView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:src="@drawable/weekly_now"
+    android:scaleType="fitXY"/>
diff --git a/app/src/main/res/layout/weekly_view_hour_textview.xml b/app/src/main/res/layout/weekly_view_hour_textview.xml
new file mode 100644
index 0000000000000000000000000000000000000000..eee8a9950465845a6efd2a7b7d6af93b57544bfd
--- /dev/null
+++ b/app/src/main/res/layout/weekly_view_hour_textview.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.simplemobiletools.commons.views.MyTextView
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:gravity="bottom|center_horizontal"
+    android:minHeight="@dimen/weekly_view_row_height"
+    android:paddingLeft="@dimen/small_margin"
+    android:paddingRight="@dimen/small_margin"
+    android:textSize="@dimen/normal_text_size"/>
diff --git a/app/src/main/res/layout/widget_config_list.xml b/app/src/main/res/layout/widget_config_list.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0f9d6ca6055ab1c0f89b3dbe9acbac7c86d307ab
--- /dev/null
+++ b/app/src/main/res/layout/widget_config_list.xml
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:id="@+id/config_list_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_centerHorizontal="true"
+    android:layout_margin="@dimen/activity_margin">
+
+    <com.simplemobiletools.commons.views.MyRecyclerView
+        android:id="@+id/config_events_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@+id/config_bg_color"
+        android:layout_marginBottom="@dimen/activity_margin"
+        android:clipToPadding="false"
+        android:divider="@null"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingTop="@dimen/medium_margin"
+        app:layoutManager="com.simplemobiletools.commons.views.MyLinearLayoutManager"/>
+
+    <ImageView
+        android:id="@+id/config_bg_color"
+        android:layout_width="@dimen/widget_colorpicker_size"
+        android:layout_height="@dimen/widget_colorpicker_size"
+        android:layout_above="@+id/config_text_color"/>
+
+    <RelativeLayout
+        android:id="@+id/config_bg_seekbar_holder"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_alignBottom="@+id/config_bg_color"
+        android:layout_alignTop="@+id/config_bg_color"
+        android:layout_toRightOf="@+id/config_bg_color"
+        android:background="@android:color/white">
+
+        <com.simplemobiletools.commons.views.MySeekBar
+            android:id="@+id/config_bg_seekbar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:paddingLeft="@dimen/activity_margin"
+            android:paddingRight="@dimen/activity_margin"/>
+    </RelativeLayout>
+
+    <ImageView
+        android:id="@+id/config_text_color"
+        android:layout_width="@dimen/widget_colorpicker_size"
+        android:layout_height="@dimen/widget_colorpicker_size"
+        android:layout_alignParentBottom="true"/>
+
+    <Button
+        android:id="@+id/config_save"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentRight="true"
+        android:fontFamily="sans-serif-light"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:text="@string/ok"
+        android:textColor="@android:color/white"
+        android:textSize="@dimen/big_text_size"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/widget_config_monthly.xml b/app/src/main/res/layout/widget_config_monthly.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c4acbf44ad36729c1190d21fadddefcbce25a01e
--- /dev/null
+++ b/app/src/main/res/layout/widget_config_monthly.xml
@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/config_holder"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_centerHorizontal="true"
+    android:layout_margin="@dimen/activity_margin">
+
+    <include
+        android:id="@+id/config_calendar"
+        layout="@layout/fragment_month_widget_config"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_above="@+id/config_bg_color"
+        android:layout_marginBottom="@dimen/activity_margin"/>
+
+    <ImageView
+        android:id="@+id/config_bg_color"
+        android:layout_width="@dimen/widget_colorpicker_size"
+        android:layout_height="@dimen/widget_colorpicker_size"
+        android:layout_above="@+id/config_text_color"/>
+
+    <RelativeLayout
+        android:id="@+id/config_bg_seekbar_holder"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_alignBottom="@+id/config_bg_color"
+        android:layout_alignTop="@+id/config_bg_color"
+        android:layout_toRightOf="@+id/config_bg_color"
+        android:background="@android:color/white">
+
+        <com.simplemobiletools.commons.views.MySeekBar
+            android:id="@+id/config_bg_seekbar"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:paddingLeft="@dimen/activity_margin"
+            android:paddingRight="@dimen/activity_margin"/>
+    </RelativeLayout>
+
+    <ImageView
+        android:id="@+id/config_text_color"
+        android:layout_width="@dimen/widget_colorpicker_size"
+        android:layout_height="@dimen/widget_colorpicker_size"
+        android:layout_alignParentBottom="true"/>
+
+    <Button
+        android:id="@+id/config_save"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentRight="true"
+        android:fontFamily="sans-serif-light"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:text="@string/ok"
+        android:textColor="@android:color/white"
+        android:textSize="@dimen/big_text_size"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/layout/widget_event_list.xml b/app/src/main/res/layout/widget_event_list.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f789f19f06352fd36237f818e023f2c32079a1ac
--- /dev/null
+++ b/app/src/main/res/layout/widget_event_list.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/widget_event_list_holder"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+
+    <TextView
+        android:id="@+id/widget_event_list_today"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_alignBottom="@+id/widget_event_new_event"
+        android:layout_alignTop="@+id/widget_event_new_event"
+        android:layout_toLeftOf="@+id/widget_event_new_event"
+        android:ellipsize="end"
+        android:gravity="center_vertical"
+        android:maxLines="1"
+        android:paddingLeft="@dimen/activity_margin"
+        android:paddingRight="@dimen/activity_margin"
+        android:textSize="@dimen/normal_text_size"/>
+
+    <ImageView
+        android:id="@+id/widget_event_new_event"
+        style="@style/ArrowStyle"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentRight="true"
+        android:layout_alignParentTop="true"
+        android:paddingBottom="@dimen/medium_margin"
+        android:paddingLeft="@dimen/normal_margin"
+        android:paddingRight="@dimen/normal_margin"
+        android:paddingTop="@dimen/normal_margin"
+        android:scaleType="fitCenter"
+        android:src="@drawable/ic_plus"/>
+
+    <ListView
+        android:id="@+id/widget_event_list"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:layout_below="@+id/widget_event_new_event"
+        android:clipToPadding="false"
+        android:divider="@null"
+        android:dividerHeight="@dimen/medium_margin"
+        android:paddingBottom="@dimen/medium_margin"
+        android:paddingLeft="@dimen/activity_margin"/>
+
+    <TextView
+        android:id="@+id/widget_event_list_empty"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_below="@+id/widget_event_list_today"
+        android:gravity="center_horizontal"
+        android:paddingLeft="@dimen/big_margin"
+        android:paddingRight="@dimen/big_margin"
+        android:text="@string/no_upcoming_events"
+        android:textSize="@dimen/bigger_text_size"/>
+
+</RelativeLayout>
diff --git a/app/src/main/res/menu/cab_day.xml b/app/src/main/res/menu/cab_day.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6da3de41543e2e5096797a051730abc56e845d17
--- /dev/null
+++ b/app/src/main/res/menu/cab_day.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item
+        android:id="@+id/cab_share"
+        android:icon="@drawable/ic_share"
+        android:title="@string/share"
+        app:showAsAction="ifRoom"/>
+    <item
+        android:id="@+id/cab_delete"
+        android:icon="@drawable/ic_delete"
+        android:title="@string/delete"
+        app:showAsAction="ifRoom"/>
+</menu>
diff --git a/app/src/main/res/menu/cab_event_list.xml b/app/src/main/res/menu/cab_event_list.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6da3de41543e2e5096797a051730abc56e845d17
--- /dev/null
+++ b/app/src/main/res/menu/cab_event_list.xml
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item
+        android:id="@+id/cab_share"
+        android:icon="@drawable/ic_share"
+        android:title="@string/share"
+        app:showAsAction="ifRoom"/>
+    <item
+        android:id="@+id/cab_delete"
+        android:icon="@drawable/ic_delete"
+        android:title="@string/delete"
+        app:showAsAction="ifRoom"/>
+</menu>
diff --git a/app/src/main/res/menu/cab_event_type.xml b/app/src/main/res/menu/cab_event_type.xml
new file mode 100644
index 0000000000000000000000000000000000000000..af34568ba126ae557b6597f58c432948e2ca85cf
--- /dev/null
+++ b/app/src/main/res/menu/cab_event_type.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item
+        android:id="@+id/cab_delete"
+        android:icon="@drawable/ic_delete"
+        android:title="@string/delete"
+        app:showAsAction="ifRoom"/>
+</menu>
diff --git a/app/src/main/res/menu/menu_event.xml b/app/src/main/res/menu/menu_event.xml
new file mode 100644
index 0000000000000000000000000000000000000000..801cf45bc59dc6a637a08e9d4eebdfa0cf2ceefd
--- /dev/null
+++ b/app/src/main/res/menu/menu_event.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item
+        android:id="@+id/save"
+        android:icon="@drawable/ic_check"
+        android:title="@string/save"
+        app:showAsAction="ifRoom"/>
+    <item
+        android:id="@+id/delete"
+        android:icon="@drawable/ic_delete"
+        android:title="@string/delete"
+        app:showAsAction="ifRoom"/>
+    <item
+        android:id="@+id/duplicate"
+        android:icon="@drawable/ic_copy"
+        android:title="@string/duplicate_event"
+        app:showAsAction="ifRoom"/>
+    <item
+        android:id="@+id/share"
+        android:icon="@drawable/ic_share"
+        android:title="@string/share"
+        app:showAsAction="ifRoom"/>
+</menu>
diff --git a/app/src/main/res/menu/menu_event_types.xml b/app/src/main/res/menu/menu_event_types.xml
new file mode 100644
index 0000000000000000000000000000000000000000..22289485be7c7fe879bdb36a5562eeaaf057563f
--- /dev/null
+++ b/app/src/main/res/menu/menu_event_types.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item
+        android:id="@+id/add_event_type"
+        android:icon="@drawable/ic_plus"
+        android:title="@string/add_new_type"
+        app:showAsAction="ifRoom"/>
+</menu>
diff --git a/app/src/main/res/menu/menu_main.xml b/app/src/main/res/menu/menu_main.xml
new file mode 100644
index 0000000000000000000000000000000000000000..bd7261da2b823c5833d104430fcb9d831e5bb4da
--- /dev/null
+++ b/app/src/main/res/menu/menu_main.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+      xmlns:app="http://schemas.android.com/apk/res-auto">
+    <item
+        android:id="@+id/search"
+        android:icon="@drawable/ic_search"
+        android:title="@string/search"
+        app:actionViewClass="android.support.v7.widget.SearchView"
+        app:showAsAction="collapseActionView|ifRoom"/>
+    <item
+        android:id="@+id/go_to_today"
+        android:icon="@drawable/ic_today"
+        android:title="@string/go_to_today"
+        app:showAsAction="ifRoom"/>
+    <item
+        android:id="@+id/change_view"
+        android:icon="@drawable/ic_change_view"
+        android:title="@string/change_view"
+        app:showAsAction="ifRoom"/>
+    <item
+        android:id="@+id/filter"
+        android:icon="@drawable/ic_filter"
+        android:title="@string/filter_events_by_type"
+        app:showAsAction="ifRoom"/>
+    <item
+        android:id="@+id/refresh_caldav_calendars"
+        android:icon="@drawable/ic_repeat"
+        android:title="@string/refresh_caldav_calendars"
+        app:showAsAction="ifRoom"/>
+    <item
+        android:id="@+id/add_holidays"
+        android:title="@string/add_holidays"
+        app:showAsAction="never"/>
+    <item
+        android:id="@+id/add_birthdays"
+        android:title="@string/add_birthdays"
+        app:showAsAction="never"/>
+    <item
+        android:id="@+id/add_anniversaries"
+        android:title="@string/add_anniversaries"
+        app:showAsAction="never"/>
+    <item
+        android:id="@+id/import_events"
+        android:title="@string/import_events_from_ics"
+        app:showAsAction="never"/>
+    <item
+        android:id="@+id/export_events"
+        android:title="@string/export_events_to_ics"
+        app:showAsAction="never"/>
+    <item
+        android:id="@+id/settings"
+        android:title="@string/settings"
+        app:showAsAction="never"/>
+    <item
+        android:id="@+id/about"
+        android:title="@string/about"
+        app:showAsAction="never"/>
+</menu>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a77f7223840853481b08feae1422aefb4238fee9
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_orange_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml
new file mode 100644
index 0000000000000000000000000000000000000000..dab4c0c59beebb3c6d1b12bbb3510a0f8643c1a7
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_amber.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_amber_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml
new file mode 100644
index 0000000000000000000000000000000000000000..37bf057fa1a73f8e92ac5e6359bb87d75c747512
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_blue_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3e4d0696b6d1dabec4f0b4305e4f13ad6124abfc
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_blue_grey.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_blue_grey_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9786d7bf0fbf26d7d676168cb8685a999dd00346
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_brown.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_brown_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml
new file mode 100644
index 0000000000000000000000000000000000000000..afb3d0d366a31c0de1dd0865d98a07c33e91eee7
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_cyan.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_cyan_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml
new file mode 100644
index 0000000000000000000000000000000000000000..1846b81defd44a7afea127a5a6bd03e8b6c8589c
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_orange.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_deep_orange_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4152801a044b84a9504e672430fbf6cd5341516f
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_deep_purple.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_deep_purple_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e55d1092957b09f23aadb073fc6d8b5006f53b2a
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_green.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_green_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml
new file mode 100644
index 0000000000000000000000000000000000000000..40d0745039eaca4c2779d233fd5b793d7622a664
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_grey_black.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_grey_black"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml
new file mode 100644
index 0000000000000000000000000000000000000000..601d81701650cf355a3b50d544bf5372ded87b1b
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_indigo.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_indigo_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml
new file mode 100644
index 0000000000000000000000000000000000000000..01f2fead9ddee094c65fd97a7dbaea319b998946
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_blue.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_light_blue_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d37b24c443983bf1ad68fb9e858d57dc9a16c802
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_light_green.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_light_green_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9fd7bc5b29f68c6ce0e2437674e6406e0419c744
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_lime.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_lime_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d2adf9a0798029eb3268f5e70ceb46bfaaa65811
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_pink.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_pink_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml
new file mode 100644
index 0000000000000000000000000000000000000000..32c838cdd5a30306c9a6b8f76b7a79f794c264de
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_purple.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_purple_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a6e935994608818f398cb1a5c590ae41e75a87a8
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_red.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_red_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml
new file mode 100644
index 0000000000000000000000000000000000000000..18492d2825fb647f8841e57495d007a084376b6f
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_teal.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_teal_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml
new file mode 100644
index 0000000000000000000000000000000000000000..854427e0639d746884f1292d52438590f4b55502
--- /dev/null
+++ b/app/src/main/res/mipmap-anydpi-v26/ic_launcher_yellow.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<adaptive-icon xmlns:android="http://schemas.android.com/apk/res/android">
+    <background android:drawable="@color/md_yellow_700"/>
+    <foreground android:drawable="@mipmap/ic_launcher_foreground"/>
+</adaptive-icon>
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..4b751c3597d26d01d6f170e1f3c625922d51f9f9
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-hdpi/ic_launcher_amber.png
new file mode 100644
index 0000000000000000000000000000000000000000..4f88d09af725ddf276f130c57e6ce4f4ac1486d3
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_amber.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-hdpi/ic_launcher_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..58f46c6a1764efc1e6a111a75dafbafca1ee4f7d
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_blue.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..9579ef726a7465b33b67f851e7fa3b5b5e7cb822
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_blue_grey.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-hdpi/ic_launcher_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..4c7c79ae1924668d2de3fb0fdc39e9e20aa54db4
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_brown.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png
new file mode 100644
index 0000000000000000000000000000000000000000..350bc49b31c359a35482694f585fc11e2fdbb287
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_cyan.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..95ebab53b26887035ac8316c69ac0cb4ea21e86a
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_deep_orange.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..d1f25ecca1914045d2c9d0b50a54ed5d981f939a
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_deep_purple.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..eefccad6bbca064886aa4955afceb10aefb89f1b
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_green.png b/app/src/main/res/mipmap-hdpi/ic_launcher_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ed7536292a3f5f6d03dbbeb5515ef1d32a81a6b
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_green.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..fe5c5622af1b81d81d7530952666d1db40c6291e
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_grey_black.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png
new file mode 100644
index 0000000000000000000000000000000000000000..2ce96f57c4059a995934cdb19c915e95323d6c8c
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_indigo.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..b91a7f8d92ef2b329026603604fec0a2f7db5e5e
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_light_blue.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d7b41d43700dc57649555398a90024cfa1a9e9a
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_light_green.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-hdpi/ic_launcher_lime.png
new file mode 100644
index 0000000000000000000000000000000000000000..5552bf2d81e593ac8dc49b0b3038aebed6170628
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_lime.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-hdpi/ic_launcher_pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..c122729eda5dd52033b607c25ec03db33b163fcc
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_pink.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-hdpi/ic_launcher_purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..219e71961eebd36dd9687bffc90ab1acbae160b6
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_purple.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_red.png b/app/src/main/res/mipmap-hdpi/ic_launcher_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..9af2155c307ba4880a19a77f4ec663122410ff4a
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_red.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-hdpi/ic_launcher_teal.png
new file mode 100644
index 0000000000000000000000000000000000000000..bf0199a62bd66367a7e6c13cb6467b62b5092826
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_teal.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..540e7e989bab615a33bb4b9e3c2c56c277ba5011
Binary files /dev/null and b/app/src/main/res/mipmap-hdpi/ic_launcher_yellow.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..1a558481ff535d9edf927b102ef41a7c3e395624
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png
new file mode 100644
index 0000000000000000000000000000000000000000..d80daf4ab3fcca6a3dd88cc234d1aa2053ad052e
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_amber.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..d60195f4d526cac340fe8a0ab9147cf5763a9c1d
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_blue.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba983693513c1df3939cd8a116a7edcaed382106
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_blue_grey.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..1fd7a561de0c78f22fe29e403065a321f100bac3
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_brown.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png
new file mode 100644
index 0000000000000000000000000000000000000000..96434dc4a6c0ece2c1191177716d1d7425482528
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_cyan.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..890c7e589c987017a8c174a431ed0044ff7afc1e
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_orange.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..de298732563cb48776e01717588e75092303f1e5
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_deep_purple.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..5ef91e2f2f69317cb0625037728249a8d9f1f46e
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_green.png b/app/src/main/res/mipmap-mdpi/ic_launcher_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..ce1fa63850ea3aa51e1b0484f75b5f77c88b1659
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_green.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..593b9dd401f798fb639b65a5499775c242bf6fcf
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_grey_black.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png
new file mode 100644
index 0000000000000000000000000000000000000000..c8d595ae1b61544d9174b9e415122be84829a9d0
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_indigo.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..145af802855a4cdac1c78c7b9ef1e4e24383b321
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_light_blue.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..3e95286641584bd98e8a56fed6ddb9ec24ea89d3
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_light_green.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png
new file mode 100644
index 0000000000000000000000000000000000000000..a315c2f210c20f1a95aee57df7b0c8a9a390d709
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_lime.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..8df7f4114288367b7c60aec7674f234e9534ea4d
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_pink.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..6e2da0a98f7fe57c61cf5431ef91d9ea5964eb84
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_purple.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_red.png b/app/src/main/res/mipmap-mdpi/ic_launcher_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..7a9e0a1fc7264be87f2abdf1189dc430a2250dce
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_red.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png
new file mode 100644
index 0000000000000000000000000000000000000000..c20da81e6697238bafae1268c988587052d9ee13
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_teal.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..16993d1a85cf42a369ec60c7a481ced13884433c
Binary files /dev/null and b/app/src/main/res/mipmap-mdpi/ic_launcher_yellow.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..039e9a8574954090c16adc23d9c47e2ea5217417
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png
new file mode 100644
index 0000000000000000000000000000000000000000..14665cfed32322c50974833fa572d032f2515afd
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_amber.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..e847e5e1b5d81db8bd6b4f8e2572481fb8326104
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_blue.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..dbf47b25660697440cf1a0b50267e61394336d4b
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_blue_grey.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..a43d413873827461294b459dd2803accb5f429de
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_brown.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png
new file mode 100644
index 0000000000000000000000000000000000000000..73371d1151e8facd69352feabac350fb91b02062
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_cyan.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..489e49e587ae56b19df7b96c68fef38479d7dd9e
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_orange.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..52e78429ffb4c5d92c5f2e64081fec23c87e2c01
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_deep_purple.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..7131285e98cca73655b337f275c7aabb7c6261cf
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_green.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..a988553ff9151cbfc9988958861e12099d234773
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_green.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..1fdadadf919a392a55f36a5f6648a8a71f3d341e
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_grey_black.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png
new file mode 100644
index 0000000000000000000000000000000000000000..06f37dd69bce1bd38d76501ae321c7025a804876
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_indigo.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..f01ff9b73565be17d873534fa3b2efcf0489823b
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_light_blue.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..de84d76c049cdd83cc3498cdb7e2a20abddcb422
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_light_green.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png
new file mode 100644
index 0000000000000000000000000000000000000000..7755d28a04f94a6fd510028b3dbdae8925da5a05
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_lime.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..93004283720a7b37aa811f96ebf0533cc3854319
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_pink.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..f3cd54dac8b5cd75281e320fdf00d00eb1b66729
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_purple.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_red.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..9cae296242091b2849de55ad50622c995f80e2f1
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_red.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png
new file mode 100644
index 0000000000000000000000000000000000000000..63f9635297d3ccdbce58ea1068e0fc2b7c693f34
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_teal.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..462800fb806f46b98f9781531e8b6aaa5df6d50d
Binary files /dev/null and b/app/src/main/res/mipmap-xhdpi/ic_launcher_yellow.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6625e9b63fd07d53f9f9f23416c2af22662c3e1
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png
new file mode 100644
index 0000000000000000000000000000000000000000..874e2f22d092b9d3c41c4751e5cb46219c82c38e
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_amber.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..71b685e5403bb72fa480dc68b542a7b03455306d
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c81dbfa448016504c1f191c7b1c76afd293d4db
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_blue_grey.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..d070133d298448e431bd4cccbca40fe3ebbc11a1
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_brown.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png
new file mode 100644
index 0000000000000000000000000000000000000000..517ff32595a6ef421bf095a1185720502d8a5b32
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_cyan.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..45e0f6e1c4e79ccf28a0beb861411cbc81972083
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_orange.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..2108de51de469d697fffe9f3e316f14191c64189
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_deep_purple.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..f7e875a8635bd392647bc05103ec3d8d6121785b
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..c787da1d0e49b01c21a0c66a6e8673d740eef971
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_green.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..66ec41c47da9097e55fb2e308bda4084ea01838c
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_grey_black.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png
new file mode 100644
index 0000000000000000000000000000000000000000..0312e7fbab4166a16bd38dc396a1d26de028c1d1
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_indigo.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..064a4e9e8f9e815ec741beff24d9a12d4bc94222
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_blue.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..057a2db008288d335eaefca86757b16f42d9b4fd
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_light_green.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png
new file mode 100644
index 0000000000000000000000000000000000000000..9ed907b1e22b28b3b19ce31368806d082107d1b2
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_lime.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..aadae19bc98a07e16ecd346c7c3d6d0c7bb9b9cc
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_pink.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..9e4790a6d61dda7f45597c9cf7ab6d4cdadf2b02
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_purple.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..b8c5affacbe03d42f8908654605177a4b9cca178
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_red.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png
new file mode 100644
index 0000000000000000000000000000000000000000..c6a2a46ea5ff177902e85b164243cbd28a89e153
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_teal.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..ba7d84d1d247a36e252918aea139e46ae64106b3
Binary files /dev/null and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_yellow.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000000000000000000000000000000000..9f755e0f23583ce86c46bcbc9649b1d942c5f2a6
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png
new file mode 100644
index 0000000000000000000000000000000000000000..56d37258469cfec472148b5dd3d8f82c20d90b94
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_amber.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f6035c4a72c731d15f889b546385a4b523fd8b1
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png
new file mode 100644
index 0000000000000000000000000000000000000000..52b07d5e608e7abd8bbea45f9207e4b5e3d5dd0d
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_blue_grey.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png
new file mode 100644
index 0000000000000000000000000000000000000000..fee8b87b9ed869bef241f4a3358532ba993cf77c
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_brown.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png
new file mode 100644
index 0000000000000000000000000000000000000000..0253ff1eb574b4b20d08ccc13e4df95d977ce3b2
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_cyan.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png
new file mode 100644
index 0000000000000000000000000000000000000000..f35ade77f085607521809682df4997fc0cb8b78e
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_orange.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..a1f97cb3e02feb345c54931f519ba1d48061737b
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_deep_purple.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 0000000000000000000000000000000000000000..e1891ac3332641c099565eb3a667ffa15f892088
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..1000702b1f1d353b5a66f0658eaaf4594266e7b7
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_green.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png
new file mode 100644
index 0000000000000000000000000000000000000000..e70b57b415eb08e73dd0e2f2411ff0f173a25a8a
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_grey_black.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png
new file mode 100644
index 0000000000000000000000000000000000000000..875c0825e61cd870e7298262b47cf0cb1c3ff1cd
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_indigo.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png
new file mode 100644
index 0000000000000000000000000000000000000000..52e6e1cbfd2fd76f262c0bc60387be983ff3610f
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_blue.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png
new file mode 100644
index 0000000000000000000000000000000000000000..5c3c910d1b76f731c61f1a1091a948375573b2d1
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_light_green.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png
new file mode 100644
index 0000000000000000000000000000000000000000..2542de387801caa73edfc425d8b6a8a2c6cd7607
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_lime.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c2ee4705b99020ffcce6825847a191e92647ea9
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_pink.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png
new file mode 100644
index 0000000000000000000000000000000000000000..50b2e6bf07bdc5ec29f979b866a6d249d53500c6
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_purple.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png
new file mode 100644
index 0000000000000000000000000000000000000000..b81d489ec5fa6cdd57ee01d382a6ae228fdc3c53
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_red.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png
new file mode 100644
index 0000000000000000000000000000000000000000..dec581319ed0de44585237a84054a6a86d5fd77d
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_teal.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png
new file mode 100644
index 0000000000000000000000000000000000000000..7aa348f10ae27beb2012451b02f7af3e6d543cb0
Binary files /dev/null and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_yellow.png differ
diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f5a972131a1e73286bd3a616400008fedaf4b76b
--- /dev/null
+++ b/app/src/main/res/values-az/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Sadə Təqvim</string>
+    <string name="app_launcher_name">Təqvim</string>
+    <string name="change_view">Görünüşü dəyiş</string>
+    <string name="daily_view">Günlük görünüş</string>
+    <string name="weekly_view">Həftəlik görünüş</string>
+    <string name="monthly_view">Aylıq görünüş</string>
+    <string name="yearly_view">İllik görünüş</string>
+    <string name="simple_event_list">Sadə hadisələr siyahısı</string>
+    <string name="no_upcoming_events">Deyəsən yaxınlarda heçbir hadisə yoxdur.</string>
+    <string name="go_to_today">Bugünə get</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Aylıq Təqvim</string>
+    <string name="widget_list">Təqvim hadisə siyahısı</string>
+
+    <!-- Event -->
+    <string name="event">Hadisə</string>
+    <string name="edit_event">Hadisəni Dəyiş</string>
+    <string name="new_event">Yeni Hadisə</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Başlıq boş ola bilməz</string>
+    <string name="end_before_start">Hadisə başladığı gündən əvvəl ola bilməz</string>
+    <string name="event_added">Hadisə uğurla əlavə edildi</string>
+    <string name="event_updated">Hadisə uğurla yeniləndi</string>
+    <string name="filter_events_by_type">Hadisələri yazıya görə sırala</string>
+    <string name="please_fill_location">Xahiş olunur məkan parametrini doldurun ki hadisədə görünsün</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Təkrarlama</string>
+    <string name="no_repetition">Təkrarlama yoxdur</string>
+    <string name="daily">Günlük</string>
+    <string name="weekly">Həftəlik</string>
+    <string name="monthly">Aylıq</string>
+    <string name="yearly">İllik</string>
+    <string name="weeks_raw">həftələr</string>
+    <string name="months_raw">aylar</string>
+    <string name="years_raw">illər</string>
+    <string name="repeat_till">Bu vaxta qədər təkrarla</string>
+    <string name="forever">Sonsuz</string>
+    <string name="event_is_repeatable">Bu hadisə təkrarlanabilər</string>
+    <string name="selection_contains_repetition">Seçim təkrarlanan hadisələr ehtiva edir</string>
+    <string name="delete_one_only">Yalnız seçilmiş hadisəni sil</string>
+    <string name="delete_all_occurrences">Bütün hadisələri sil</string>
+    <string name="update_one_only">Yalnız seçilmiş hadisəni yenilə</string>
+    <string name="update_all_occurrences">Bütün hadisələri yenilə</string>
+    <string name="repeat_till_date">Bir vaxta qədər təkrarla</string>
+    <string name="repeat_x_times">X dəfə təkrarla</string>
+    <string name="repeat_forever">Sonsuz təkrarla</string>
+    <string name="times">təkrar sayı</string>
+    <string name="repeat">Təkrarla</string>
+    <string name="repeat_on">Təkrarlama açıqdır</string>
+    <string name="every_day">Hər gün</string>
+    <string name="selected_days">Seçilmiş günlərdə</string>
+    <string name="the_same_day">Eyni gün</string>
+    <string name="the_last_day">Son gün</string>
+    <string name="repeat_on_the_same_day_monthly">Hər ayın eyni günü təkrarla</string>
+    <string name="repeat_on_the_last_day_monthly">Hər ayın son günü təkrarla</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Təkrarla hər</string>
+    <string name="every_m">Hər</string>
+    <string name="first_m">birinci</string>
+    <string name="second_m">ikinci</string>
+    <string name="third_m">üçüncü</string>
+    <string name="fourth_m">dördüncü</string>
+    <string name="last_m">sonuncu</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repeat every</string>
+    <string name="every_f">Hər</string>
+    <string name="first_f">birinci</string>
+    <string name="second_f">ikinci</string>
+    <string name="third_f">üçüncü</string>
+    <string name="fourth_f">dördüncü</string>
+    <string name="last_f">sonuncu</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Ad günləri</string>
+    <string name="add_birthdays">Kontakt ad günlərini əlavə et</string>
+    <string name="no_birthdays">Heç bir ad günü tapılmadı</string>
+    <string name="birthdays_added">Ad günləri uğurla əlavə edildi</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">İl dönümləri</string>
+    <string name="add_anniversaries">Kontakt il dönümlərini əlavə et</string>
+    <string name="no_anniversaries">Heç bir il dönümü tapılmadı</string>
+    <string name="anniversaries_added">İl dönümləri uğurla əlavə edildi</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Xatırladıcı</string>
+    <string name="before">əvvəl</string>
+    <string name="add_another_reminder">Başqa bir xatırladıcı əlavə et</string>
+    <string name="event_reminders">Hadisə xatırladıcıları</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Hadisələri daxil et</string>
+    <string name="export_events">Hadisələri xaric et</string>
+    <string name="import_events_from_ics">.ics faylından hadisələri daxil et</string>
+    <string name="export_events_to_ics">.ics faylından hadisələri xaric et</string>
+    <string name="default_event_type">Standart hadisə tipi</string>
+    <string name="export_past_events_too">Keçmiş hadisələri də xaric et</string>
+    <string name="include_event_types">Hadisə tiplərini ehtiva et</string>
+    <string name="filename_without_ics">Fayl adı (.ics\'sız)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Başlıq</string>
+    <string name="location">Məkan</string>
+    <string name="description">Əlavələr</string>
+    <string name="all_day">Bütün-gün</string>
+
+    <!-- Weekly view -->
+    <string name="week">Həftə</string>
+
+    <!-- Event types -->
+    <string name="event_types">Hadisə tipləri</string>
+    <string name="add_new_type">Yeni tip əlavə et</string>
+    <string name="edit_type">Tipi dəyiş</string>
+    <string name="type_already_exists">Artıq eyni başlıqlı bir tip var</string>
+    <string name="color">Rəng</string>
+    <string name="regular_event">Daimi hadisə</string>
+    <string name="cannot_delete_default_type">Standart hadisə tipi silinə bilməz</string>
+    <string name="select_event_type">Hadisə tipi seç</string>
+    <string name="move_events_into_default">Dəyişdirilmiş hadisələri standart tipə sal</string>
+    <string name="remove_affected_events">Dəyişdirilmiş hadisələri tamamilə sil</string>
+    <string name="unsync_caldav_calendar">CalDAV təqvimini silmək üçün əvvəlcə onu ansinxronizasiya etməlisiniz</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Bayramlar</string>
+    <string name="add_holidays">Bayram əlavə et</string>
+    <string name="national_holidays">Milli bayramlar</string>
+    <string name="religious_holidays">Dini bayramlar</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Bəzi bayramları daxil etmək alınmadı</string>
+    <string name="importing_holidays_failed">Bayramları daxil etmək alınmadı</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Hadisə tiplərini idarə et</string>
+    <string name="start_day_at">Günə başla</string>
+    <string name="end_day_at">Günü bitir</string>
+    <string name="week_numbers">Həftə günlərini göstər</string>
+    <string name="vibrate">Xatırladıcı bildirişində vibrasiya et</string>
+    <string name="reminder_sound">Xatırladıcı səsi</string>
+    <string name="no_ringtone_picker">Zəng səsi üçün heçbir tətbiq tapılmadı</string>
+    <string name="no_ringtone_selected">Yoxdur</string>
+    <string name="day_end_before_start">Gün başlamazdan əvvəl qurtara bilməz</string>
+    <string name="caldav_sync">CalDAV sinxronizasiya</string>
+    <string name="event_lists">Hadisə siyahıları</string>
+    <string name="display_past_events">Keçmiş hadisələri göstər</string>
+    <string name="replace_description_with_location">Hadisə əlavəsini məkan ilə dəyiş</string>
+    <string name="delete_all_events">Bütün hadisələri sil</string>
+    <string name="delete_all_events_confirmation">Bütün hadisələri silmək istədiyinizə əminsiniz? Bu hadisələri və parametrlərini bütövlüklə siləcək.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Sinxronlaşdırmaq üçün təqvim seçin</string>
+    <string name="manage_synced_calendars">Sinxronlaşdırılmış təqvimləri idarə et</string>
+    <string name="store_locally_only">Yalnız yerli saxla</string>
+    <string name="refresh_caldav_calendars">CalDAV təqvimlərini təzələ</string>
+    <string name="refreshing">Təzələnir…</string>
+    <string name="refreshing_complete">Təzələmə bitdi</string>
+    <string name="editing_calendar_failed">Təqvimi dəyişmək alınmadı</string>
+    <string name="syncing">Sinxronlaşdırılır…</string>
+    <string name="synchronization_completed">Sinxronlaşma bitdi</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Bazar ertəsi</string>
+    <string name="tuesday_alt">Çərşənbə axşamı</string>
+    <string name="wednesday_alt">Çərşənbə</string>
+    <string name="thursday_alt">Cümə axşamı</string>
+    <string name="friday_alt">Cümə</string>
+    <string name="saturday_alt">Şənbə</string>
+    <string name="sunday_alt">Bazar</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Məşq</string>
+    <string name="sample_description_1">Ayaq günü</string>
+    <string name="sample_title_2">Con ilə görüş</string>
+    <string name="sample_description_2">Rockstone bağında</string>
+    <string name="sample_title_3">Kitabxana</string>
+    <string name="sample_title_4">Meri ilə nahar</string>
+    <string name="sample_description_4">Plazada</string>
+    <string name="sample_title_5">Kofe vaxtı</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Hadisələri, dəyişdirilən widgeti olan, reklam ehtiva etməyən sadə bir kalendar.</string>
+    <string name="app_long_description">
+        CalDAV sinxronizasiyalı sadə bir kalendar. Siz asanca təkrarlanan hadisələrinizi və xatırladıcılarınızı yarada bilərsiniz, hətta həftə nömrələrini də göstərə bilir.
+
+        Aylıq görünüş və hadisə siyahısı widgeti ehtiva edir hansı ki, siz oradan yazı rəngini, həmçinin, alfanı və arxa plan rəngini dəyişdirə bilərsiniz.
+
+        Lazımsız reklam və ya icazə mövcud deyil. Tamamilə açıqlisanslıdır, rəng dəyişmə parametrləri var.
+
+        Yaddaş icazəsi yalnız .ics faylından hadisələri çıxarmaq və ya daxil etmək üçün istifadə olunur.
+
+        Kontakt icazəsi yalnız kontakt ad günlərini və il dönümlərini daxil etmək üçün istifadə olunur.
+
+        Bu, böyük bir tətbiq seriyasının yalnız bir hissəsidir. Digər tətbiqləri buradan əldə edə bilərsiniz https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-br/strings.xml b/app/src/main/res/values-br/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..518b3cd920a61af6090465708a827e591a4c49c2
--- /dev/null
+++ b/app/src/main/res/values-br/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Deiziataer Eeun</string>
+    <string name="app_launcher_name">Deiziataer</string>
+    <string name="change_view">Kemmañ ar gwel</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">Gwel sizhuniek</string>
+    <string name="monthly_view">Gwel miziek</string>
+    <string name="yearly_view">Gwel bloaziek</string>
+    <string name="simple_event_list">Roll darvoudoù een</string>
+    <string name="no_upcoming_events">War a-seblant n\'ho peus darvoud ebet da zont.</string>
+    <string name="go_to_today">Mont da hiziv</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Deiziataer miziek</string>
+    <string name="widget_list">Roll darvoudoù</string>
+
+    <!-- Event -->
+    <string name="event">Darvoud</string>
+    <string name="edit_event">Embann an darvoud</string>
+    <string name="new_event">Darvoud nevez</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">N\'hall ket an titl bezañ goullo</string>
+    <string name="end_before_start">N\'hall ket an darvoud echuiñ abretoc\'h eget ma krog</string>
+    <string name="event_added">Darvoud ouzhpennet gant berzh</string>
+    <string name="event_updated">Darvoud hizivaet gant berzh</string>
+    <string name="filter_events_by_type">Silañ an darvoudoù dre rizh</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Addegouezh</string>
+    <string name="no_repetition">Addegouezh ebet</string>
+    <string name="daily">Pemdeziek</string>
+    <string name="weekly">Sizhuniek</string>
+    <string name="monthly">Miziek</string>
+    <string name="yearly">Bloaziek</string>
+    <string name="weeks_raw">sizhun</string>
+    <string name="months_raw">a vizioù</string>
+    <string name="years_raw">a vloavezhioù</string>
+    <string name="repeat_till">addegouezhout betek</string>
+    <string name="forever">Da viken</string>
+    <string name="event_is_repeatable">An darvoud a c\'hall addegouezhout</string>
+    <string name="selection_contains_repetition">Darvoudoù a c\'hall addegouezhout a zo en diuzad</string>
+    <string name="delete_one_only">Dilemel an degouezh bremanel nemetken</string>
+    <string name="delete_all_occurrences">Dilemel an holl zegouezhioù</string>
+    <string name="update_one_only">Hizivaat an degouezh diuzet hepken</string>
+    <string name="update_all_occurrences">Hizivaat an holl zegouezhioù</string>
+    <string name="repeat_till_date">Addegouezhout betek un deiziad</string>
+    <string name="repeat_x_times">Addegouezhout X gwech</string>
+    <string name="repeat_forever">Addegouezhout da viken</string>
+    <string name="times">a wechoù</string>
+    <string name="repeat">Addegouezh</string>
+    <string name="repeat_on">Addegouezh gweredekaet</string>
+    <string name="every_day">Bemdez</string>
+    <string name="selected_days">En devezhioù diuzet</string>
+    <string name="the_same_day">An hevelep devezh</string>
+    <string name="the_last_day">An devezh diwezhañ</string>
+    <string name="repeat_on_the_same_day_monthly">Addegouezh en hevelep devezh bep miz</string>
+    <string name="repeat_on_the_last_day_monthly">Addegouezh e devezh diwezhañ bep miz</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Addegouezh bep</string>
+    <string name="every_m">Bep</string>
+    <string name="first_m">kentañ</string>
+    <string name="second_m">eil</string>
+    <string name="third_m">trede</string>
+    <string name="fourth_m">pevare</string>
+    <string name="last_m">diwezhañ</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Addegouezh bep</string>
+    <string name="every_f">Bep</string>
+    <string name="first_f">kentañ</string>
+    <string name="second_f">eil</string>
+    <string name="third_f">trede</string>
+    <string name="fourth_f">pevare</string>
+    <string name="last_f">diwezhañ</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Deizioù-ha-bloaz</string>
+    <string name="add_birthdays">Ouzhpennañ deizioù-ha-bloaz an darempredoù</string>
+    <string name="no_birthdays">N\'eus ket kavet deiz-ha-bloaz bet</string>
+    <string name="birthdays_added">Ouzhpennet an deizioù-ha-bloaz gant berzh</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversaries</string>
+    <string name="add_anniversaries">Add contact anniversaries</string>
+    <string name="no_anniversaries">No anniversaries have been found</string>
+    <string name="anniversaries_added">Anniversaries added successfully</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Adc\'halv</string>
+    <string name="before">a-raok</string>
+    <string name="add_another_reminder">Ouzhpennañ un adc\'halv all</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Enporzhiañ darvoudoù</string>
+    <string name="export_events">Ezporzhiañ darvoudoù</string>
+    <string name="import_events_from_ics">Enporzhiañ darvoudoù adalek ur restr .ics</string>
+    <string name="export_events_to_ics">Ezporzhiañ darvoudoù betek ur restr .ics</string>
+    <string name="default_event_type">Doare darvoud dre ziouer</string>
+    <string name="export_past_events_too">Ezporzhiañ an darvoudoù tremenet ivez</string>
+    <string name="include_event_types">Enkorfañ doareoù an darvoudoù ivez</string>
+    <string name="filename_without_ics">Anv ar restr (hep .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Titl</string>
+    <string name="location">Lec\'hiadur</string>
+    <string name="description">Deskrivadur</string>
+    <string name="all_day">Devezh-pad</string>
+
+    <!-- Weekly view -->
+    <string name="week">Sizhun</string>
+
+    <!-- Event types -->
+    <string name="event_types">Doareoù an darvoud</string>
+    <string name="add_new_type">Ouzhpennañ un doare darvoud nevez</string>
+    <string name="edit_type">Embann an doare darvoud</string>
+    <string name="type_already_exists">Un doare darvoud gant an titl-mañ a zo anezhañ endeo</string>
+    <string name="color">Liv</string>
+    <string name="regular_event">Darvoud ordinal</string>
+    <string name="cannot_delete_default_type">N\'haller ket dilemel an doare darvoud dre ziouer</string>
+    <string name="select_event_type">Diuzit un doare darvoud</string>
+    <string name="move_events_into_default">Dilec\'hiañ an darvoudoù tizhet en doare darvoud dre ziouer</string>
+    <string name="remove_affected_events">Dilemel an darvoudoù tizhet</string>
+    <string name="unsync_caldav_calendar">Da zilemel un deiziataer CalDAV eo ret deoc\'h e zic\'houbredañ</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Devezhioù gouel</string>
+    <string name="add_holidays">Ouzhpennañ devezhioù gouel</string>
+    <string name="national_holidays">Devezhioù gouel broadel</string>
+    <string name="religious_holidays">Devezhioù gouel relijiel</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">C\'hwitadenn en ur enporzhiañ ul lodenn eus an darvoudoù</string>
+    <string name="importing_holidays_failed">C\'hwitadenn en ur enporzhiañ ul lodenn eus an devezhioù gouel</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Merañ an doareoù darvoudoù</string>
+    <string name="start_day_at">Kregiñ an devezh da</string>
+    <string name="end_day_at">Echuiñ an devezh da</string>
+    <string name="week_numbers">Diskouez niverennoù ar sizhun</string>
+    <string name="vibrate">Froumal evit ar rebuzadurioù adc\'halv</string>
+    <string name="reminder_sound">Soniri adc\'halv</string>
+    <string name="no_ringtone_picker">N\'eus bet kavet arload ebet gouest da arventennañ ur soniri</string>
+    <string name="no_ringtone_selected">Hini ebet</string>
+    <string name="day_end_before_start">An devezh n\'hall ket echuiñ abretoc\'h eget ma krog</string>
+    <string name="caldav_sync">Goubredañ CalDAV</string>
+    <string name="event_lists">Roll an darvoudoù</string>
+    <string name="display_past_events">Skrammañ darvoudoù an amzer tremenet</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Diuzañ an deiziataerioù da c\'houbredañ</string>
+    <string name="manage_synced_calendars">Merañ an deiziataerioù goubredet</string>
+    <string name="store_locally_only">Kadavi~nen un doare lec\'hel</string>
+    <string name="refresh_caldav_calendars">Azgrenaat an deiziataerioù CalDAV</string>
+    <string name="refreshing">Oc\'h azgrenaat…</string>
+    <string name="refreshing_complete">Echuet an azgrenaat</string>
+    <string name="editing_calendar_failed">C\'hwitadenn en ur embann an deiziataer</string>
+    <string name="syncing">O c\'houbredañ…</string>
+    <string name="synchronization_completed">Echuet gant ar goubredañ</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Lun</string>
+    <string name="tuesday_alt">Meurzh</string>
+    <string name="wednesday_alt">Merc\'her</string>
+    <string name="thursday_alt">Yaou</string>
+    <string name="friday_alt">Gwener</string>
+    <string name="saturday_alt">Sadorn</string>
+    <string name="sunday_alt">Sul</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Embregerezh korf</string>
+    <string name="sample_description_1">Embregerezh an divc\'harr</string>
+    <string name="sample_title_2">Emgav gant Yann</string>
+    <string name="sample_description_2">E liorzh an eskopti</string>
+    <string name="sample_title_3">Levraoueg</string>
+    <string name="sample_title_4">Merenn gant Maiwenn</string>
+    <string name="sample_description_4">Er c\'hrampouezhti</string>
+    <string name="sample_title_5">Banne kafe</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Un deiziataer eeun gant darvoudoù, widjetoù personelaus ha tamm bruderezh ebet.</string>
+    <string name="app_long_description">
+        Un deiziataer eeun gant ur goubredañ diret da zeiziataer CalDAV. Aes eo krouiñ darvoudoù a addegouezh ha lakaat adc\'halvoù. Gallout a ra ivez diskouez niverenn ar sizhunvezhioù.
+
+        Dont a ra gant ur widjet 4x4 a c\'haller adventañ ha personelaat liv an destenn, an alfa ha liv an drekleur.
+
+        N\'eus tamm bruderezh ebet ha n\'eo goulennet aotre arbennik ebet. Digor eo e darzh ha gallout a rit personelaat al livioù.
+
+        Ret eo reiñ an aotre kadaviñ evit ezporzhiañ hag enporzhiañ darvoudoù gant restroù .ics.
+
+        Ret eo reiñ an aotre Darempredoù evit enporzhiañ deizioù-ha-bloaz an darempredoù.
+
+        An arload-mañ a zo ul lodenn eus un heuliad arloadoù brasoc\'h. Gallout a rit o kavout anezho war https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e799e07c1a9de43de8218daed6e52a832f68c736
--- /dev/null
+++ b/app/src/main/res/values-cs/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Calendar</string>
+    <string name="change_view">Změnit zobrazení</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">Týdenní kalendář</string>
+    <string name="monthly_view">Měsíční kalendář</string>
+    <string name="yearly_view">Roční kalendář</string>
+    <string name="simple_event_list">Jednoduchý seznam událostí</string>
+    <string name="no_upcoming_events">Nemáte žádné nadcházející události.</string>
+    <string name="go_to_today">Přejít na dnešek</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Měsíční kalendář</string>
+    <string name="widget_list">Seznam událostí</string>
+
+    <!-- Event -->
+    <string name="event">Událost</string>
+    <string name="edit_event">Upravit událost</string>
+    <string name="new_event">Nová událost</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Doplňte název</string>
+    <string name="end_before_start">Konec události nemůže být dříve než začátek</string>
+    <string name="event_added">Událost úspěšně přidána</string>
+    <string name="event_updated">Událost úspěšně změněna</string>
+    <string name="filter_events_by_type">Filtrovat události podle typu</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Opakovaná událost</string>
+    <string name="no_repetition">Neopakuje se</string>
+    <string name="daily">každý den</string>
+    <string name="weekly">každý týden</string>
+    <string name="monthly">každý měsíc</string>
+    <string name="yearly">každý rok</string>
+    <string name="weeks_raw">týdny</string>
+    <string name="months_raw">měsíce</string>
+    <string name="years_raw">roky</string>
+    <string name="repeat_till">Opakovat do</string>
+    <string name="forever">Opakovat navždy</string>
+    <string name="event_is_repeatable">Událost se opakuje</string>
+    <string name="selection_contains_repetition">Výběr zahrnuje opakující se události</string>
+    <string name="delete_one_only">Vymazat pouze vybrané výskyty</string>
+    <string name="delete_all_occurrences">Vymazat všechny výskyty</string>
+    <string name="update_one_only">Změnit pouze vybrané výskyty</string>
+    <string name="update_all_occurrences">Změnit všechny výskyty</string>
+    <string name="repeat_till_date">Opakovat až do</string>
+    <string name="repeat_x_times">Opakovat x krát</string>
+    <string name="repeat_forever">Opakovat navždy</string>
+    <string name="times">krát</string>
+    <string name="repeat">Opakovat</string>
+    <string name="repeat_on">Opakovat</string>
+    <string name="every_day">každý den</string>
+    <string name="selected_days">ve zvolené dny</string>
+    <string name="the_same_day">ve stejný den</string>
+    <string name="the_last_day">poslední den</string>
+    <string name="repeat_on_the_same_day_monthly">Opakovat ve stejný den každý měsíc</string>
+    <string name="repeat_on_the_last_day_monthly">Opakovat poslední den v měsíci</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Opakovat každý</string>
+    <string name="every_m">každý</string>
+    <string name="first_m">první</string>
+    <string name="second_m">druhý</string>
+    <string name="third_m">třetí</string>
+    <string name="fourth_m">čtvrtý</string>
+    <string name="last_m">poslední</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Opakovat každý</string>
+    <string name="every_f">každý</string>
+    <string name="first_f">první</string>
+    <string name="second_f">druhý</string>
+    <string name="third_f">třetí</string>
+    <string name="fourth_f">čtvrtý</string>
+    <string name="last_f">poslední</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Birthdays</string>
+    <string name="add_birthdays">Add contact birthdays</string>
+    <string name="no_birthdays">No birthdays have been found</string>
+    <string name="birthdays_added">Birthdays added successfully</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversaries</string>
+    <string name="add_anniversaries">Add contact anniversaries</string>
+    <string name="no_anniversaries">No anniversaries have been found</string>
+    <string name="anniversaries_added">Anniversaries added successfully</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Připomenutí</string>
+    <string name="before">před</string>
+    <string name="add_another_reminder">Přidat další připomenutí</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Import událostí</string>
+    <string name="export_events">Export událostí</string>
+    <string name="import_events_from_ics">Importovat kalendář ze souboru .ics</string>
+    <string name="export_events_to_ics">Exportovat kalendář do souboru .ics</string>
+    <string name="default_event_type">Defaultní typ události</string>
+    <string name="export_past_events_too">Export i minulých událostí</string>
+    <string name="include_event_types">Zahrnout typy událostí</string>
+    <string name="filename_without_ics">Název souboru (bez .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Název</string>
+    <string name="location">Location</string>
+    <string name="description">Popis</string>
+    <string name="all_day">Celý den</string>
+
+    <!-- Weekly view -->
+    <string name="week">Týden</string>
+
+    <!-- Event types -->
+    <string name="event_types">Typ události</string>
+    <string name="add_new_type">Přidat nový typ</string>
+    <string name="edit_type">Upravit typ</string>
+    <string name="type_already_exists">Typ s tímto názvem již existuje</string>
+    <string name="color">Barva</string>
+    <string name="regular_event">Pravidelná událost</string>
+    <string name="cannot_delete_default_type">Výchozí typ události nelze odstranit</string>
+    <string name="select_event_type">Vyberte typ události</string>
+    <string name="move_events_into_default">Přesunout vybrané události na výchozí typ události</string>
+    <string name="remove_affected_events">Trvale odebrat vybrané události</string>
+    <string name="unsync_caldav_calendar">Chcete-li odebrat kalendář CalDAV, musíte jej desynchronizovat</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Svátky</string>
+    <string name="add_holidays">Přidat svátek</string>
+    <string name="national_holidays">Státní svátky</string>
+    <string name="religious_holidays">Církevní svátky</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Import některých událostí se nezdařil</string>
+    <string name="importing_holidays_failed">Import svátků nezdařil</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Správa typů událostí</string>
+    <string name="start_day_at">Počátek dne v</string>
+    <string name="end_day_at">Konec dne v</string>
+    <string name="week_numbers">Zobrazovat číslo týdne</string>
+    <string name="vibrate">Vibrovat</string>
+    <string name="reminder_sound">Tón oznámení</string>
+    <string name="no_ringtone_picker">Nebyla nalezena žádná aplikace, která by mohla nastavit vyzvánění</string>
+    <string name="no_ringtone_selected">žádný</string>
+    <string name="day_end_before_start">Den nemůže skončit dřív, než začne</string>
+    <string name="caldav_sync">CalDAV sync</string>
+    <string name="event_lists">Seznamy událostí</string>
+    <string name="display_past_events">Zobrazit minulé události</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Vybrat kalendáře k synchronizaci</string>
+    <string name="manage_synced_calendars">Správa synchronizovaných kalendářů</string>
+    <string name="store_locally_only">Uložit pouze lokálně</string>
+    <string name="refresh_caldav_calendars">Obnovit CalDAV kalendáře</string>
+    <string name="refreshing">Obnovuji…</string>
+    <string name="refreshing_complete">Obnovování dokončeno</string>
+    <string name="editing_calendar_failed">Editování kalendáře se nezdařilo</string>
+    <string name="syncing">Syncing…</string>
+    <string name="synchronization_completed">Sync completed</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Pondělí</string>
+    <string name="tuesday_alt">Úterý</string>
+    <string name="wednesday_alt">Středa</string>
+    <string name="thursday_alt">Čtvrtek</string>
+    <string name="friday_alt">Pátek</string>
+    <string name="saturday_alt">Sobota</string>
+    <string name="sunday_alt">Neděle</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">cvičení</string>
+    <string name="sample_description_1">Leg day</string>
+    <string name="sample_title_2">Schůzka s Janem</string>
+    <string name="sample_description_2">v restauraci</string>
+    <string name="sample_title_3">knihovna</string>
+    <string name="sample_title_4">Oběd s Marií</string>
+    <string name="sample_description_4">ve městě</string>
+    <string name="sample_title_5">na kafe</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Jednoduchý kalendář s událostmi, přizpůsobitelné widgety a žádné reklamy.</string>
+    <string name="app_long_description">
+        Jednoduchý kalendář s volitelnou synchronizací CalDAV. Můžete snadno vytvářet opakující se události a nastavovat připomenutí, můžete také zobrazovat čísla týdnů.
+
+        Obsahuje přizpůsobitelný widget 4x4, kde můžete měnit barvu textu, stejně jako alfu a barvu pozadí.
+
+        Neobsahuje žádné reklamy ani zbytečná oprávnění. Je plně opensource, umožňuje měnit barvy.
+
+        Povolení úložiště je potřeba pouze pro export nebo import událostí ze souborů .ics.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        Tato aplikace je součástí větší sady aplikací. Tyto a další aplikace najdete na https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..da02aa0f2103f89746c5187cc242b0a03a570902
--- /dev/null
+++ b/app/src/main/res/values-da/strings.xml
@@ -0,0 +1,222 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simpel kalender</string>
+    <string name="app_launcher_name">Kalender</string>
+    <string name="change_view">Skift visning</string>
+    <string name="daily_view">Daglig</string>
+    <string name="weekly_view">Ugentlig</string>
+    <string name="monthly_view">Månedlig</string>
+    <string name="yearly_view">Årlig</string>
+    <string name="simple_event_list">Begivenhedsliste</string>
+    <string name="no_upcoming_events">Du ser ikke ud til at have nogen forestående begivenheder.</string>
+    <string name="go_to_today">Gå til i dag</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Månedlig kalender</string>
+    <string name="widget_list">Begivenhedsliste</string>
+
+    <!-- Event -->
+    <string name="event">Begivenhed</string>
+    <string name="edit_event">Rediger begivenhed</string>
+    <string name="new_event">Ny begivenhed</string>
+    <string name="create_new_event">Opret en ny begivenhed</string>
+    <string name="duplicate_event">Kopier begivenhed</string>
+    <string name="title_empty">Indtast titel</string>
+    <string name="end_before_start">Begivenheden skal starte inden den slutter</string>
+    <string name="event_added">Begivenhed tilføjet</string>
+    <string name="event_updated">Begivenhed ændret</string>
+    <string name="filter_events_by_type">Filtrer begivenheder efter type</string>
+    <string name="please_fill_location">Indtast et sted der kan vises på et kort</string>
+    <string name="public_event_notification_text">En begivenhed er forestående</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Gentagelse</string>
+    <string name="no_repetition">Gentages ikke</string>
+    <string name="daily">Daglig</string>
+    <string name="weekly">Ugentlig</string>
+    <string name="monthly">Månedlig</string>
+    <string name="yearly">Årlig</string>
+    <string name="weeks_raw">uger</string>
+    <string name="months_raw">måneder</string>
+    <string name="years_raw">år</string>
+    <string name="repeat_till">Gentag indtil</string>
+    <string name="forever">Ingen slutdato</string>
+    <string name="event_is_repeatable">Begivenheden kan gentages</string>
+    <string name="selection_contains_repetition">Valget indeholder gentagne begivenheder</string>
+    <string name="delete_one_only">Slet kun denne forekomst</string>
+    <string name="delete_all_occurrences">Slet alle forekomster</string>
+    <string name="update_one_only">Opdater kun denne forekomst</string>
+    <string name="update_all_occurrences">Opdater alle forekomster</string>
+    <string name="repeat_till_date">Gentag indtil</string>
+    <string name="repeat_x_times">Antal gentagelser</string>
+    <string name="repeat_forever">For altid</string>
+    <string name="times">gange</string>
+    <string name="repeat">Gentag</string>
+    <string name="repeat_on">Gentag ugedag</string>
+    <string name="every_day">Hver dag</string>
+    <string name="selected_days">På valgte dage</string>
+    <string name="the_same_day">Samme dag</string>
+    <string name="the_last_day">Sidste dag</string>
+    <string name="repeat_on_the_same_day_monthly">Gentag på samme dato hver måned</string>
+    <string name="repeat_on_the_last_day_monthly">Gentag på månedens sidste dag</string>
+    <string name="repeat_on_the_same_day_yearly">Gentag på samme dag hvert år</string>
+    <string name="repeat_every_m">Gentag hver</string>
+    <string name="every_m">Hver</string>
+    <string name="first_m">første</string>
+    <string name="second_m">anden</string>
+    <string name="third_m">tredje</string>
+    <string name="fourth_m">fjerde</string>
+    <string name="last_m">sidste</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Gentag hver</string>
+    <string name="every_f">Hver</string>
+    <string name="first_f">første</string>
+    <string name="second_f">anden</string>
+    <string name="third_f">tredje</string>
+    <string name="fourth_f">fjerde</string>
+    <string name="last_f">sidste</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Fødselsdag</string>
+    <string name="add_birthdays">Tilføj dine kontakters fødselsdage</string>
+    <string name="no_birthdays">Der blev ikke fundet nogen fødselsdage</string>
+    <string name="birthdays_added">Fødselsdage tilføjet</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Mærkedage</string>
+    <string name="add_anniversaries">Tilføj dine kontakters mærkedage</string>
+    <string name="no_anniversaries">Der blev ikke fundet nogen mærkedage</string>
+    <string name="anniversaries_added">Mærkedage tilføjet</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Påmindelse</string>
+    <string name="before">før</string>
+    <string name="add_another_reminder">Tilføj en påmindelse mere</string>
+    <string name="event_reminders">Påmindelser</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importer begivenheder</string>
+    <string name="export_events">Eksporter begivenheder</string>
+    <string name="import_events_from_ics">Importer begivenheder fra en ics-fil</string>
+    <string name="export_events_to_ics">Eksporter begivenheder til en ics-fil</string>
+    <string name="default_event_type">Standard type begivenhed</string>
+    <string name="export_past_events_too">Eksporter også tidligere begivenheder</string>
+    <string name="include_event_types">Inkluder begivenhedstyper</string>
+    <string name="filename_without_ics">Filnavn (uden .ics)</string>
+    <string name="override_event_types">Overskriv begivenhedstyper i filen</string>
+
+    <!-- Event details -->
+    <string name="title">Titel</string>
+    <string name="location">Sted</string>
+    <string name="description">Beskrivelse</string>
+    <string name="all_day">Hele dagen</string>
+
+    <!-- Weekly view -->
+    <string name="week">Uge</string>
+
+    <!-- Event types -->
+    <string name="event_types">Begivenhedstyper</string>
+    <string name="add_new_type">Tilføj en ny type</string>
+    <string name="edit_type">Rediger type</string>
+    <string name="type_already_exists">Der er allerede en type med dette navn</string>
+    <string name="color">Farve</string>
+    <string name="regular_event">Fast begivenhed</string>
+    <string name="cannot_delete_default_type">Begivenhedstypen \'Standard\' kan ikke slettes</string>
+    <string name="select_event_type">Vælg en type begivenhed</string>
+    <string name="move_events_into_default">Flyt de berørte begivenheder til typen \'Standard\'</string>
+    <string name="remove_affected_events">Flyt de berørte begivenheder permanent</string>
+    <string name="unsync_caldav_calendar">Vil du fjerne en CalDAV-kalender skal du \'afsynkronisere\' den</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Helligdage</string>
+    <string name="add_holidays">Tilføj helligdage</string>
+    <string name="national_holidays">Nationale helligdage</string>
+    <string name="religious_holidays">Religiøse helligdage</string>
+    <string name="holidays_imported_successfully">Helligdage er importeret til typen \"Helligdage\"</string>
+    <string name="importing_some_holidays_failed">Nogle helligdages blev ikke importeret</string>
+    <string name="importing_holidays_failed">Import af helligdage mislykkedes</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Håndter begivenhedstyper</string>
+    <string name="start_day_at">Start dagen kl.</string>
+    <string name="end_day_at">Slut dagen kl.</string>
+    <string name="week_numbers">Vis ugenumre</string>
+    <string name="vibrate">Vibrer under påmindelser</string>
+    <string name="reminder_sound">Lyd til påmindelser</string>
+    <string name="no_ringtone_picker">Der blev ikke fundet en app til indstilling af ringetone</string>
+    <string name="no_ringtone_selected">Ingen</string>
+    <string name="day_end_before_start">Dagen skal starte inden den slutter!</string>
+    <string name="caldav_sync">CalDAV sync</string>
+    <string name="event_lists">Begivenhedsliste</string>
+    <string name="display_past_events">Vis overståede begivenheder</string>
+    <string name="replace_description_with_location">Erstat beskrivelse med sted</string>
+    <string name="delete_all_events">Slet alle begivenheder</string>
+    <string name="delete_all_events_confirmation">Er du sikker på at du vil slette alle begivenheder? Dine begivenhedstyper og andre indstillinger vil forblive intakte.</string>
+    <string name="show_a_grid">Vis gitter</string>
+    <string name="loop_reminders">Fortsæt påmindelser indtil jeg stopper dem</string>
+    <string name="dim_past_events">Nedton gamle begivenheder</string>
+    <string name="events">Begivenheder</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Vælg kalendere til sync</string>
+    <string name="manage_synced_calendars">Håndter synkronisering af kalendere</string>
+    <string name="store_locally_only">Gem kun lokalt</string>
+    <string name="refresh_caldav_calendars">Opdater CalDAV-kalendere</string>
+    <string name="refreshing">Opdaterer…</string>
+    <string name="refreshing_complete">Opdatering gennemført</string>
+    <string name="editing_calendar_failed">Redigering af kalenderen mislykkedes</string>
+    <string name="syncing">Synkroniserer…</string>
+    <string name="synchronization_completed">Synkronisering gennemført</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Mandag</string>
+    <string name="tuesday_alt">Tirsdag</string>
+    <string name="wednesday_alt">Onsdag</string>
+    <string name="thursday_alt">Torsdag</string>
+    <string name="friday_alt">Fredag</string>
+    <string name="saturday_alt">Lørdag</string>
+    <string name="sunday_alt">Søndag</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Workout</string>
+    <string name="sample_description_1">Ekskursion</string>
+    <string name="sample_title_2">Møde med John</string>
+    <string name="sample_description_2">Botanisk have</string>
+    <string name="sample_title_3">Biblioteket</string>
+    <string name="sample_title_4">Frokost med Marie</string>
+    <string name="sample_description_4">I byen</string>
+    <string name="sample_title_5">Kaffetid!</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Hvordan kan jeg fjerne helligdage der er importeret med funktionen \"Tilføj helligdage\"?</string>
+    <string name="faq_1_text">Helligdage oprettet på den måde er indsat under begivenhedstypen \"Helligdage\". Gå til Indstillinger -> Håndter begivenhedstyper. Efter et par sekunders pres på en type kan du slette den ved at klikke på papirkurven.</string>
+    <string name="faq_2_title">Kan jeg synkronisere mine begivenheder med Googles kalender elleer en anden kalender der understøtter CalDAV?</string>
+    <string name="faq_2_text">Ja, klik på \"CalDAV sync\" i appens indstillinger og vælg de kalendere du vil synkronisere. Det kræver dog at du har en app til at synkronisere mellem din enhed og kalenderservere.
+        Hvis du vil synkronisere en Googlekalender, kan deres officielle app klare det. For andre kalenderes vedkommende kan du bruge en 3. partsapp som for eksempel DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">En simpel reklamefri kalender med begivenheder og en widget der kan tilpasses.</string>
+    <string name="app_long_description">
+        En simpel kalender med mulighed for at synkronisere med CalDAV. Nem opsætning af gentagne begivenheder og af påmindelser.
+
+        Indeholder en skalerbar 4x4 widget med mulighed for at tilpasse tekstfarve samt alfa og farve på baggrunden.
+
+        Uden reklamer og unødvendige tilladelser. Den er helt igennem open source, og du kan selv bestemme farverne.
+
+        Adgang til at gemme er kun nødvendig i forbindelse med eksport til og import fra ics-filer.
+
+        Adgang til kontaktpersoner er nødvendig hvis du vil importere fødselsdage.
+
+        Denne app er en enkelt del af en større serie apps. Du kan finde dem alle på siden https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..56b112f42f71fb034f664bcebe9e54f4dec89885
--- /dev/null
+++ b/app/src/main/res/values-de/strings.xml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Schlichter Kalender</string>
+    <string name="app_launcher_name">Kalender</string>
+    <string name="change_view">Ansicht ändern</string>
+    <string name="daily_view">Tagesansicht</string>
+    <string name="weekly_view">Wochenansicht</string>
+    <string name="monthly_view">Monatsansicht</string>
+    <string name="yearly_view">Jahresansicht</string>
+    <string name="simple_event_list">Schlichte Terminliste</string>
+    <string name="no_upcoming_events">Keine anstehenden Termine</string>
+    <string name="go_to_today">Gehe zu Heute</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Monatskalender</string>
+    <string name="widget_list">Termin-Liste</string>
+
+    <!-- Event -->
+    <string name="event">Termin</string>
+    <string name="edit_event">Termin bearbeiten</string>
+    <string name="new_event">Neuer Termin</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Titel darf nicht leer sein</string>
+    <string name="end_before_start">Der Termin darf nicht früher enden als er beginnt</string>
+    <string name="event_added">Termin erfolgreich hinzugefügt</string>
+    <string name="event_updated">Termin erfolgreich aktualisiert</string>
+    <string name="filter_events_by_type">Sortiere Termine nach Typ</string>
+    <string name="please_fill_location">Bitte trage einen Ort ein, der auf einer Karte angezeigt werden soll</string>
+    <string name="public_event_notification_text">Ein Termin steht an</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Wiederholung</string>
+    <string name="no_repetition">Keine Wiederholung</string>
+    <string name="daily">Täglich</string>
+    <string name="weekly">Wöchentlich</string>
+    <string name="monthly">Monatlich</string>
+    <string name="yearly">Jährlich</string>
+    <string name="weeks_raw">Wochen</string>
+    <string name="months_raw">Monate</string>
+    <string name="years_raw">Jahre</string>
+    <string name="repeat_till">Wiederholen bis</string>
+    <string name="forever">unendlich</string>
+    <string name="event_is_repeatable">Termin ist wiederholbar</string>
+    <string name="selection_contains_repetition">Die Auswahl enthält Ereignisse mit Wiederholungen</string>
+    <string name="delete_one_only">Lösche nur die ausgewählte Wiederholung</string>
+    <string name="delete_all_occurrences">Lösche alle Wiederholungen</string>
+    <string name="update_one_only">Ändere nur die ausgewählte Wiederholung</string>
+    <string name="update_all_occurrences">Ändere alle Wiederholungen</string>
+    <string name="repeat_till_date">Wiederhole bis zu bestimmtem Datum</string>
+    <string name="repeat_x_times">Wiederhole x Mal</string>
+    <string name="repeat_forever">Immer wiederholen</string>
+    <string name="times">Mal</string>
+    <string name="repeat">Wiederholung</string>
+    <string name="repeat_on">Wiederholen</string>
+    <string name="every_day">Täglich</string>
+    <string name="selected_days">an ausgewählten Tagen</string>
+    <string name="the_same_day">Der gleiche Tag</string>
+    <string name="the_last_day">Der letzte Tag</string>
+    <string name="repeat_on_the_same_day_monthly">Am gleichen Tag jeden Monats wiederholen</string>
+    <string name="repeat_on_the_last_day_monthly">Am letzten Tag des Monats wiederholen</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Wiederhole jeden</string>
+    <string name="every_m">Jeden</string>
+    <string name="first_m">ersten</string>
+    <string name="second_m">zweiten</string>
+    <string name="third_m">dritten</string>
+    <string name="fourth_m">vierten</string>
+    <string name="last_m">letzten</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Wiederhole jeden</string>
+    <string name="every_f">Jeden</string>
+    <string name="first_f">ersten</string>
+    <string name="second_f">zweiten</string>
+    <string name="third_f">dritten</string>
+    <string name="fourth_f">vierten</string>
+    <string name="last_f">letzten</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Geburtstage</string>
+    <string name="add_birthdays">Kontaktgeburtstage hinzufügen</string>
+    <string name="no_birthdays">Keine Geburtstage gefunden</string>
+    <string name="birthdays_added">Geburtstage erfolgreich hinzugefügt</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Jahrestage</string>
+    <string name="add_anniversaries">Kontakt zu Jahrestagen hinzufügen</string>
+    <string name="no_anniversaries">Es wurden keine Jahrestage gefunden</string>
+    <string name="anniversaries_added">Jahrestage erfolgreich hinzugefügt</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Erinnerung</string>
+    <string name="before">vorher</string>
+    <string name="add_another_reminder">Füge eine weitere Erinnerung hinzu</string>
+    <string name="event_reminders">Ereignis Erinnerungen</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importiere Termine</string>
+    <string name="export_events">Exportiere Termine</string>
+    <string name="import_events_from_ics">Importiere Termine aus .ics Datei</string>
+    <string name="export_events_to_ics">Exportiere Termine als .ics Datei</string>
+    <string name="default_event_type">Standard-Termin-Typ</string>
+    <string name="export_past_events_too">Vergangene Termine auch exportieren</string>
+    <string name="include_event_types">Beziehe Termintypen mit ein</string>
+    <string name="filename_without_ics">Dateiname (ohne .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Titel</string>
+    <string name="location">Ort</string>
+    <string name="description">Beschreibung</string>
+    <string name="all_day">Ganztags</string>
+
+    <!-- Weekly view -->
+    <string name="week">Woche</string>
+
+    <!-- Event types -->
+    <string name="event_types">Termintypen</string>
+    <string name="add_new_type">Füge einen neuen Typ hinzu</string>
+    <string name="edit_type">Typ bearbeiten</string>
+    <string name="type_already_exists">Typ mit diesem Namen existiert bereits</string>
+    <string name="color">Farbe</string>
+    <string name="regular_event">Regelmässiger Termin</string>
+    <string name="cannot_delete_default_type">Standard Termintyp kann nicht gelöscht werden</string>
+    <string name="select_event_type">Wähle einen Termintyp</string>
+    <string name="move_events_into_default">Verschiebe betroffene Termine in den Standard Termintyp</string>
+    <string name="remove_affected_events">Lösche betroffene Termine permanent</string>
+    <string name="unsync_caldav_calendar">Um CalDAV Kalender zu entfernen, musst du diese desynchronisieren</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Feiertage</string>
+    <string name="add_holidays">Feiertage hinzufügen</string>
+    <string name="national_holidays">Nationale Feiertage</string>
+    <string name="religious_holidays">Religiöse Feiertage</string>
+    <string name="holidays_imported_successfully">Feiertage sind erfolgreich in den \"Feiertage\"-Termintyp importiert worden</string>
+    <string name="importing_some_holidays_failed">Importieren einiger Termine fehlgeschlagen</string>
+    <string name="importing_holidays_failed">Importieren von Feiertagen fehlgeschlagen</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Verwalte Termin-Typen</string>
+    <string name="start_day_at">Wochenansicht beginnt am</string>
+    <string name="end_day_at">Wochenansicht endet am</string>
+    <string name="week_numbers">Zeige Kalenderwoche an</string>
+    <string name="vibrate">Vibration bei Erinnerung</string>
+    <string name="reminder_sound">Erinnerungston</string>
+    <string name="no_ringtone_picker">Keine App zum Setzen des Klingeltons gefunden</string>
+    <string name="no_ringtone_selected">Kein Klingelton gewählt</string>
+    <string name="day_end_before_start">Terminbeginn kann nicht vor Terminende liegen</string>
+    <string name="caldav_sync">CalDAV Synchronisierung</string>
+    <string name="event_lists">Terminlisten</string>
+    <string name="display_past_events">Vergangene Termine anzeigen</string>
+    <string name="replace_description_with_location">Ersetze Terminbeschreibung mit Ort</string>
+    <string name="delete_all_events">Alle Termine löschen</string>
+    <string name="delete_all_events_confirmation">Bist du sicher, dass du alle Termine löschen willst? Deine Termintypen und Einstellungen bleiben erhalten.</string>
+    <string name="show_a_grid">Raster anzeigen</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Wähle Kalender zur Synchronisierung</string>
+    <string name="manage_synced_calendars">Verwalte synchronisierte Kalender</string>
+    <string name="store_locally_only">Nur lokal speichern</string>
+    <string name="refresh_caldav_calendars">Aktualisiere CalDAV Kalender</string>
+    <string name="refreshing">Aktualisiere…</string>
+    <string name="refreshing_complete">Aktualisierung abgeschlossen</string>
+    <string name="editing_calendar_failed">Ändern des Kalenders fehlgeschlagen</string>
+    <string name="syncing">Synchronisiere…</string>
+    <string name="synchronization_completed">Synchronisation erfolgreich</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Montag</string>
+    <string name="tuesday_alt">Dienstag</string>
+    <string name="wednesday_alt">Mittwoch</string>
+    <string name="thursday_alt">Donnerstag</string>
+    <string name="friday_alt">Freitag</string>
+    <string name="saturday_alt">Samstag</string>
+    <string name="sunday_alt">Sonntag</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Training</string>
+    <string name="sample_description_1">Beintraining</string>
+    <string name="sample_title_2">Treffen mit Paul</string>
+    <string name="sample_description_2">Im Steingarten</string>
+    <string name="sample_title_3">Bibliothek</string>
+    <string name="sample_title_4">Essen mit Marie</string>
+    <string name="sample_description_4">Im Einkaufszentrum</string>
+    <string name="sample_title_5">Kaffeepause</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Wie kann ich Feiertage löschen, die über \"Feiertage hinzufügen\" importiert wurden?</string>
+    <string name="faq_1_text">Die über diesen Weg erstellten Feiertage sind als Termin-Typ \"Feiertage\" deklariert. 
+        Du kannst in den Einstellungen -> Verwalte Termin-Typen auf den Termin-Typ gedrückt halten und über das Papierkorbsymbol löschen.</string>
+    <string name="faq_2_title">Kann ich meine Termine über Google Kalender oder andere CalDAV unterstützende Dienste synchronisieren?</string>
+    <string name="faq_2_text">Ja, aktiviere \"CalDAV Synchronisierung\" in den Einstellungen und wähle die Kalender aus, die du synchronisieren willst. 
+        Jedoch benötigst du eine separate App, die die Synchronisierung zwischen Gerät und Servern handhabt. Falls du einen Google Kalender synchronisieren willst, kann die offizielle Kalender-App dies übernehmen. 
+        Für andere Kalender benötigst du einen Synchronisierungsadapter, wie z. B. DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Ein einfacher Kalender mit personalisierbaren Widgets, ganz ohne Werbung.</string>
+    <string name="app_long_description">
+        Ein schlichter Kalender mit optionaler CalDAV Synchronisation. Du kannst ganz einfach wiederholende Termine sowie Erinnerungen erstellen, inklusive optionaler Anzeige der Kalenderwoche.
+
+        Enthält ein skalierbares 4x4 Widget, bei welchem die Schriftfarbe sowie die Hintergrundfarbe und Transparenz anpassbar sind.
+        
+        Beinhaltet keine Werbung oder unnötige Berechtigungen. Sie ist komplett Open Source, alle verwendeten Farben sind anpassbar.
+
+        Die Speicher-Berechtigung ist nur für das Importieren von .ics Termin-Dateien notwendig.
+
+        Die Kontakte-Berechtigung wird nur für das Importieren von Geburtstagen benötigt.
+
+        Diese App ist nur eine aus einer größeren Serie von schlichten Apps. Der Rest davon findet sich auf https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f477b44d1bcdc973428f7e7667d9cb71811f0768
--- /dev/null
+++ b/app/src/main/res/values-es/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Calendar</string>
+    <string name="change_view">Cambiar vista</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">Vista semanal</string>
+    <string name="monthly_view">Vista mensual</string>
+    <string name="yearly_view">Vista anual</string>
+    <string name="simple_event_list">Lista de eventos sencilla</string>
+    <string name="no_upcoming_events">Parece que no tienes ningún evento próximo.</string>
+    <string name="go_to_today">Ir al día de hoy</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Calendario mensual</string>
+    <string name="widget_list">Lista de eventos del calendario</string>
+
+    <!-- Event -->
+    <string name="event">Evento</string>
+    <string name="edit_event">Editar evento</string>
+    <string name="new_event">Nuevo evento</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">El título no puede estar vacío</string>
+    <string name="end_before_start">El evento no puede acabar antes de iniciarse</string>
+    <string name="event_added">El evento se ha añadido con éxito</string>
+    <string name="event_updated">El evento se ha actualizado con éxito</string>
+    <string name="filter_events_by_type">Filtrar eventos según tipo</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Repetición</string>
+    <string name="no_repetition">Sin repetición</string>
+    <string name="daily">Diariamente</string>
+    <string name="weekly">Semanalmente</string>
+    <string name="monthly">Mensualmente</string>
+    <string name="yearly">Anualmente</string>
+    <string name="weeks_raw">semanas</string>
+    <string name="months_raw">meses</string>
+    <string name="years_raw">años</string>
+    <string name="repeat_till">Repetir hasta</string>
+    <string name="forever">Siempre</string>
+    <string name="event_is_repeatable">Este evento se repite</string>
+    <string name="selection_contains_repetition">La selección contiene repetición de eventos</string>
+    <string name="delete_one_only">Eliminar sólo el evento seleccionado</string>
+    <string name="delete_all_occurrences">Eliminar todos los eventos</string>
+    <string name="update_one_only">Actualizar sólo el evento seleccionado</string>
+    <string name="update_all_occurrences">Actualizar todos los eventos</string>
+    <string name="repeat_till_date">Repetir hasta la fecha</string>
+    <string name="repeat_x_times">Repetir x veces</string>
+    <string name="repeat_forever">Repetir por siempre</string>
+    <string name="times">veces</string>
+    <string name="repeat">Repetir</string>
+    <string name="repeat_on">Repertir los</string>
+    <string name="every_day">Cada día</string>
+    <string name="selected_days">En los días seleccionados</string>
+    <string name="the_same_day">El mismo día</string>
+    <string name="the_last_day">El último día</string>
+    <string name="repeat_on_the_same_day_monthly">Repetir en el mismo día cada mes</string>
+    <string name="repeat_on_the_last_day_monthly">Repetir en el último día del mes</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Repetir cada</string>
+    <string name="every_m">Cada</string>
+    <string name="first_m">primero</string>
+    <string name="second_m">segundo</string>
+    <string name="third_m">tercero</string>
+    <string name="fourth_m">cuarto</string>
+    <string name="last_m">último</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repetir cada</string>
+    <string name="every_f">Cada</string>
+    <string name="first_f">primero</string>
+    <string name="second_f">segundo</string>
+    <string name="third_f">tercero</string>
+    <string name="fourth_f">cuarto</string>
+    <string name="last_f">último</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Cumpleaños</string>
+    <string name="add_birthdays">Añadir cumpleaños de contactos</string>
+    <string name="no_birthdays">No se han encontrado cumpleaños</string>
+    <string name="birthdays_added">Los cumpleaños se han añadido correctamente</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Aniversarios</string>
+    <string name="add_anniversaries">Añadir aniversarios de contactos</string>
+    <string name="no_anniversaries">No se han encontrado aniversarios</string>
+    <string name="anniversaries_added">Los aniversarios se han añadido correctamente</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Recordatorio</string>
+    <string name="before">antes</string>
+    <string name="add_another_reminder">Agregar otro recordatorio</string>
+    <string name="event_reminders">Recordatorio de eventos</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importar eventos</string>
+    <string name="export_events">Exportar eventos</string>
+    <string name="import_events_from_ics">Importar eventos desde un archivo .ics</string>
+    <string name="export_events_to_ics">Exportar eventos desde un archivo .ics</string>
+    <string name="default_event_type">Tipo de evento predeterminado</string>
+    <string name="export_past_events_too">Exportar también eventos pasados</string>
+    <string name="include_event_types">Incluir tipos de evento</string>
+    <string name="filename_without_ics">Nombre del archivo (sin .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Título</string>
+    <string name="location">Ubicación</string>
+    <string name="description">Descripción</string>
+    <string name="all_day">Todo el día</string>
+
+    <!-- Weekly view -->
+    <string name="week">Semana</string>
+
+    <!-- Event types -->
+    <string name="event_types">Tipos de eventos</string>
+    <string name="add_new_type">Agregar un nuevo tipo de evento</string>
+    <string name="edit_type">Editar tipo de evento</string>
+    <string name="type_already_exists">Ya existe un tipo de evento con este nombre</string>
+    <string name="color">Color</string>
+    <string name="regular_event">Evento regular</string>
+    <string name="cannot_delete_default_type">No se puede eliminar el tipo de evento predeterminado</string>
+    <string name="select_event_type">Seleccione un tipo de evento</string>
+    <string name="move_events_into_default">Establecer eventos seleccionados como tipo de evento predeterminado</string>
+    <string name="remove_affected_events">Eliminar permanentemente los eventos seleccionados</string>
+    <string name="unsync_caldav_calendar">Para eliminar un calendario CalDAV debes parar la sincronización</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Días festivos</string>
+    <string name="add_holidays">Añadir festivos</string>
+    <string name="national_holidays">Fiestas nacionales</string>
+    <string name="religious_holidays">Fiestas regionales</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Ha habido un fallo al importar eventos</string>
+    <string name="importing_holidays_failed">Ha habido un fallo al importar días festivos</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Gestionar tipos de eventos</string>
+    <string name="start_day_at">El día en la vista semanal comienza a las</string>
+    <string name="end_day_at">El día en la vista semanal finaliza a las</string>
+    <string name="week_numbers">Mostrar los números de la semana</string>
+    <string name="vibrate">Vibración en notificación de recordatorio</string>
+    <string name="reminder_sound">Sonido de recordatorio</string>
+    <string name="no_ringtone_picker">No se ha encontrado ninguna aplicación capaz de establecer el tono de llamada</string>
+    <string name="no_ringtone_selected">Ninguno</string>
+    <string name="day_end_before_start">El día no puede terminar antes de que comience</string>
+    <string name="caldav_sync">Sincronizar CalDAV</string>
+    <string name="event_lists">Listas de eventos</string>
+    <string name="display_past_events">Mostrar eventos pasados</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Selecciona los calendarios a sincronizar</string>
+    <string name="manage_synced_calendars">Gestionar los calendarios sincronizados</string>
+    <string name="store_locally_only">Almacenar sólo en local</string>
+    <string name="refresh_caldav_calendars">Actualizar los calendarios CalDAV</string>
+    <string name="refreshing">Actualizando…</string>
+    <string name="refreshing_complete">Actualización completada</string>
+    <string name="editing_calendar_failed">Edición de calendario fallida</string>
+    <string name="syncing">Sincronizando…</string>
+    <string name="synchronization_completed">Sincronización completa</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Lunes</string>
+    <string name="tuesday_alt">Martes</string>
+    <string name="wednesday_alt">Miércoles</string>
+    <string name="thursday_alt">Jueves</string>
+    <string name="friday_alt">Viernes</string>
+    <string name="saturday_alt">Sábado</string>
+    <string name="sunday_alt">Domingo</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Ejercicio</string>
+    <string name="sample_description_1">Ejercitar piernas</string>
+    <string name="sample_title_2">Reunión con John</string>
+    <string name="sample_description_2">En el jardín de Rockstone</string>
+    <string name="sample_title_3">Biblioteca</string>
+    <string name="sample_title_4">Almuerzo con María</string>
+    <string name="sample_description_4">En la plaza</string>
+    <string name="sample_title_5">Hora de café</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Un sencillo calendario con eventos, widget personalizable y sin anuncios.</string>
+    <string name="app_long_description">
+        Un simple calendario con sincronización opcional con CalDAV. Puedes crear fácilmente eventos que se repitan y configurar recordatorios, o que te muestre los días de la semana.
+
+        Contiene un widget 4x4 redimensionable donde puedes personalizar el color del texto, así como la transparencia y el color del fondo.
+
+        No contiene anuncios ni permisos innecesarios. Es completamente de código abierto, permite personalizar los colores.
+
+        El permiso de almacenamiento sólo se necesita para exportar o importar eventos desde archivos .ics.
+
+        El permiso de contactos se usa sólo para importar los cumpleaños de los contactos.
+
+        Esta aplicación es sólo una parte de una mayor serie de aplicaciones. Puede encontrar el resto en https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a3171e9d998bee1f079e6c5902a3e5c7e1cc1c11
--- /dev/null
+++ b/app/src/main/res/values-fr/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Calendrier simple</string>
+    <string name="app_launcher_name">Calendrier</string>
+    <string name="change_view">Changer de vue</string>
+    <string name="daily_view">Vue quotidienne</string>
+    <string name="weekly_view">Vue hebdomadaire</string>
+    <string name="monthly_view">Vue mensuelle</string>
+    <string name="yearly_view">Vue annuelle</string>
+    <string name="simple_event_list">Liste simple d\'événements</string>
+    <string name="no_upcoming_events">Il semblerait que vous n\'ayez aucun événement à venir.</string>
+    <string name="go_to_today">Aller à aujourd\'hui</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Calendrier mensuel</string>
+    <string name="widget_list">Liste d\'événements du calendrier</string>
+
+    <!-- Event -->
+    <string name="event">Événement</string>
+    <string name="edit_event">Éditer l\'événement</string>
+    <string name="new_event">Nouvel événement</string>
+    <string name="create_new_event">Créer un nouvel événement</string>
+    <string name="duplicate_event">Evénement en double</string>
+    <string name="title_empty">Le titre ne peut pas être vide</string>
+    <string name="end_before_start">L\'événement ne peut pas se terminer plus tôt qu\'il ne commence</string>
+    <string name="event_added">Événement ajouté avec succès</string>
+    <string name="event_updated">Événement ajouté avec succès</string>
+    <string name="filter_events_by_type">Filtrer les événements par type</string>
+    <string name="please_fill_location">Veuillez remplir un emplacement pour être affiché sur une carte</string>
+    <string name="public_event_notification_text">Un événement est à venir</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Répétition</string>
+    <string name="no_repetition">Pas de répétition</string>
+    <string name="daily">Quotidienne</string>
+    <string name="weekly">Hebdomadaire</string>
+    <string name="monthly">Mensuelle</string>
+    <string name="yearly">Annuelle</string>
+    <string name="weeks_raw">semaines</string>
+    <string name="months_raw">mois</string>
+    <string name="years_raw">années</string>
+    <string name="repeat_till">Répéter jusqu\'à</string>
+    <string name="forever">Pour toujours</string>
+    <string name="event_is_repeatable">L\'événement est répétable</string>
+    <string name="selection_contains_repetition">La sélection contient des événements avec répétition</string>
+    <string name="delete_one_only">Supprimer seulement l\'occurrence sélectionnée</string>
+    <string name="delete_all_occurrences">Supprimer toutes les occurrences</string>
+    <string name="update_one_only">Mettre à jour seulement l\'occurrence sélectionnée</string>
+    <string name="update_all_occurrences">Mettre à jour toutes les occurrences</string>
+    <string name="repeat_till_date">Répéter jusqu\'à une date</string>
+    <string name="repeat_x_times">Répéter x fois</string>
+    <string name="repeat_forever">Répéter éternellement</string>
+    <string name="times">fois</string>
+    <string name="repeat">Répéter</string>
+    <string name="repeat_on">Répéter le</string>
+    <string name="every_day">Chaque jour</string>
+    <string name="selected_days">Les jours sélectionnés</string>
+    <string name="the_same_day">Le même jour</string>
+    <string name="the_last_day">Le dernier jour</string>
+    <string name="repeat_on_the_same_day_monthly">Répéter le même jour de chaque mois</string>
+    <string name="repeat_on_the_last_day_monthly">Répéter le dernier jour de chaque mois</string>
+    <string name="repeat_on_the_same_day_yearly">Répéter le même jour chaque année</string>
+    <string name="repeat_every_m">Répéter chaque</string>
+    <string name="every_m">Chaque</string>
+    <string name="first_m">premier</string>
+    <string name="second_m">deuxième</string>
+    <string name="third_m">troisième</string>
+    <string name="fourth_m">quatrième</string>
+    <string name="last_m">dernier</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Répéter chaque</string>
+    <string name="every_f">Chaque</string>
+    <string name="first_f">premier</string>
+    <string name="second_f">deuxième</string>
+    <string name="third_f">troisième</string>
+    <string name="fourth_f">quatrième</string>
+    <string name="last_f">dernier</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Anniversaires</string>
+    <string name="add_birthdays">Ajouter les anniversaires des contacts</string>
+    <string name="no_birthdays">Aucun anniversaire n\'a été trouvé</string>
+    <string name="birthdays_added">Anniversaires ajoutés avec succès</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversaires d\'évènements</string>
+    <string name="add_anniversaries">Ajouter des anniversaires d\'évènements de contact</string>
+    <string name="no_anniversaries">Aucun anniversaire d\'évènements n\'a été trouvé</string>
+    <string name="anniversaries_added">Anniversaires d\'évènements ajoutés avec succès</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Rappel</string>
+    <string name="before">avant</string>
+    <string name="add_another_reminder">Ajouter un autre rappel</string>
+    <string name="event_reminders">Rappels d\'événements</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importer des événements</string>
+    <string name="export_events">Exporter des événements</string>
+    <string name="import_events_from_ics">Importer des événements depuis un fichier .ics</string>
+    <string name="export_events_to_ics">Exporter des événements vers un fichier .ics</string>
+    <string name="default_event_type">Type d\'événement par défaut</string>
+    <string name="export_past_events_too">Exporter aussi les événements passés</string>
+    <string name="include_event_types">Inclure les types d\'événement</string>
+    <string name="filename_without_ics">Nom de fichier (sans .ics)</string>
+    <string name="override_event_types">Remplacer les types d'événement dans le fichier</string>
+
+    <!-- Event details -->
+    <string name="title">Titre</string>
+    <string name="location">Lieu</string>
+    <string name="description">Description</string>
+    <string name="all_day">Journée</string>
+
+    <!-- Weekly view -->
+    <string name="week">Semaine</string>
+
+    <!-- Event types -->
+    <string name="event_types">Type d\'événement</string>
+    <string name="add_new_type">Ajouter un nouveau type</string>
+    <string name="edit_type">Éditer le type</string>
+    <string name="type_already_exists">Un type avec ce titre existe déjà</string>
+    <string name="color">Couleur</string>
+    <string name="regular_event">Événement ordinaire</string>
+    <string name="cannot_delete_default_type">Le type d\'événement par défaut ne peut pas être supprimé</string>
+    <string name="select_event_type">Sélectionner un type d\'événement</string>
+    <string name="move_events_into_default">Déplacer les événements affectés dans le type d\'événement par défaut</string>
+    <string name="remove_affected_events">Supprimer de façon permanente les événements affectés</string>
+    <string name="unsync_caldav_calendar">Pour supprimer un calendrier CalDAV vous devez le désynchroniser</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Jours fériés</string>
+    <string name="add_holidays">Ajouter des jours fériés</string>
+    <string name="national_holidays">Jours fériés nationaux</string>
+    <string name="religious_holidays">Jours fériés religieux</string>
+    <string name="holidays_imported_successfully">Les vacances ont été importées avec succès dans le type d\'événement \"Vacances\"</string>
+    <string name="importing_some_holidays_failed">L\'import de certains événements a échoué</string>
+    <string name="importing_holidays_failed">L\'import des jours fériés a échoué</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Gestion des types d\'événements</string>
+    <string name="start_day_at">Jour de début de la vue hebdomadaire</string>
+    <string name="end_day_at">Jour de fin de la vue hebdomadaire</string>
+    <string name="week_numbers">Afficher les numéros de semaine</string>
+    <string name="vibrate">Vibrer à la notification de rappel</string>
+    <string name="reminder_sound">Son de rappel</string>
+    <string name="no_ringtone_picker">Aucune application capable de configurer la sonnerie trouvée</string>
+    <string name="no_ringtone_selected">Aucune</string>
+    <string name="day_end_before_start">Le jour ne peut pas se terminer plus tôt qu\'il ne débute</string>
+    <string name="caldav_sync">Synchronisation CalDAV</string>
+    <string name="event_lists">Listes d\'événements</string>
+    <string name="display_past_events">Afficher les événements du passé</string>
+    <string name="replace_description_with_location">Remplacer la description de l\'événement par l\'emplacement</string>
+    <string name="delete_all_events">Supprimer tous les événements</string>
+    <string name="delete_all_events_confirmation">Êtes-vous sûr de vouloir supprimer tous les événements ? Cela laissera vos types d\'événements et autres paramètres intacts.</string>
+    <string name="show_a_grid">Afficher une grille</string>
+    <string name="loop_reminders">Boucles de rappel jusqu\'à ce qu\'il soit rejeté</string>
+    <string name="dim_past_events">Diminuer l\'affichage des événements passés</string>
+    <string name="events">Evénements</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Seléctionner les calendriers à synchroniser</string>
+    <string name="manage_synced_calendars">Gérer les calendriers synchronisés</string>
+    <string name="store_locally_only">Stocker uniquement localement</string>
+    <string name="refresh_caldav_calendars">Rafraîchir les calendriers CalDAV</string>
+    <string name="refreshing">Rafraîchissement…</string>
+    <string name="refreshing_complete">Rafraîchissement terminé</string>
+    <string name="editing_calendar_failed">Édition du calendrier échouée</string>
+    <string name="syncing">Synchronisation…</string>
+    <string name="synchronization_completed">Synchronisation terminée</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Lundi</string>
+    <string name="tuesday_alt">Mardi</string>
+    <string name="wednesday_alt">Mercredi</string>
+    <string name="thursday_alt">Jeudi</string>
+    <string name="friday_alt">Vendredi</string>
+    <string name="saturday_alt">Samedi</string>
+    <string name="sunday_alt">Dimanche</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Entraînement</string>
+    <string name="sample_description_1">Jour des jambes</string>
+    <string name="sample_title_2">Rendez-vous avec John</string>
+    <string name="sample_description_2">Au jardin Rockstone</string>
+    <string name="sample_title_3">Librairie</string>
+    <string name="sample_title_4">Déjeuner avec Mary</string>
+    <string name="sample_description_4">Dans la Place</string>
+    <string name="sample_title_5">Heure du café</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Comment supprimer les congés importés par le bouton « Ajouter des jours fériés » ?</string>
+	<string name="faq_1_text">Les jours fériés ajoutés de cette manière sont du type « Jours fériés ». Vous pouvez aller dans « Paramètres » puis « Gestion des types d\'événements », 
+		faire un appui long sur « Jours fériés » et les supprimer en appuyant sur la corbeille.</string>
+    <string name="faq_2_title">Puis-je synchroniser mes événements via Google Agenda, ou tout autre service proposant la synchronisation CalDAV ?</string>
+	<string name="faq_2_text">Oui, il faut juste activer l\'option « Synchronisation CalDAV » dans les paramètres de l\'application puis choisir les calendriers à synchroniser. Une application tierce pour gérer la synchronisation entre votre appareil et les serveurs sera par contre nécessaire. 
+		Dans le cas d\'un calendrier Google Agenda, l\'application officielle fera l\'affaire. Pour les autres calendriers, il vous faudra une application comme DAVdroid par exemple.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Un calendrier simple avec événements, widget personnalisable, sans publicité.</string>
+    <string name="app_long_description">
+        Un calendrier hors ligne sans aucune autre intégration de calendrier. Vous pouvez aisément créer des événements récurrents et configurer des rappels, il est aussi possible d\'afficher les numéros de semaine.
+
+        Contient un widget 4x4 redimensionnable où vous pouvez personnaliser la couleur du texte, ainsi que l\'alpha et la couleur de l\'arrière plan.
+
+        Ne contient pas de publicités ou de permissions inutiles. Complètement opensource, fournit une personnalisation des couleurs.
+
+        La permission d\'accès au stockage est necéssaire uniquement pour importer des événements depuis des fichiers .ics.
+
+        La permission Contacts ne sert qu\'à importer l\'anniversaire de vos contacts.
+
+        Cette application est juste une pièce d\'une plus grosse série d\'applications. Vous pouvez trouver le reste de celles-ci à https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..18cba5b3f21585152872a8c3224a22f77128fc62
--- /dev/null
+++ b/app/src/main/res/values-gl/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Calendario</string>
+    <string name="change_view">Cambiar vista</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">Vista semanal</string>
+    <string name="monthly_view">Vista mensual</string>
+    <string name="yearly_view">Vista anual</string>
+    <string name="simple_event_list">Lista de eventos simple</string>
+    <string name="no_upcoming_events">Semella que non ten ningún evento próximo.</string>
+    <string name="go_to_today">Ir ao día de hoxe</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Calendario mensual</string>
+    <string name="widget_list">Lista de eventos do calendario</string>
+
+    <!-- Event -->
+    <string name="event">Evento</string>
+    <string name="edit_event">Editar evento</string>
+    <string name="new_event">Novo evento</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">O título non pode estar baldeiro</string>
+    <string name="end_before_start">O evento non pode rematar antes de iniciarse</string>
+    <string name="event_added">Evento engadido con éxito</string>
+    <string name="event_updated">O evento foi actualizado correctamente</string>
+    <string name="filter_events_by_type">Filtrar eventos por tipo</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Repetición</string>
+    <string name="no_repetition">Sin repetición</string>
+    <string name="daily">Diariamente</string>
+    <string name="weekly">Semanalmente</string>
+    <string name="monthly">Mensualmente</string>
+    <string name="yearly">Anualmente</string>
+    <string name="weeks_raw">semanas</string>
+    <string name="months_raw">meses</string>
+    <string name="years_raw">anos</string>
+    <string name="repeat_till">Repetir ata</string>
+    <string name="forever">Sempre</string>
+    <string name="event_is_repeatable">O evento é repetible</string>
+    <string name="selection_contains_repetition">A seleción contén eventos recurrentes</string>
+    <string name="delete_one_only">Eliminar só o evento selecionado</string>
+    <string name="delete_all_occurrences">Eliminar todos os eventos</string>
+    <string name="update_one_only">Actualizar só o evento selecionado</string>
+    <string name="update_all_occurrences">Actualizar todos os eventos</string>
+    <string name="repeat_till_date">Repetir ata a data</string>
+    <string name="repeat_x_times">Repetir x veces</string>
+    <string name="repeat_forever">Repetir por sempre</string>
+    <string name="times">veces</string>
+    <string name="repeat">Repetir</string>
+    <string name="repeat_on">Repertir os</string>
+    <string name="every_day">Cada día</string>
+    <string name="selected_days">Nos días selecionados</string>
+    <string name="the_same_day">O mismo día</string>
+    <string name="the_last_day">O último día</string>
+    <string name="repeat_on_the_same_day_monthly">Repetir no mismo día cada mes</string>
+    <string name="repeat_on_the_last_day_monthly">Repetir no último día do mes</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Repetir cada</string>
+    <string name="every_m">Cada</string>
+    <string name="first_m">primeiro</string>
+    <string name="second_m">segundo</string>
+    <string name="third_m">terceiro</string>
+    <string name="fourth_m">cuarto</string>
+    <string name="last_m">último</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repetir cada</string>
+    <string name="every_f">Cada</string>
+    <string name="first_f">primero</string>
+    <string name="second_f">segundo</string>
+    <string name="third_f">tercero</string>
+    <string name="fourth_f">cuarto</string>
+    <string name="last_f">último</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Cumpleanos</string>
+    <string name="add_birthdays">Engadir cumpleanos de contactos</string>
+    <string name="no_birthdays">Non se atoparon cumpleanos</string>
+    <string name="birthdays_added">Engadíronse correctamente os cumpleanos</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Aniversarios</string>
+    <string name="add_anniversaries">Engadir aniversarios de contactos</string>
+    <string name="no_anniversaries">Non se atoparon aniversarios</string>
+    <string name="anniversaries_added">Engadíronse correctamente os aniversarios</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Recordatorio</string>
+    <string name="before">antes</string>
+    <string name="add_another_reminder">Engadir outro recordatorio</string>
+    <string name="event_reminders">Recordatorios de eventos</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importar eventos</string>
+    <string name="export_events">Exportar eventos</string>
+    <string name="import_events_from_ics">Importar eventos desde un ficheiro .ics</string>
+    <string name="export_events_to_ics">Exportar eventos desde un ficheiro .ics</string>
+    <string name="default_event_type">Tipo de evento predeterminado</string>
+    <string name="export_past_events_too">Exportar tamén eventos pasados</string>
+    <string name="include_event_types">Incluír tipos de eventos</string>
+    <string name="filename_without_ics">Nome de ficheiro (sin .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Título</string>
+    <string name="location">Localización</string>
+    <string name="description">Descrición</string>
+    <string name="all_day">Todo o día</string>
+
+    <!-- Weekly view -->
+    <string name="week">Semana</string>
+
+    <!-- Event types -->
+    <string name="event_types">Tipos de eventos</string>
+    <string name="add_new_type">Engadir un novo tipo de evento</string>
+    <string name="edit_type">Editar tipo de evento</string>
+    <string name="type_already_exists">Xa existe un tipo de evento con este nome</string>
+    <string name="color">Cor</string>
+    <string name="regular_event">Evento regular</string>
+    <string name="cannot_delete_default_type">Non se pode eliminar o tipo de evento predeterminado</string>
+    <string name="select_event_type">Seleccione un tipo de evento</string>
+    <string name="move_events_into_default">Mover os eventos afectados ao tipo de evento por omisión</string>
+    <string name="remove_affected_events">Eliminar permanentemente os eventos afectadosPermanently remove affected events</string>
+    <string name="unsync_caldav_calendar">Para eliminar un calendario CalDAV antes debe deixar de sincronizalo</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Festivo</string>
+    <string name="add_holidays">Engadir días festivos</string>
+    <string name="national_holidays">Festivo nacional</string>
+    <string name="religious_holidays">Festas relixiosas</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Fallou a importación de algúns eventos</string>
+    <string name="importing_holidays_failed">Fallou a importación de días festivos</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Xestionar tipos de eventos</string>
+    <string name="start_day_at">Na vista xeral o día comeza as</string>
+    <string name="end_day_at">O día na vista semanal remata as</string>
+    <string name="week_numbers">Mostrar os números da semana</string>
+    <string name="vibrate">Vibrar coa notificación de recordatorio</string>
+    <string name="reminder_sound">Son de recordatorio</string>
+    <string name="no_ringtone_picker">Non se atopou ningunha aplicación capaz de establecer o ton de aviso</string>
+    <string name="no_ringtone_selected">Ningún</string>
+    <string name="day_end_before_start">O día non puede rematar antes de que comece</string>
+    <string name="caldav_sync">CalDAV sincr.</string>
+    <string name="event_lists">Listas de eventos</string>
+    <string name="display_past_events">Mostrar eventos do pasado</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Escolla calendarios a sincronizar</string>
+    <string name="manage_synced_calendars">Xestionar calendarios sincronizados</string>
+    <string name="store_locally_only">Gardar só localmente</string>
+    <string name="refresh_caldav_calendars">Actualizar calendarios CalDAV</string>
+    <string name="refreshing">Actualizando…</string>
+    <string name="refreshing_complete">Actualización completa</string>
+    <string name="editing_calendar_failed">Fallou a edición do calendario</string>
+    <string name="syncing">Sincronizando…</string>
+    <string name="synchronization_completed">Sincronización completa</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Segunda</string>
+    <string name="tuesday_alt">Terceira</string>
+    <string name="wednesday_alt">Cuarta</string>
+    <string name="thursday_alt">Quinta</string>
+    <string name="friday_alt">Sexta</string>
+    <string name="saturday_alt">Sábado</string>
+    <string name="sunday_alt">Domingo</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Exercicio</string>
+    <string name="sample_description_1">Correr un pouco</string>
+    <string name="sample_title_2">Reunión con Xan</string>
+    <string name="sample_description_2">No paseo do León</string>
+    <string name="sample_title_3">Biblioteca</string>
+    <string name="sample_title_4">Xantar con Aira</string>
+    <string name="sample_description_4">Na plaza</string>
+    <string name="sample_title_5">Hora do café</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Un calendario simple con eventos, widget personalizable e sin anuncios.</string>
+    <string name="app_long_description">
+        Un calendario que funciona sin precisar sincronización CalDAV. Pode crear fácilmente eventos recurrentes e configurar recordatorios. También mostra o número de semana.
+
+        Ten un widget 4x4 de tamaño variable no que pode personalizar a cor do texto, así como a transparencia e cor de fondo.
+
+        Non contén anuncios ni permisos innecesarios. É totalmente de código abierto e tamén proporciona un decorado oscuro.
+
+        O permiso ao Almacenamento só é preciso para importar ficheiros .ics.
+
+        O permiso aos Contactos só é preciso se quere importar os cumpleanos dos contactos.
+
+        Esta aplicación é parte de unha serie máis grande de aplicativos. Puede atopar o resto en https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-hi-rIN/strings.xml b/app/src/main/res/values-hi-rIN/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..38e4f82d086b780a83ec5917690d79bec0937ea7
--- /dev/null
+++ b/app/src/main/res/values-hi-rIN/strings.xml
@@ -0,0 +1,224 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">सरल कैलेंडर</string>
+    <string name="app_launcher_name">कैलेंडर</string>
+    <string name="change_view">दृश्य बदले</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">Weekly view</string>
+    <string name="monthly_view">मासिक दृश्य</string>
+    <string name="yearly_view">वार्षिक दृश्य</string>
+    <string name="simple_event_list">सरल इवेंट सूची</string>
+    <string name="no_upcoming_events">Seems like you don\'t have any upcoming events.</string>
+    <string name="go_to_today">Go to today</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Calendar monthly</string>
+    <string name="widget_list">Calendar event list</string>
+
+    <!-- Event -->
+    <string name="event">इवेंट</string>
+    <string name="edit_event">इवेंट एडिट करें</string>
+    <string name="new_event">नया इवेंट</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">शीर्षक रिक्त नहीं हो सकता</string>
+    <string name="end_before_start">इवेंट शुरू होने से पहले खत्म नहीं हो सकता</string>
+    <string name="event_added">इवेंट सफलतापूर्वक जोड़ा गया</string>
+    <string name="event_updated">इवेंट सफलतापूर्वक अपडेट किया गया</string>
+    <string name="filter">Filter</string>
+    <string name="filter_events_by_type">Filter events by type</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">दुहराव</string>
+    <string name="no_repetition">No repetition</string>
+    <string name="daily">रोज</string>
+    <string name="weekly">साप्ताहिक</string>
+    <string name="monthly">मासिक</string>
+    <string name="yearly">वार्षिक</string>
+    <string name="weeks_raw">weeks</string>
+    <string name="months_raw">months</string>
+    <string name="years_raw">years</string>
+    <string name="repeat_till">Repeat till</string>
+    <string name="forever">Forever</string>
+    <string name="event_is_repeatable">The event is repeatable</string>
+    <string name="selection_contains_repetition">The selection contains repeating events</string>
+    <string name="delete_one_only">Delete the selected occurrence only</string>
+    <string name="delete_all_occurrences">Delete all occurrences</string>
+    <string name="update_one_only">Update the selected occurrence only</string>
+    <string name="update_all_occurrences">Update all occurrences</string>
+    <string name="repeat_till_date">Repeat till a date</string>
+    <string name="repeat_x_times">Repeat x times</string>
+    <string name="repeat_forever">Repeat forever</string>
+    <string name="times">times</string>
+    <string name="repeat">Repeat</string>
+    <string name="repeat_on">Repeat on</string>
+    <string name="every_day">Every day</string>
+    <string name="selected_days">On selected days</string>
+    <string name="the_same_day">The same day</string>
+    <string name="the_last_day">The last day</string>
+    <string name="repeat_on_the_same_day_monthly">Repeat on the same day each month</string>
+    <string name="repeat_on_the_last_day_monthly">Repeat on the last day of the month</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Repeat every</string>
+    <string name="every_m">Every</string>
+    <string name="first_m">first</string>
+    <string name="second_m">second</string>
+    <string name="third_m">third</string>
+    <string name="fourth_m">fourth</string>
+    <string name="last_m">last</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repeat every</string>
+    <string name="every_f">Every</string>
+    <string name="first_f">first</string>
+    <string name="second_f">second</string>
+    <string name="third_f">third</string>
+    <string name="fourth_f">fourth</string>
+    <string name="last_f">last</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Birthdays</string>
+    <string name="add_birthdays">Add contact birthdays</string>
+    <string name="no_birthdays">No birthdays have been found</string>
+    <string name="birthdays_added">Birthdays added successfully</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversaries</string>
+    <string name="add_anniversaries">Add contact anniversaries</string>
+    <string name="no_anniversaries">No anniversaries have been found</string>
+    <string name="anniversaries_added">Anniversaries added successfully</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">रिमाइंडर</string>
+    <string name="before">before</string>
+    <string name="add_another_reminder">Add another reminder</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Import events</string>
+    <string name="export_events">Export events</string>
+    <string name="import_events_from_ics">Import events from an .ics file</string>
+    <string name="export_events_to_ics">Export events to an .ics file</string>
+    <string name="default_event_type">Default event type</string>
+    <string name="export_past_events_too">Export past events too</string>
+    <string name="include_event_types">Include event types</string>
+    <string name="filename_without_ics">Filename (without .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">शीर्षक</string>
+    <string name="location">Location</string>
+    <string name="description">विवरण</string>
+    <string name="all_day">All-day</string>
+
+    <!-- Weekly view -->
+    <string name="week">Week</string>
+
+    <!-- Event types -->
+    <string name="event_types">Event types</string>
+    <string name="add_new_type">Add a new type</string>
+    <string name="edit_type">Edit type</string>
+    <string name="type_already_exists">Type with this title already exists</string>
+    <string name="color">Color</string>
+    <string name="regular_event">Regular event</string>
+    <string name="cannot_delete_default_type">Default event type cannot be deleted</string>
+    <string name="select_event_type">Select an event type</string>
+    <string name="move_events_into_default">Move affected events into the default event type</string>
+    <string name="remove_affected_events">Permanently remove affected events</string>
+    <string name="unsync_caldav_calendar">To remove a CalDAV calendar you have to unsynchronize it</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Holidays</string>
+    <string name="add_holidays">Add holidays</string>
+    <string name="national_holidays">National holidays</string>
+    <string name="religious_holidays">Religious holidays</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Importing some events failed</string>
+    <string name="importing_holidays_failed">Importing holidays failed</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Manage event types</string>
+    <string name="start_day_at">Start day at</string>
+    <string name="end_day_at">End day at</string>
+    <string name="week_numbers">सफ्ताह क्रमांक दिखाए</string>
+    <string name="vibrate">Vibrate on reminder notification</string>
+    <string name="reminder_sound">Reminder sound</string>
+    <string name="no_ringtone_picker">No app capable of setting ringtone found</string>
+    <string name="no_ringtone_selected">None</string>
+    <string name="day_end_before_start">The day cannot end earlier than it starts</string>
+    <string name="caldav_sync">CalDAV sync</string>
+    <string name="event_lists">Event lists</string>
+    <string name="display_past_events">Display events from the past</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Select calendars to sync</string>
+    <string name="manage_synced_calendars">Manage synced calendars</string>
+    <string name="store_locally_only">Store locally only</string>
+    <string name="refresh_caldav_calendars">Refresh CalDAV calendars</string>
+    <string name="refreshing">Refreshing…</string>
+    <string name="refreshing_complete">Refreshing complete</string>
+    <string name="editing_calendar_failed">Editing calendar failed</string>
+    <string name="syncing">Syncing…</string>
+    <string name="synchronization_completed">Sync completed</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Monday</string>
+    <string name="tuesday_alt">Tuesday</string>
+    <string name="wednesday_alt">Wednesday</string>
+    <string name="thursday_alt">Thursday</string>
+    <string name="friday_alt">Friday</string>
+    <string name="saturday_alt">Saturday</string>
+    <string name="sunday_alt">Sunday</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Workout</string>
+    <string name="sample_description_1">Leg day</string>
+    <string name="sample_title_2">Meeting with John</string>
+    <string name="sample_description_2">In Rockstone garden</string>
+    <string name="sample_title_3">Library</string>
+    <string name="sample_title_4">Lunch with Mary</string>
+    <string name="sample_description_4">In the Plaza</string>
+    <string name="sample_title_5">Coffee time</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">एक सरल कैलेंडर इवेंट्स, कस्टमाइजेबल विजेट व बिना विज्ञापन के बिना।</string>
+    <string name="app_long_description">
+        एक ऑफलाइन कैलेंडर बिना अन्य कैलेंडर इंटीग्रेशन के। आप आसानी से इवेंट्स व रिमाइंडर बना सकते हैं, यह सफ्ताह क्रमांक भी दर्शाता हैं।
+
+        इसमें आकार बदल सकने वाला 4x4 विजेट हैं जहा आप टेक्स्ट का रंग अनुकूलित कर सकते हैं, और अल्फा व बैकग्राउंड का रंग भी बदल सकते हैं।
+
+        कोई भी विज्ञापन व अनावश्यक अनुमतियों की आवश्यकता नहीं। यह पूर्ण रूप से ओपन सोर्स हैं, और काली थीम हैं।
+
+        The Storage permission is needed only for exporting or importing events from .ics files.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..cca4bbd11a8c35455c7fce2eb51806c2b4d37ac5
--- /dev/null
+++ b/app/src/main/res/values-hr/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Jednostavan kalendar</string>
+    <string name="app_launcher_name">Kalendar</string>
+    <string name="change_view">Promijeni prikaz</string>
+    <string name="daily_view">Dnevni pregled</string>
+    <string name="weekly_view">Tjedni pregled</string>
+    <string name="monthly_view">Mjesečni pregled</string>
+    <string name="yearly_view">Godišnji pregled</string>
+    <string name="simple_event_list">Jednostavan popis događaja</string>
+    <string name="no_upcoming_events">Izgleda da nemate nadolazećih događaja.</string>
+    <string name="go_to_today">Idi na danas</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Mjesečni raspored</string>
+    <string name="widget_list">Popis događaja kalendara</string>
+
+    <!-- Event -->
+    <string name="event">Događaj</string>
+    <string name="edit_event">Uredi događaj</string>
+    <string name="new_event">Novi događaj</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Naslov ne može biti prazan</string>
+    <string name="end_before_start">Događaj ne može završiti prije nego što počne</string>
+    <string name="event_added">Događaj je uspješno dodan</string>
+    <string name="event_updated">Događaj je uspješno ažuriran</string>
+    <string name="filter_events_by_type">Sortiranje prema vrsti događaja</string>
+    <string name="please_fill_location">Ispunite lokaciju za prikazivanje na karti</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Ponavljanje</string>
+    <string name="no_repetition">Nema ponavljanja</string>
+    <string name="daily">Dnevno</string>
+    <string name="weekly">Tjedno</string>
+    <string name="monthly">Mjesečno</string>
+    <string name="yearly">Godišnje</string>
+    <string name="weeks_raw">tjedana</string>
+    <string name="months_raw">mjeseci</string>
+    <string name="years_raw">godina</string>
+    <string name="repeat_till">Ponovi do</string>
+    <string name="forever">Zauvijek</string>
+    <string name="event_is_repeatable">Događaj je ponovljiv</string>
+    <string name="selection_contains_repetition">Odabir sadrži ponavljajuće događaje</string>
+    <string name="delete_one_only">Izbriši samo odabrano ponavljanje</string>
+    <string name="delete_all_occurrences">Izbriši sva ponavljanja</string>
+    <string name="update_one_only">Ažuriraj samo odabrano ponavljanje</string>
+    <string name="update_all_occurrences">Ažuriraj sva ponavljanja</string>
+    <string name="repeat_till_date">Ponovi do datuma</string>
+    <string name="repeat_x_times">Ponovi x puta</string>
+    <string name="repeat_forever">Ponovi zauvijek</string>
+    <string name="times">puta</string>
+    <string name="repeat">Ponavljanje</string>
+    <string name="repeat_on">Ponovi na</string>
+    <string name="every_day">Svaki dan</string>
+    <string name="selected_days">Na odabrane dane</string>
+    <string name="the_same_day">Isti dan</string>
+    <string name="the_last_day">Zadnji dan</string>
+    <string name="repeat_on_the_same_day_monthly">Ponovi isti dan svaki mjesec</string>
+    <string name="repeat_on_the_last_day_monthly">Ponovi zadnjeg dana u mjesecu</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Ponovi svaki</string>
+    <string name="every_m">Svaki</string>
+    <string name="first_m">prvi</string>
+    <string name="second_m">drugi</string>
+    <string name="third_m">treći</string>
+    <string name="fourth_m">četvrti</string>
+    <string name="last_m">peti</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Ponovi svaki</string>
+    <string name="every_f">Svaki</string>
+    <string name="first_f">prvi</string>
+    <string name="second_f">drugi</string>
+    <string name="third_f">treći</string>
+    <string name="fourth_f">četvrti</string>
+    <string name="last_f">peti</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Rođendani</string>
+    <string name="add_birthdays">Dodaj rođendane za kontakt</string>
+    <string name="no_birthdays">Nisu pronađeni rođendani</string>
+    <string name="birthdays_added">Rođendani su uspješno dodani</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Obljetnice</string>
+    <string name="add_anniversaries">Dodaj obljetnice za kontakt</string>
+    <string name="no_anniversaries">Nisu pronađene obljetnice</string>
+    <string name="anniversaries_added">Obljetnice uspješno dodane</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Podsjetnik</string>
+    <string name="before">prije</string>
+    <string name="add_another_reminder">Dodaj još jedan podsjetnik</string>
+    <string name="event_reminders">Podsjetnici na događaj</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Uvezi događaje</string>
+    <string name="export_events">Izvezi događaje</string>
+    <string name="import_events_from_ics">Uvoz događaja iz .ics datoteke</string>
+    <string name="export_events_to_ics">Izvoz događaja u .ics datoteku</string>
+    <string name="default_event_type">Zadani tip događaja</string>
+    <string name="export_past_events_too">Izvoz prošlih događaja</string>
+    <string name="include_event_types">Uključi vrste događaja</string>
+    <string name="filename_without_ics">Naziv datoteke (bez .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Naslov</string>
+    <string name="location">Lokacija</string>
+    <string name="description">Opis</string>
+    <string name="all_day">Cjelodnevni</string>
+
+    <!-- Weekly view -->
+    <string name="week">Tjedan</string>
+
+    <!-- Event types -->
+    <string name="event_types">Vrste događaja</string>
+    <string name="add_new_type">Dodaj novu vrstu</string>
+    <string name="edit_type">Uredi vrstu</string>
+    <string name="type_already_exists">Događaj s ovim naslovom već postoji</string>
+    <string name="color">Boja</string>
+    <string name="regular_event">Redoviti događaj</string>
+    <string name="cannot_delete_default_type">Zadana vrsta događaja se ne može izbrisati</string>
+    <string name="select_event_type">Odaberite vrstu događaja</string>
+    <string name="move_events_into_default">Premjesti zahvaćene događaje u zadanu vrstu događaja</string>
+    <string name="remove_affected_events">Trajno ukloni zahvaćene događaje</string>
+    <string name="unsync_caldav_calendar">Da biste uklonili CalDAV kalendar, morate ga desinkronizirati</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Praznici</string>
+    <string name="add_holidays">Dodaj praznik</string>
+    <string name="national_holidays">Nacionalni praznici</string>
+    <string name="religious_holidays">Vjerski praznici</string>
+    <string name="holidays_imported_successfully">Praznici su uspješno uvezeni u tip događaja \"Praznici\"</string>
+    <string name="importing_some_holidays_failed">Uvoz nekih događaja nije uspio</string>
+    <string name="importing_holidays_failed">Uvoz praznika nije uspio</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Upravljanje vrstama događaja</string>
+    <string name="start_day_at">Započni dan u</string>
+    <string name="end_day_at">Završi dan u</string>
+    <string name="week_numbers">Pokaži tjedne brojeve</string>
+    <string name="vibrate">Vibrirajte na obavijesti podsjetnika</string>
+    <string name="reminder_sound">Zvuk podsjetnika</string>
+    <string name="no_ringtone_picker">Nije pronađena nijedna aplikacija koja može postaviti zvuk zvona</string>
+    <string name="no_ringtone_selected">Nijedan</string>
+    <string name="day_end_before_start">Dan ne može završiti prije nego što počne</string>
+    <string name="caldav_sync">CalDAV sinkronizacija</string>
+    <string name="event_lists">Popis događaja</string>
+    <string name="display_past_events">Prikaži događaje iz prošlosti</string>
+    <string name="replace_description_with_location">Zamijenite opis događaja s lokacijom</string>
+    <string name="delete_all_events">Izbriši sve događaje</string>
+    <string name="delete_all_events_confirmation">Jeste li sigurni da želite izbrisati sve događaje? To će ostaviti Vaše vrste događaja i druge postavke netaknutima.</string>
+    <string name="show_a_grid">Prikaži mrežu</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Odaberi kalendare za sinkronizaciju</string>
+    <string name="manage_synced_calendars">Upravljanje sinkroniziranim kalendarima</string>
+    <string name="store_locally_only">Pohrani samo lokalno</string>
+    <string name="refresh_caldav_calendars">Osvježi CalDAV kalendare</string>
+    <string name="refreshing">Osvježavanje…</string>
+    <string name="refreshing_complete">Osvježavanje završeno</string>
+    <string name="editing_calendar_failed">Uređivanje kalendara nije uspjelo</string>
+    <string name="syncing">Sinkronizacija…</string>
+    <string name="synchronization_completed">Sinkronizacija završena</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Ponedjeljak</string>
+    <string name="tuesday_alt">Utorak</string>
+    <string name="wednesday_alt">Srijeda</string>
+    <string name="thursday_alt">Četvrtak</string>
+    <string name="friday_alt">Petak</string>
+    <string name="saturday_alt">Subota</string>
+    <string name="sunday_alt">Nedjelja</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Trening</string>
+    <string name="sample_description_1">Vježbanje nogu</string>
+    <string name="sample_title_2">Sastanak s Ivanom</string>
+    <string name="sample_description_2">U vrtu Rockstone</string>
+    <string name="sample_title_3">Knjižnica</string>
+    <string name="sample_title_4">Ručak s Marijom</string>
+    <string name="sample_description_4">U Plaza</string>
+    <string name="sample_title_5">Vrijeme za kavu</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Kako mogu ukloniti praznike uvezene putem gumba \"Dodaj praznik\"?</string>
+    <string name="faq_1_text">Praznik koji je stvoren na taj način umetnut je u novu vrstu događaja pod nazivom \"Praznici\". Možete otići u Postavke -> Upravljanje vrstama događaja,
+         dugo pritisnite datu vrstu događaja i izbrišite ga odabirom koša za smeće.</string>
+    <string name="faq_2_title">Mogu li sinkronizirati događaje putem Google Kalendara ili druge usluge koje podržavaju CalDAV?</string>
+    <string name="faq_2_text">Da, samo uključite \"CalDAV sinkronizacija\" u postavkama aplikacije i odaberite kalendare koje želite sinkronizirati. Međutim, potrebna je aplikacija  između Vašeg uređaja i poslužitelja.
+        U slučaju da želite sinkronizirati Google kalendar, njihova službena aplikacija Kalendar obavlja navedeni posao. Za ostale kalendare potreban Vam je aplikacija treće strane za upravljanje sinkronizacijom, na primjer DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Jednostavan kalendar s događajima, prilagodljivim widget i bez oglasa.</string>
+    <string name="app_long_description">
+        Jednostavan kalendar s dodatnom CalDAV sinkronizacijom. Možete jednostavno stvoriti ponavljajuće događaje i postaviti podsjetnike, također je moguće prikazati tjedne brojeve.
+
+        Sadrži mjesečni prikaz i widget s popisom događaja gdje možete prilagoditi boju teksta, kao i transparentnost te boju pozadine.
+
+        Ne sadrži oglase ili nepotrebne dozvole. Aplikacije je otvorenog koda, pruža prilagodljive boje.
+
+        Dopuštenje za pohranu podataka potrebna je samo za izvoz ili uvoz događaja iz .ics datoteka.
+
+        Dopuštenje za kontakte upotrebljava se samo pri uvozu rođendana i obljetnica kontakata.
+
+        Ova je aplikacija samo dio većeg broja aplikacija. Možete pronaći ostatak na https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f5641d2de87a882d445e04c74c75ee6053e9c533
--- /dev/null
+++ b/app/src/main/res/values-hu/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Egyszerű naptár</string>
+    <string name="app_launcher_name">Naptár</string>
+    <string name="change_view">Nézet megváltoztatása</string>
+    <string name="daily_view">Napi nézet</string>
+    <string name="weekly_view">Heti nézet</string>
+    <string name="monthly_view">Havi nézet</string>
+    <string name="yearly_view">Éves nézet</string>
+    <string name="simple_event_list">Egyszerű bejegyzéslista</string>
+    <string name="no_upcoming_events">Seems like you don\'t have any upcoming events.</string>
+    <string name="go_to_today">Go to today</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Havi naptár</string>
+    <string name="widget_list">Bejegyzésnaptár</string>
+
+    <!-- Event -->
+    <string name="event">Bejegyzés</string>
+    <string name="edit_event">Bejegyzés szerkesztése</string>
+    <string name="new_event">Új bejegyzés</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">A cím nem lehet üres</string>
+    <string name="end_before_start">Az eseménynek nem lehet vége a kezdete előtt</string>
+    <string name="event_added">Bejegyzés hozzáadva</string>
+    <string name="event_updated">Bejegyzés frissítve</string>
+    <string name="filter_events_by_type">Filter events by type</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Ismétlés</string>
+    <string name="no_repetition">No repetition</string>
+    <string name="daily">Naponta</string>
+    <string name="weekly">Hetente</string>
+    <string name="monthly">Havonta</string>
+    <string name="yearly">Évente</string>
+    <string name="weeks_raw">weeks</string>
+    <string name="months_raw">months</string>
+    <string name="years_raw">years</string>
+    <string name="repeat_till">Repeat till</string>
+    <string name="forever">Forever</string>
+    <string name="event_is_repeatable">The event is repeatable</string>
+    <string name="selection_contains_repetition">The selection contains repeating events</string>
+    <string name="delete_one_only">Delete the selected occurrence only</string>
+    <string name="delete_all_occurrences">Delete all occurrences</string>
+    <string name="update_one_only">Update the selected occurrence only</string>
+    <string name="update_all_occurrences">Update all occurrences</string>
+    <string name="repeat_till_date">Repeat till a date</string>
+    <string name="repeat_x_times">Repeat x times</string>
+    <string name="repeat_forever">Repeat forever</string>
+    <string name="times">times</string>
+    <string name="repeat">Repeat</string>
+    <string name="repeat_on">Repeat on</string>
+    <string name="every_day">Every day</string>
+    <string name="selected_days">On selected days</string>
+    <string name="the_same_day">The same day</string>
+    <string name="the_last_day">The last day</string>
+    <string name="repeat_on_the_same_day_monthly">Repeat on the same day each month</string>
+    <string name="repeat_on_the_last_day_monthly">Repeat on the last day of the month</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Repeat every</string>
+    <string name="every_m">Every</string>
+    <string name="first_m">first</string>
+    <string name="second_m">second</string>
+    <string name="third_m">third</string>
+    <string name="fourth_m">fourth</string>
+    <string name="last_m">last</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repeat every</string>
+    <string name="every_f">Every</string>
+    <string name="first_f">first</string>
+    <string name="second_f">second</string>
+    <string name="third_f">third</string>
+    <string name="fourth_f">fourth</string>
+    <string name="last_f">last</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Birthdays</string>
+    <string name="add_birthdays">Add contact birthdays</string>
+    <string name="no_birthdays">No birthdays have been found</string>
+    <string name="birthdays_added">Birthdays added successfully</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversaries</string>
+    <string name="add_anniversaries">Add contact anniversaries</string>
+    <string name="no_anniversaries">No anniversaries have been found</string>
+    <string name="anniversaries_added">Anniversaries added successfully</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Emlékeztető</string>
+    <string name="before">korábban</string>
+    <string name="add_another_reminder">Add another reminder</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Import events</string>
+    <string name="export_events">Export events</string>
+    <string name="import_events_from_ics">Import events from an .ics file</string>
+    <string name="export_events_to_ics">Export events to an .ics file</string>
+    <string name="default_event_type">Default event type</string>
+    <string name="export_past_events_too">Export past events too</string>
+    <string name="include_event_types">Include event types</string>
+    <string name="filename_without_ics">Filename (without .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Név</string>
+    <string name="location">Location</string>
+    <string name="description">Leírás</string>
+    <string name="all_day">All-day</string>
+
+    <!-- Weekly view -->
+    <string name="week">Week</string>
+
+    <!-- Event types -->
+    <string name="event_types">Event types</string>
+    <string name="add_new_type">Add a new type</string>
+    <string name="edit_type">Edit type</string>
+    <string name="type_already_exists">Type with this title already exists</string>
+    <string name="color">Color</string>
+    <string name="regular_event">Regular event</string>
+    <string name="cannot_delete_default_type">Default event type cannot be deleted</string>
+    <string name="select_event_type">Select an event type</string>
+    <string name="move_events_into_default">Move affected events into the default event type</string>
+    <string name="remove_affected_events">Permanently remove affected events</string>
+    <string name="unsync_caldav_calendar">To remove a CalDAV calendar you have to unsynchronize it</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Holidays</string>
+    <string name="add_holidays">Add holidays</string>
+    <string name="national_holidays">National holidays</string>
+    <string name="religious_holidays">Religious holidays</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Importing some events failed</string>
+    <string name="importing_holidays_failed">Importing holidays failed</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Manage event types</string>
+    <string name="start_day_at">Start day at</string>
+    <string name="end_day_at">End day at</string>
+    <string name="week_numbers">Hetek sorszámának mutatása</string>
+    <string name="vibrate">Emlékeztetőnél rezgés</string>
+    <string name="reminder_sound">Reminder sound</string>
+    <string name="no_ringtone_picker">No app capable of setting ringtone found</string>
+    <string name="no_ringtone_selected">None</string>
+    <string name="day_end_before_start">The day cannot end earlier than it starts</string>
+    <string name="caldav_sync">CalDAV sync</string>
+    <string name="event_lists">Event lists</string>
+    <string name="display_past_events">Display events from the past</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Select calendars to sync</string>
+    <string name="manage_synced_calendars">Manage synced calendars</string>
+    <string name="store_locally_only">Store locally only</string>
+    <string name="refresh_caldav_calendars">Refresh CalDAV calendars</string>
+    <string name="refreshing">Refreshing…</string>
+    <string name="refreshing_complete">Refreshing complete</string>
+    <string name="editing_calendar_failed">Editing calendar failed</string>
+    <string name="syncing">Syncing…</string>
+    <string name="synchronization_completed">Sync completed</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Monday</string>
+    <string name="tuesday_alt">Tuesday</string>
+    <string name="wednesday_alt">Wednesday</string>
+    <string name="thursday_alt">Thursday</string>
+    <string name="friday_alt">Friday</string>
+    <string name="saturday_alt">Saturday</string>
+    <string name="sunday_alt">Sunday</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Workout</string>
+    <string name="sample_description_1">Leg day</string>
+    <string name="sample_title_2">Meeting with John</string>
+    <string name="sample_description_2">In Rockstone garden</string>
+    <string name="sample_title_3">Library</string>
+    <string name="sample_title_4">Lunch with Mary</string>
+    <string name="sample_description_4">In the Plaza</string>
+    <string name="sample_title_5">Coffee time</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Egy egyszerű naptár bejegyzésekkel, widget-tel és reklámok nélkül.</string>
+    <string name="app_long_description">
+        Egy egyszerű naptár, CalDAV integráció lehetőségével. Könnyedén lehet ismétlődő eseményeket és emlékeztetőket felvenni, és a hetek sorszámait is mutatja.
+
+        Egy 4x4-es átméretezhető widget-et is biztosít, aminek beállíthatod a színét, az alfáját és a háttérszínét is.
+
+        Nincsenek reklámok, és nem igényel szükségtelen engedélyeket. A forráskódja teljesen nyílt, és sötét téma is beállítható.
+
+        The Storage permission is needed only for exporting or importing events from .ics files.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        Ez az alkalmazás egy nagyobb alkalmazás-sorozat része. A továbbiak itt találhatók: https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..0ea3a368f9996a824daff69b6689617ff24c0e81
--- /dev/null
+++ b/app/src/main/res/values-it/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Calendario</string>
+    <string name="change_view">Cambia vista</string>
+    <string name="daily_view">Vista giornaliera</string>
+    <string name="weekly_view">Vista settimanale</string>
+    <string name="monthly_view">Vista mensile</string>
+    <string name="yearly_view">Vista annuale</string>
+    <string name="simple_event_list">Lista eventi semplice</string>
+    <string name="no_upcoming_events">Sembra che tu non abbia nessun evento imminente.</string>
+    <string name="go_to_today">Vai a oggi</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Calendario mensile</string>
+    <string name="widget_list">Lista eventi calendario</string>
+
+    <!-- Event -->
+    <string name="event">Evento</string>
+    <string name="edit_event">Modifica evento</string>
+    <string name="new_event">Nuovo evento</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Il titolo non può essere vuoto</string>
+    <string name="end_before_start">L\'evento non può terminare prima del suo inizio</string>
+    <string name="event_added">Evento aggiunto correttamente</string>
+    <string name="event_updated">Evento aggiornato correttamente</string>
+    <string name="filter_events_by_type">Filtra eventi per tipologia</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Ripeti</string>
+    <string name="no_repetition">Non ripetere</string>
+    <string name="daily">Giornalmente</string>
+    <string name="weekly">Settimanalmente</string>
+    <string name="monthly">Mensilmente</string>
+    <string name="yearly">Annualmente</string>
+    <string name="weeks_raw">Settimane</string>
+    <string name="months_raw">Mesi</string>
+    <string name="years_raw">Anni</string>
+    <string name="repeat_till">Ripeti fino a</string>
+    <string name="forever">Per sempre</string>
+    <string name="event_is_repeatable">L\'evento è ripetibile</string>
+    <string name="selection_contains_repetition">La selezione contiene eventi ripetuti</string>
+    <string name="delete_one_only">Elimina solamente l\'occorenza selezionata</string>
+    <string name="delete_all_occurrences">Elimina tutte le occorrenze</string>
+    <string name="update_one_only">Aggiorna solamente l\'occorenza selezionata</string>
+    <string name="update_all_occurrences">Aggiorna tutte le occorenze</string>
+    <string name="repeat_till_date">Ripeti fino a una data</string>
+    <string name="repeat_x_times">Ripeti x volte</string>
+    <string name="repeat_forever">Ripeti per sempre</string>
+    <string name="times">volte</string>
+    <string name="repeat">Ripeti</string>
+    <string name="repeat_on">Repeat on</string>
+    <string name="every_day">Ogni giorno</string>
+    <string name="selected_days">On selected days</string>
+    <string name="the_same_day">Lo stesso giorno</string>
+    <string name="the_last_day">L\'ultimo giorno</string>
+    <string name="repeat_on_the_same_day_monthly">Ripeti lo stesso giorno ogni mese </string>
+    <string name="repeat_on_the_last_day_monthly">Repeat on the last day of the month</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Repeat every</string>
+    <string name="every_m">Tutti</string>
+    <string name="first_m">primo</string>
+    <string name="second_m">secondo</string>
+    <string name="third_m">terzo</string>
+    <string name="fourth_m">quarto</string>
+    <string name="last_m">ultimo</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repeat every</string>
+    <string name="every_f">Every</string>
+    <string name="first_f">first</string>
+    <string name="second_f">second</string>
+    <string name="third_f">third</string>
+    <string name="fourth_f">fourth</string>
+    <string name="last_f">last</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Compleanni</string>
+    <string name="add_birthdays">Aggiungi compleanni contatti</string>
+    <string name="no_birthdays">Nessun compleanno trovato</string>
+    <string name="birthdays_added">Compleanni aggiunti con successo</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversari</string>
+    <string name="add_anniversaries">Aggiungi anniversari contatti</string>
+    <string name="no_anniversaries">Nessun anniversario trovato</string>
+    <string name="anniversaries_added">Anniversari aggiunti con successo</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Promemoria</string>
+    <string name="before">prima</string>
+    <string name="add_another_reminder">Aggiungi un altro promemoria</string>
+    <string name="event_reminders">Promemoria eventi</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importa eventi</string>
+    <string name="export_events">Esporta eventi</string>
+    <string name="import_events_from_ics">Importa eventi da un file .ics</string>
+    <string name="export_events_to_ics">Esporta eventi in un file .ics</string>
+    <string name="default_event_type">Tipo evento predefinito</string>
+    <string name="export_past_events_too">Esporta anche eventi passati</string>
+    <string name="include_event_types">Includi tipi evento</string>
+    <string name="filename_without_ics">Nome file (senza .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Titolo</string>
+    <string name="location">Posizione</string>
+    <string name="description">Descrizione</string>
+    <string name="all_day">All-day</string>
+
+    <!-- Weekly view -->
+    <string name="week">Settimana</string>
+
+    <!-- Event types -->
+    <string name="event_types">Tipi evento</string>
+    <string name="add_new_type">Aggiungi nuovo tipo</string>
+    <string name="edit_type">Modifica tipo</string>
+    <string name="type_already_exists">Un tipo con questo titolo esiste già</string>
+    <string name="color">Colore</string>
+    <string name="regular_event">Evento regolare</string>
+    <string name="cannot_delete_default_type">Il tipo di evento predefinito non può essere cancellato</string>
+    <string name="select_event_type">Seleziona un tipo di evento</string>
+    <string name="move_events_into_default">Move affected events into the default event type</string>
+    <string name="remove_affected_events">Permanently remove affected events</string>
+    <string name="unsync_caldav_calendar">Per rimuovere un calendario CalDAV devi desincronizzarlo</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Feste</string>
+    <string name="add_holidays">Aggiungi feste</string>
+    <string name="national_holidays">Feste nazionali</string>
+    <string name="religious_holidays">Feste religiose</string>
+    <string name="holidays_imported_successfully">Le feste sono state importate nel tipo evento \"Feste\" con successo</string>
+    <string name="importing_some_holidays_failed">Importo di alcuni eventi fallito</string>
+    <string name="importing_holidays_failed">Importo delle feste fallito</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Gestisci tipi evento</string>
+    <string name="start_day_at">Start day at</string>
+    <string name="end_day_at">End day at</string>
+    <string name="week_numbers">Mostra numero settimane</string>
+    <string name="vibrate">Vibrate on reminder notification</string>
+    <string name="reminder_sound">Suoneria promemoria</string>
+    <string name="no_ringtone_picker">No app capable of setting ringtone found</string>
+    <string name="no_ringtone_selected">None</string>
+    <string name="day_end_before_start">Il giorno non può finire prima che cominci</string>
+    <string name="caldav_sync">CalDAV sync</string>
+    <string name="event_lists">Event lists</string>
+    <string name="display_past_events">Mostra eventi passati</string>
+    <string name="replace_description_with_location">Sostituisci la descrizione con la posizione</string>
+    <string name="delete_all_events">Cancella tutti gli eventi</string>
+    <string name="delete_all_events_confirmation">Vuoi cancellare tutti gli eventi? Questo lascerà i tuoi tipi evento e le altre impostazioni invariate.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Select calendars to sync</string>
+    <string name="manage_synced_calendars">Manage synced calendars</string>
+    <string name="store_locally_only">Store locally only</string>
+    <string name="refresh_caldav_calendars">Refresh CalDAV calendars</string>
+    <string name="refreshing">Refreshing…</string>
+    <string name="refreshing_complete">Refreshing complete</string>
+    <string name="editing_calendar_failed">Editing calendar failed</string>
+    <string name="syncing">Syncing…</string>
+    <string name="synchronization_completed">Sync completed</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Monday</string>
+    <string name="tuesday_alt">Tuesday</string>
+    <string name="wednesday_alt">Wednesday</string>
+    <string name="thursday_alt">Thursday</string>
+    <string name="friday_alt">Friday</string>
+    <string name="saturday_alt">Saturday</string>
+    <string name="sunday_alt">Sunday</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Workout</string>
+    <string name="sample_description_1">Leg day</string>
+    <string name="sample_title_2">Meeting with John</string>
+    <string name="sample_description_2">In Rockstone garden</string>
+    <string name="sample_title_3">Library</string>
+    <string name="sample_title_4">Lunch with Mary</string>
+    <string name="sample_description_4">In the Plaza</string>
+    <string name="sample_title_5">Coffee time</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">A simple calendar with events, customizable widget and no ads.</string>
+    <string name="app_long_description">
+        A simple calendar with optional CalDAV synchronization. You can easily create recurring events and setup reminders, it can also display week numbers.
+
+        Contains a monthly view and an event list widget where you can customize the color of the text, as well as the alpha and the color of the background.
+
+        Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors.
+
+        The Storage permission is needed only for exporting or importing events from .ics files.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..eb7f61ca28800742274b225075bd7686a43ccf18
--- /dev/null
+++ b/app/src/main/res/values-iw/strings.xml
@@ -0,0 +1,212 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">לוח שנה פשוט</string>
+    <string name="app_launcher_name">לוח שנה</string>
+    <string name="change_view">שינוי תצפית</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">תצפית שבועית</string>
+    <string name="monthly_view">תצפית חודשית</string>
+    <string name="yearly_view">תצפית שנתית</string>
+    <string name="simple_event_list">רשימת אירועים פשוטה</string>
+    <string name="no_upcoming_events">נראה שאין לך אירועים בזמן הקרוב.</string>
+    <string name="go_to_today">Go to today</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">לוח השנה חודשית</string>
+    <string name="widget_list">רשימת אירועים בלוח השנה</string>
+
+    <!-- Event -->
+    <string name="event">אירוע</string>
+    <string name="edit_event">ערוך</string>
+    <string name="new_event">אירוע חדש</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">הכותרת לא יכולה להיות ריקה</string>
+    <string name="end_before_start">האירוע לא יכול להיגמר מוקדם משהוא מתחיל</string>
+    <string name="event_added">האירוע הוסף בהצלחה</string>
+    <string name="event_updated">האירוע עודכן בהצלחה</string>
+    <string name="filter">Filter</string>
+    <string name="filter_events_by_type">Filter events by type</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Repetition</string>
+    <string name="no_repetition">No repetition</string>
+    <string name="daily">יום-יומית</string>
+    <string name="weekly">שבועית</string>
+    <string name="monthly">חודשית</string>
+    <string name="yearly">שנתית</string>
+    <string name="weeks_raw">weeks</string>
+    <string name="months_raw">months</string>
+    <string name="years_raw">years</string>
+    <string name="repeat_till">Repeat till</string>
+    <string name="forever">Forever</string>
+    <string name="event_is_repeatable">The event is repeatable</string>
+    <string name="selection_contains_repetition">The selection contains repeating events</string>
+    <string name="delete_one_only">Delete the selected occurrence only</string>
+    <string name="delete_all_occurrences">Delete all occurrences</string>
+    <string name="update_one_only">Update the selected occurrence only</string>
+    <string name="update_all_occurrences">Update all occurrences</string>
+    <string name="repeat_till_date">Repeat till a date</string>
+    <string name="repeat_x_times">Repeat x times</string>
+    <string name="repeat_forever">Repeat forever</string>
+    <string name="times">times</string>
+    <string name="repeat">Repeat</string>
+    <string name="repeat_on">Repeat on</string>
+    <string name="every_day">Every day</string>
+    <string name="selected_days">On selected days</string>
+    <string name="the_same_day">The same day</string>
+    <string name="the_last_day">The last day</string>
+    <string name="repeat_on_the_same_day_monthly">Repeat on the same day each month</string>
+    <string name="repeat_on_the_last_day_monthly">Repeat on the last day of the month</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Repeat every</string>
+    <string name="every_m">Every</string>
+    <string name="first_m">first</string>
+    <string name="second_m">second</string>
+    <string name="third_m">third</string>
+    <string name="fourth_m">fourth</string>
+    <string name="last_m">last</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repeat every</string>
+    <string name="every_f">Every</string>
+    <string name="first_f">first</string>
+    <string name="second_f">second</string>
+    <string name="third_f">third</string>
+    <string name="fourth_f">fourth</string>
+    <string name="last_f">last</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Birthdays</string>
+    <string name="add_birthdays">Add contact birthdays</string>
+    <string name="no_birthdays">No birthdays have been found</string>
+    <string name="birthdays_added">Birthdays added successfully</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversaries</string>
+    <string name="add_anniversaries">Add contact anniversaries</string>
+    <string name="no_anniversaries">No anniversaries have been found</string>
+    <string name="anniversaries_added">Anniversaries added successfully</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">תזכורת</string>
+    <string name="before">לפני</string>
+    <string name="add_another_reminder">Add another reminder</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">ייבוא אירועים</string>
+    <string name="export_events">Export events</string>
+    <string name="import_events_from_ics">Import events from an .ics file</string>
+    <string name="export_events_to_ics">Export events to an .ics file</string>
+    <string name="default_event_type">Default event type</string>
+    <string name="export_past_events_too">Export past events too</string>
+    <string name="include_event_types">Include event types</string>
+    <string name="filename_without_ics">Filename (without .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">כותרת</string>
+    <string name="location">Location</string>
+    <string name="description">תיאור</string>
+    <string name="all_day">All-day</string>
+
+    <!-- Weekly view -->
+    <string name="week">שבוע</string>
+
+    <!-- Event types -->
+    <string name="event_types">Event types</string>
+    <string name="add_new_type">Add a new type</string>
+    <string name="edit_type">Edit type</string>
+    <string name="type_already_exists">Type with this title already exists</string>
+    <string name="color">Color</string>
+    <string name="regular_event">Regular event</string>
+    <string name="cannot_delete_default_type">Default event type cannot be deleted</string>
+    <string name="select_event_type">Select an event type</string>
+    <string name="move_events_into_default">Move affected events into the default event type</string>
+    <string name="remove_affected_events">Permanently remove affected events</string>
+    <string name="unsync_caldav_calendar">To remove a CalDAV calendar you have to unsynchronize it</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Holidays</string>
+    <string name="add_holidays">Add holidays</string>
+    <string name="national_holidays">National holidays</string>
+    <string name="religious_holidays">Religious holidays</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Importing some events failed</string>
+    <string name="importing_holidays_failed">Importing holidays failed</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Manage event types</string>
+    <string name="start_day_at">התחלת תצפית שבועית בשעה</string>
+    <string name="end_day_at">התחלת תצפית שבועית בשעה</string>
+    <string name="week_numbers">הצגת מספרי השבועות בתצפית חודשית</string>
+    <string name="vibrate">רטט בהתראת תזכורת</string>
+    <string name="reminder_sound">צליל תזכורת</string>
+    <string name="no_ringtone_picker">לא נמצאה אפליקציה להגדרת רינגטון</string>
+    <string name="no_ringtone_selected">ללא</string>
+    <string name="day_end_before_start">היום לא יכול להסתיים מוקדם משהוא מתחיל</string>
+    <string name="caldav_sync">CalDAV sync</string>
+    <string name="event_lists">Event lists</string>
+    <string name="display_past_events">Display events from the past</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Select calendars to sync</string>
+    <string name="manage_synced_calendars">Manage synced calendars</string>
+    <string name="store_locally_only">Store locally only</string>
+    <string name="refresh_caldav_calendars">Refresh CalDAV calendars</string>
+    <string name="refreshing">Refreshing…</string>
+    <string name="refreshing_complete">Refreshing complete</string>
+    <string name="editing_calendar_failed">Editing calendar failed</string>
+    <string name="syncing">Syncing…</string>
+    <string name="synchronization_completed">Sync completed</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Monday</string>
+    <string name="tuesday_alt">Tuesday</string>
+    <string name="wednesday_alt">Wednesday</string>
+    <string name="thursday_alt">Thursday</string>
+    <string name="friday_alt">Friday</string>
+    <string name="saturday_alt">Saturday</string>
+    <string name="sunday_alt">Sunday</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">אימון</string>
+    <string name="sample_description_1">ראש השנה</string>
+    <string name="sample_title_2">פגישה עם יוני</string>
+    <string name="sample_description_2">בכיכר רבין</string>
+    <string name="sample_title_3">ספרייה</string>
+    <string name="sample_title_4">ארוחת צהריים עם מרים</string>
+    <string name="sample_description_4">במלון</string>
+    <string name="sample_title_5">הפסקת קפה</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">לוח שנה פשוט עם אירועים, וויג\'ט בעיצוב אישי וללא פרסומות</string>
+    <string name="app_long_description">לוח שנה אוף-ליין ללא כל אינטגרציה עם לוח שנה אחר. אפשר בקלות ליצור אירועים מחזוריים ותזכורות אליהם. יש אפשרות להציג את מספרי השבועות. מכיל וויג\'ט 4×4 שניתן להתאים אישית את גודלו, צבע הטקסט והרקע שלו, ושקיפותו. אין פרסומות או דרישות להרשאות בלתי-נחוצות. קוד המקור לגמרי פתוח, וניתן לעצב את צבעי הממשק.\nאפליקציה זו היא רק פיסה אחת מתוך סדרה גדולה יותר של אפליקציות. ניתן למצוא את השאר בכתובת  https://www.simplemobiletools.com</string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..43e6b0bac1458742948b1709274fdcea87bf5451
--- /dev/null
+++ b/app/src/main/res/values-ja/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">シンプル カレンダー</string>
+    <string name="app_launcher_name">カレンダー</string>
+    <string name="change_view">ビューの変更</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">Weekly view</string>
+    <string name="monthly_view">月ビュー</string>
+    <string name="yearly_view">年ビュー</string>
+    <string name="simple_event_list">シンプル イベント リスト</string>
+    <string name="no_upcoming_events">Seems like you don\'t have any upcoming events.</string>
+    <string name="go_to_today">Go to today</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">カレンダー月</string>
+    <string name="widget_list">カレンダー イベント リスト</string>
+
+    <!-- Event -->
+    <string name="event">イベント</string>
+    <string name="edit_event">イベントを編集</string>
+    <string name="new_event">新しいイベント</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">タイトルは空にできません</string>
+    <string name="end_before_start">イベントの終了は開始よりも前にできません</string>
+    <string name="event_added">イベントを正常に追加しました</string>
+    <string name="event_updated">イベントを正常に更新しました</string>
+    <string name="filter_events_by_type">Filter events by type</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">繰り返し</string>
+    <string name="no_repetition">No repetition</string>
+    <string name="daily">毎日</string>
+    <string name="weekly">毎週</string>
+    <string name="monthly">毎月</string>
+    <string name="yearly">毎年</string>
+    <string name="weeks_raw">weeks</string>
+    <string name="months_raw">months</string>
+    <string name="years_raw">years</string>
+    <string name="repeat_till">Repeat till</string>
+    <string name="forever">Forever</string>
+    <string name="event_is_repeatable">The event is repeatable</string>
+    <string name="selection_contains_repetition">The selection contains repeating events</string>
+    <string name="delete_one_only">Delete the selected occurrence only</string>
+    <string name="delete_all_occurrences">Delete all occurrences</string>
+    <string name="update_one_only">Update the selected occurrence only</string>
+    <string name="update_all_occurrences">Update all occurrences</string>
+    <string name="repeat_till_date">Repeat till a date</string>
+    <string name="repeat_x_times">Repeat x times</string>
+    <string name="repeat_forever">Repeat forever</string>
+    <string name="times">times</string>
+    <string name="repeat">Repeat</string>
+    <string name="repeat_on">Repeat on</string>
+    <string name="every_day">Every day</string>
+    <string name="selected_days">On selected days</string>
+    <string name="the_same_day">The same day</string>
+    <string name="the_last_day">The last day</string>
+    <string name="repeat_on_the_same_day_monthly">Repeat on the same day each month</string>
+    <string name="repeat_on_the_last_day_monthly">Repeat on the last day of the month</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Repeat every</string>
+    <string name="every_m">Every</string>
+    <string name="first_m">first</string>
+    <string name="second_m">second</string>
+    <string name="third_m">third</string>
+    <string name="fourth_m">fourth</string>
+    <string name="last_m">last</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repeat every</string>
+    <string name="every_f">Every</string>
+    <string name="first_f">first</string>
+    <string name="second_f">second</string>
+    <string name="third_f">third</string>
+    <string name="fourth_f">fourth</string>
+    <string name="last_f">last</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Birthdays</string>
+    <string name="add_birthdays">Add contact birthdays</string>
+    <string name="no_birthdays">No birthdays have been found</string>
+    <string name="birthdays_added">Birthdays added successfully</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversaries</string>
+    <string name="add_anniversaries">Add contact anniversaries</string>
+    <string name="no_anniversaries">No anniversaries have been found</string>
+    <string name="anniversaries_added">Anniversaries added successfully</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">リマインダー</string>
+    <string name="before">前</string>
+    <string name="add_another_reminder">Add another reminder</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Import events</string>
+    <string name="export_events">Export events</string>
+    <string name="import_events_from_ics">Import events from an .ics file</string>
+    <string name="export_events_to_ics">Export events to an .ics file</string>
+    <string name="default_event_type">Default event type</string>
+    <string name="export_past_events_too">Export past events too</string>
+    <string name="include_event_types">Include event types</string>
+    <string name="filename_without_ics">Filename (without .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">タイトル</string>
+    <string name="location">Location</string>
+    <string name="description">説明</string>
+    <string name="all_day">All-day</string>
+
+    <!-- Weekly view -->
+    <string name="week">Week</string>
+
+    <!-- Event types -->
+    <string name="event_types">Event types</string>
+    <string name="add_new_type">Add a new type</string>
+    <string name="edit_type">Edit type</string>
+    <string name="type_already_exists">Type with this title already exists</string>
+    <string name="color">Color</string>
+    <string name="regular_event">Regular event</string>
+    <string name="cannot_delete_default_type">Default event type cannot be deleted</string>
+    <string name="select_event_type">Select an event type</string>
+    <string name="move_events_into_default">Move affected events into the default event type</string>
+    <string name="remove_affected_events">Permanently remove affected events</string>
+    <string name="unsync_caldav_calendar">To remove a CalDAV calendar you have to unsynchronize it</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Holidays</string>
+    <string name="add_holidays">Add holidays</string>
+    <string name="national_holidays">National holidays</string>
+    <string name="religious_holidays">Religious holidays</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Importing some events failed</string>
+    <string name="importing_holidays_failed">Importing holidays failed</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Manage event types</string>
+    <string name="start_day_at">Start day at</string>
+    <string name="end_day_at">End day at</string>
+    <string name="week_numbers">週番号を表示</string>
+    <string name="vibrate">リマインダー通知で振動</string>
+    <string name="reminder_sound">Reminder sound</string>
+    <string name="no_ringtone_picker">No app capable of setting ringtone found</string>
+    <string name="no_ringtone_selected">None</string>
+    <string name="day_end_before_start">The day cannot end earlier than it starts</string>
+    <string name="caldav_sync">CalDAV sync</string>
+    <string name="event_lists">Event lists</string>
+    <string name="display_past_events">Display events from the past</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Select calendars to sync</string>
+    <string name="manage_synced_calendars">Manage synced calendars</string>
+    <string name="store_locally_only">Store locally only</string>
+    <string name="refresh_caldav_calendars">Refresh CalDAV calendars</string>
+    <string name="refreshing">Refreshing…</string>
+    <string name="refreshing_complete">Refreshing complete</string>
+    <string name="editing_calendar_failed">Editing calendar failed</string>
+    <string name="syncing">Syncing…</string>
+    <string name="synchronization_completed">Sync completed</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Monday</string>
+    <string name="tuesday_alt">Tuesday</string>
+    <string name="wednesday_alt">Wednesday</string>
+    <string name="thursday_alt">Thursday</string>
+    <string name="friday_alt">Friday</string>
+    <string name="saturday_alt">Saturday</string>
+    <string name="sunday_alt">Sunday</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Workout</string>
+    <string name="sample_description_1">Leg day</string>
+    <string name="sample_title_2">Meeting with John</string>
+    <string name="sample_description_2">In Rockstone garden</string>
+    <string name="sample_title_3">Library</string>
+    <string name="sample_title_4">Lunch with Mary</string>
+    <string name="sample_description_4">In the Plaza</string>
+    <string name="sample_title_5">Coffee time</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">イベント、カスタマイズ可能なウィジェットのあるシンプルなカレンダー。広告はありません。</string>
+    <string name="app_long_description">
+        他のカレンダーとは統合されていないオフラインカレンダー。 簡単に定期的なイベントを作成し、リマインダーを設定することができます。また、週番号も表示することができます。
+
+        サイズ変更が可能な 4x4 ウィジェットが含まれており、文字の色や背景のアルファや色をカスタマイズすることができます。
+
+        広告や不要なアクセス許可は含まれていません。 完全にオープンソースで、ダークテーマも提供しています。
+
+        The Storage permission is needed only for exporting or importing events from .ics files.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        このアプリは、大きな一連のアプリの一つです。 他のアプリは https://www.simplemobiletools.com で見つけることができます
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..87c8f7fead96599b72c34371ddec24df96a0274f
--- /dev/null
+++ b/app/src/main/res/values-ko/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">심플 캘린더</string>
+    <string name="app_launcher_name">캘린더</string>
+    <string name="change_view">보기 변경</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">주간 보기</string>
+    <string name="monthly_view">월간 보기</string>
+    <string name="yearly_view">연간 보기</string>
+    <string name="simple_event_list">간단한 이벤트 목록</string>
+    <string name="no_upcoming_events">다가올 이벤트가 없는 것 같습니다.</string>
+    <string name="go_to_today">오늘로 이동</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">월별 달력</string>
+    <string name="widget_list">일정 목록 달력</string>
+
+    <!-- Event -->
+    <string name="event">이벤트</string>
+    <string name="edit_event">이벤트 수정</string>
+    <string name="new_event">새 이벤트</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">제목을 입력해주세요</string>
+    <string name="end_before_start">이벤트가 시작되기 전에 끝날 수 없습니다</string>
+    <string name="event_added">이벤트가 성공적으로 추가되었습니다</string>
+    <string name="event_updated">이벤트를 수정했습니다</string>
+    <string name="filter_events_by_type">유형별 이벤트</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">반복</string>
+    <string name="no_repetition">반복 없음</string>
+    <string name="daily">매일</string>
+    <string name="weekly">매주</string>
+    <string name="monthly">매월</string>
+    <string name="yearly">매년</string>
+    <string name="weeks_raw">주</string>
+    <string name="months_raw">월</string>
+    <string name="years_raw">년</string>
+    <string name="repeat_till">까지 반복</string>
+    <string name="forever">영원히</string>
+    <string name="event_is_repeatable">반복 이벤트입니다</string>
+    <string name="selection_contains_repetition">선택한 항목에 반복되는 이벤트들이 있습니다</string>
+    <string name="delete_one_only">선택한 항목만 삭제</string>
+    <string name="delete_all_occurrences">모든 항목 삭제</string>
+    <string name="update_one_only">선택한 항목만 변경</string>
+    <string name="update_all_occurrences">모든 항목 변경</string>
+    <string name="repeat_till_date">날짜까지 반복</string>
+    <string name="repeat_x_times">횟수 반복</string>
+    <string name="repeat_forever">영원히 반복</string>
+    <string name="times">번</string>
+    <string name="repeat">반복</string>
+    <string name="repeat_on">반복하다</string>
+    <string name="every_day">매일</string>
+    <string name="selected_days">선택한 요일에</string>
+    <string name="the_same_day">같은 날</string>
+    <string name="the_last_day">마지막 날</string>
+    <string name="repeat_on_the_same_day_monthly">매월 같은 날 반복</string>
+    <string name="repeat_on_the_last_day_monthly">매월 매지막 날 반복</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">매일 반복</string>
+    <string name="every_m">매일</string>
+    <string name="first_m">첫 번째</string>
+    <string name="second_m">두 번째</string>
+    <string name="third_m">세 번째</string>
+    <string name="fourth_m">네 번째</string>
+    <string name="last_m">마지막</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repeat every</string>
+    <string name="every_f">Every</string>
+    <string name="first_f">first</string>
+    <string name="second_f">second</string>
+    <string name="third_f">third</string>
+    <string name="fourth_f">fourth</string>
+    <string name="last_f">last</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">생일</string>
+    <string name="add_birthdays">연락처의 생일 추가</string>
+    <string name="no_birthdays">조회된 생일이 없음</string>
+    <string name="birthdays_added">생일 추가 완료</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">기념일</string>
+    <string name="add_anniversaries">연락처의 기념일 추가</string>
+    <string name="no_anniversaries">조회된 기념일 없음</string>
+    <string name="anniversaries_added">기념일 추가 완료</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">알림</string>
+    <string name="before">전</string>
+    <string name="add_another_reminder">다른 알림 추가</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">이벤트들 가져 오기</string>
+    <string name="export_events">이벤트들 내보내기</string>
+    <string name="import_events_from_ics">.ics 파일에서 이벤트들 가져오기</string>
+    <string name="export_events_to_ics">.ics 파일로 이벤트들 내보내기</string>
+    <string name="default_event_type">기본 이벤트 유형</string>
+    <string name="export_past_events_too">과거 이벤트들 내보내기</string>
+    <string name="include_event_types">이벤트 유형 포함</string>
+    <string name="filename_without_ics">파일이름 (.ics 없이)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">제목</string>
+    <string name="location">Location</string>
+    <string name="description">설명</string>
+    <string name="all_day">하루 종일</string>
+
+    <!-- Weekly view -->
+    <string name="week">주</string>
+
+    <!-- Event types -->
+    <string name="event_types">이벤트 유형</string>
+    <string name="add_new_type">새로운 유형 추가</string>
+    <string name="edit_type">유형 수정</string>
+    <string name="type_already_exists">이미 같은 이름의 유형이 존재합니다</string>
+    <string name="color">색상</string>
+    <string name="regular_event">표준 이벤트</string>
+    <string name="cannot_delete_default_type">기본 유형은 삭제할 수 없습니다</string>
+    <string name="select_event_type">이벤트 유형 선택</string>
+    <string name="move_events_into_default">영향을 받는 이벤트들을 기본 유형으로 이동</string>
+    <string name="remove_affected_events">영향을 받는 이벤트들을 영구적으로 제거</string>
+    <string name="unsync_caldav_calendar">To remove a CalDAV calendar you have to unsynchronize it</string>
+
+    <!-- Holidays -->
+    <string name="holidays">공휴일</string>
+    <string name="add_holidays">공휴일 추가</string>
+    <string name="national_holidays">국경일</string>
+    <string name="religious_holidays">종교 휴일</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">일부 이벤트를 가져오지 못했습니다</string>
+    <string name="importing_holidays_failed">공휴일을 가져오는데 실패했습니다</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">이벤트 유형 관리</string>
+    <string name="start_day_at">시작 시간</string>
+    <string name="end_day_at">종료 시간</string>
+    <string name="week_numbers">주 번호 표시</string>
+    <string name="vibrate">알림 시 진동</string>
+    <string name="reminder_sound">알림 소리</string>
+    <string name="no_ringtone_picker">벨소리를 설정할 수 있는 앱이 없습니다</string>
+    <string name="no_ringtone_selected">없음</string>
+    <string name="day_end_before_start">요일은 시작하기 전에 끝날 수 없습니다</string>
+    <string name="caldav_sync">CalDAV 동기화</string>
+    <string name="event_lists">Event lists</string>
+    <string name="display_past_events">과거의 이벤트 표시</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">동기화 할 캘린더 선택</string>
+    <string name="manage_synced_calendars">동기화된 캘린더 관리</string>
+    <string name="store_locally_only">로컬에만 저장</string>
+    <string name="refresh_caldav_calendars">CalDAV 캘린더들 새로고침</string>
+    <string name="refreshing">새로고침 중…</string>
+    <string name="refreshing_complete">새로고침 완료</string>
+    <string name="editing_calendar_failed">변경 실패</string>
+    <string name="syncing">동기화중…</string>
+    <string name="synchronization_completed">동기화 완료</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Monday</string>
+    <string name="tuesday_alt">Tuesday</string>
+    <string name="wednesday_alt">Wednesday</string>
+    <string name="thursday_alt">Thursday</string>
+    <string name="friday_alt">Friday</string>
+    <string name="saturday_alt">Saturday</string>
+    <string name="sunday_alt">Sunday</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Workout</string>
+    <string name="sample_description_1">Leg day</string>
+    <string name="sample_title_2">Meeting with John</string>
+    <string name="sample_description_2">In Rockstone garden</string>
+    <string name="sample_title_3">Library</string>
+    <string name="sample_title_4">Lunch with Mary</string>
+    <string name="sample_description_4">In the Plaza</string>
+    <string name="sample_title_5">Coffee time</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">사용자 정의 위젯이 있는 심플한 캘린더입니다. 그리고 광고가 없습니다.</string>
+    <string name="app_long_description">
+        Google 동기화가 있는 심플한 캘린더입니다. 쉽게 반복 이벤트와 알림을 설정할 수 있으며, 주 번호도 표시할 수 있습니다.
+
+        텍스트의 색상은 물론 배경의 투명도와 색상을 정할 수 있는, 크기 조절이 가능한 4x4 위젯이 포함되어 있습니다.
+
+        광고와 불필요한 권한이 없습니다. 이것은 완전히 오픈소스이며, 색상을 설정할 수 있습니다.
+
+        저장 권한은 .ics 파일에서 이벤트를 가져오는 경우에만 필요합니다.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        이 앱은 더 큰 시리즈의 앱들 중 하나입니다. 나머지는 https://www.simplemobiletools.com 에서 찾을 수 있습니다.
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-land/dimens.xml b/app/src/main/res/values-land/dimens.xml
new file mode 100644
index 0000000000000000000000000000000000000000..556dfb68af434f5a4bd6c7b86348f09101df80bf
--- /dev/null
+++ b/app/src/main/res/values-land/dimens.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <dimen name="yearly_month_padding">40dp</dimen>
+</resources>
diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..37c3d1086a8f6461dc83cd9edd1a36e48c7e3ef3
--- /dev/null
+++ b/app/src/main/res/values-lt/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Paprastas kalendorius</string>
+    <string name="app_launcher_name">Kalendorius</string>
+    <string name="change_view">Pakeisti peržiūrą</string>
+    <string name="daily_view">Dienos peržiūra</string>
+    <string name="weekly_view">Savaitės peržiūra</string>
+    <string name="monthly_view">Mėnesio peržiūra</string>
+    <string name="yearly_view">Metų peržiūra</string>
+    <string name="simple_event_list">Paprastas įvykių sąrašas</string>
+    <string name="no_upcoming_events">Atrodo jog Jūs neturite jokių įvyksiančių įvykių.</string>
+    <string name="go_to_today">Eiti į šiandieną</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Mėnesio kalendorius</string>
+    <string name="widget_list">Kalendoriaus įvykių sąrašas</string>
+
+    <!-- Event -->
+    <string name="event">Įvykis</string>
+    <string name="edit_event">Redaguoti įvykį</string>
+    <string name="new_event">Naujas įvykis</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Pavadinimas negali būti tuščias</string>
+    <string name="end_before_start">TĮvykis negali pasibaigti anksčiau nei jis prasideda</string>
+    <string name="event_added">Įvykis įtrauktas sėkmingai</string>
+    <string name="event_updated">Įvykis atnaujintas sėkmingai</string>
+    <string name="filter_events_by_type">Filtruoti įvykius pagal tipą</string>
+    <string name="please_fill_location">Prašome įvesti vietą, kad būtų rodoma žemėlapyje</string>
+    <string name="public_event_notification_text">Būsimas įvykis</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Pasikartojimas</string>
+    <string name="no_repetition">Be pasikartojimo</string>
+    <string name="daily">Kasdien</string>
+    <string name="weekly">Kas savaitę</string>
+    <string name="monthly">Kas mėnesį</string>
+    <string name="yearly">Kasmet</string>
+    <string name="weeks_raw">Savaitės</string>
+    <string name="months_raw">Mėnesiai</string>
+    <string name="years_raw">Metai</string>
+    <string name="repeat_till">Kartoti iki</string>
+    <string name="forever">Visada</string>
+    <string name="event_is_repeatable">Įvykis pakartojamas</string>
+    <string name="selection_contains_repetition">Pasirinkimas susideda iš pasikartojančių įvykių</string>
+    <string name="delete_one_only">Ištrinti tik pasirinktą įvykį</string>
+    <string name="delete_all_occurrences">Ištrinti visus įvykius</string>
+    <string name="update_one_only">Atnaujinti tik pasirinktą įvykį</string>
+    <string name="update_all_occurrences">Atnaujinti visus įvykius</string>
+    <string name="repeat_till_date">Pakartoti iki datos</string>
+    <string name="repeat_x_times">Pakartoti x kartus/ų</string>
+    <string name="repeat_forever">Karoti amžinai</string>
+    <string name="times">laikai</string>
+    <string name="repeat">Kartoti</string>
+    <string name="repeat_on">Kartoti per</string>
+    <string name="every_day">Kiekvieną dieną</string>
+    <string name="selected_days">Pasirinktomis dienomis</string>
+    <string name="the_same_day">Tą pačią dieną</string>
+    <string name="the_last_day">Paskutinę dieną</string>
+    <string name="repeat_on_the_same_day_monthly">Pakartoti tą pačią kiekvieno mėnesio dieną</string>
+    <string name="repeat_on_the_last_day_monthly">Pakartoti paskutinę mėnesio dieną</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Pakartoti kiekvieną</string>
+    <string name="every_m">Kiekvieną</string>
+    <string name="first_m">Pirmą</string>
+    <string name="second_m">Antrą</string>
+    <string name="third_m">Trečią</string>
+    <string name="fourth_m">Ketvirtą</string>
+    <string name="last_m">Paskutinę</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Pakartoti kiekvieną</string>
+    <string name="every_f">Kiekvieną</string>
+    <string name="first_f">Pirmą</string>
+    <string name="second_f">Antrą</string>
+    <string name="third_f">Trečią</string>
+    <string name="fourth_f">Ketvirtą</string>
+    <string name="last_f">Paskutinę</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Gimtadieniai</string>
+    <string name="add_birthdays">Pridėti kontaktų gimtadienius</string>
+    <string name="no_birthdays">Nerasta gimtadienių</string>
+    <string name="birthdays_added">Gimtadieniai įtraukti sėkmingai</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Sukaktys</string>
+    <string name="add_anniversaries">pridėti kontakto sukaktis</string>
+    <string name="no_anniversaries">Sukakčių nerasta</string>
+    <string name="anniversaries_added">Sukaktys įtrauktos sėkmingai</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Priminimas</string>
+    <string name="before">Prieš</string>
+    <string name="add_another_reminder">Pridėti kitą priminimą</string>
+    <string name="event_reminders">Įvykių priminimai</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importuoti įvykius</string>
+    <string name="export_events">Eksportuoti įvykius</string>
+    <string name="import_events_from_ics">Importuoti įvykius iš .ics bylos</string>
+    <string name="export_events_to_ics">Eksportuoti įvykius į .ics bylą</string>
+    <string name="default_event_type">Numatytasis įvykio tipas</string>
+    <string name="export_past_events_too">Taip pat eksportuoti praėjusius įvykius</string>
+    <string name="include_event_types">Įtraukti įvykių tipus</string>
+    <string name="filename_without_ics">Bylos pavadinimas (be .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Pavadinimas</string>
+    <string name="location">Vieta</string>
+    <string name="description">Apibūdinimas</string>
+    <string name="all_day">Visos dienos</string>
+
+    <!-- Weekly view -->
+    <string name="week">Savaitė</string>
+
+    <!-- Event types -->
+    <string name="event_types">Įvykių tipai</string>
+    <string name="add_new_type">Įtraukti naują tipą</string>
+    <string name="edit_type">Redaguoti tipą</string>
+    <string name="type_already_exists">Tipas šiuo pvadinimu jau yra</string>
+    <string name="color">Spalva</string>
+    <string name="regular_event">Įprastinis įvykis</string>
+    <string name="cannot_delete_default_type">Įprastinis įvykio tipas negali būti ištrintas</string>
+    <string name="select_event_type">Pasirinkti įvykio tipą</string>
+    <string name="move_events_into_default">Perkelti paveiktus įvykius į numatytojo įvykio tipą</string>
+    <string name="remove_affected_events">Iškart ištrinti paveiktus įvykius</string>
+    <string name="unsync_caldav_calendar">Kad ištrinti CalDAV kalendorių Jūs turite išsinchronizuoti jį</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Atostogos</string>
+    <string name="add_holidays">Įtraukti atostogas</string>
+    <string name="national_holidays">Nacionalinės atostogos</string>
+    <string name="religious_holidays">Religinės atostogos</string>
+    <string name="holidays_imported_successfully">Atostogos buvo sėkmingai importuotos į \"Atostogos\" įvykio tipą</string>
+    <string name="importing_some_holidays_failed">Kai kurių įvykių importavimas nepavyko</string>
+    <string name="importing_holidays_failed">Atostogų importavimas nepavyko</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Tvarkyti įvykių tipus</string>
+    <string name="start_day_at">Pradėti dieną nuo</string>
+    <string name="end_day_at">Užbaigti dieną nuo</string>
+    <string name="week_numbers">Rodyti savaičių numerius</string>
+    <string name="vibrate">Vibruoti per priminimo pranešimą</string>
+    <string name="reminder_sound">Priminimo garsas</string>
+    <string name="no_ringtone_picker">Nerasta programėlės nustatančios skambėjimo toną</string>
+    <string name="no_ringtone_selected">Nėra</string>
+    <string name="day_end_before_start">Diena negali baigtis anksčiau nei prasideda</string>
+    <string name="caldav_sync">CalDAV sinchronizavimas</string>
+    <string name="event_lists">Įvykių sąrašai</string>
+    <string name="display_past_events">Rodyti praeities įvykius</string>
+    <string name="replace_description_with_location">Pakeisti įvykio apibūdinimą į įvykio vietą</string>
+    <string name="delete_all_events">Ištrinti visus įvykius</string>
+    <string name="delete_all_events_confirmation">Ar Jūs tikrai norite ištrinti visus įvykius? Tai neištrins įvykių tipų ir kitų nustatymų.</string>
+    <string name="show_a_grid">Rodyti tinklelį</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Pasirinkti kalendorius sinchronizavimui</string>
+    <string name="manage_synced_calendars">Tvarkyti sinchronizuotus kalendorius</string>
+    <string name="store_locally_only">Saugoti tik vietinėje atmintyje</string>
+    <string name="refresh_caldav_calendars">Atnaujinti CalDAV kalendorius</string>
+    <string name="refreshing">Atnaujinama…</string>
+    <string name="refreshing_complete">Atnaujinimas pavyko</string>
+    <string name="editing_calendar_failed">Kalendoriaus redagavimas nepavyko</string>
+    <string name="syncing">Sinchronizuojama…</string>
+    <string name="synchronization_completed">Sinchronizacija baigta</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Pirmadienį</string>
+    <string name="tuesday_alt">Antradienį</string>
+    <string name="wednesday_alt">Trečiadienį</string>
+    <string name="thursday_alt">Ketvirtadienį</string>
+    <string name="friday_alt">Penktadienį</string>
+    <string name="saturday_alt">Šeštadienį</string>
+    <string name="sunday_alt">Sekmadienį</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Treniruotė</string>
+    <string name="sample_description_1">Kojų diena</string>
+    <string name="sample_title_2">Susitikimas su Jonu</string>
+    <string name="sample_description_2">Akmenų sode</string>
+    <string name="sample_title_3">Bibliotekoje</string>
+    <string name="sample_title_4">Pietūs su Marija</string>
+    <string name="sample_description_4">Dangoraižyje</string>
+    <string name="sample_title_5">Kavos laikas</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Kaip galiu ištrinti atostogas importuotas per \"Įtraukti atostogas\" mygtuką?</string>
+    <string name="faq_1_text">Atostogos sukuriamos per naują įvykio tipą \"Atostogos\". Eikite į nustatymus -> Tvarkyti įvykių tipus,
+        ilgiau paspauskite ant duotojo įykio tipo ir ištrinkite jį pasirinkdami šiukšlinę.</string>
+    <string name="faq_2_title">Ar galiu sinchronizuoti savo įvykius per Google Kalendorių, ar kitą paslaugą palaikančią CalDAV?</string>
+    <string name="faq_2_text">Taip, tiesiog pasirinkite \"CalDAV sinchronizavimas\" programėlės nustatymuose ir pasirinkite kalendorius kuriuos norite sinchronizuoti. Tačiau Jums reikės trečiosios šalies programėlės palaikančios sinchronizavimą tarp įrenginio ir serverių.
+        Jeigu norite sinchronizuoti Google kalendorių, jų oficiali kalendoriaus programėlė atliks šį darbą. Kitiems kalenoriams Jums reikės trečiosios šalies sinchronizavimo adapterio, pavyzdžiui DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">paprastas kalendorius su įvykiais, tinkinamu valdikliu ir be reklamų.</string>
+    <string name="app_long_description">
+        Paprastas kalendorius su CalDAV sinchronizacija. Galite lengvai kurti pasikartojančius įvykius ir nustatyti priminimus, kalendorius gali rodyti savaitės numerius.
+
+        Palaiko mėnesio peržiūrą ir įvykių sąrašo valdiklį, kuriame Jūs galite tinkinti teksto, pagrindinę ir fono spalvas.
+
+        Neturi reklamų ar nereikalingų leidimų. Programėlė visiškai atviro kodo, yra galimybė keisti spalvas.
+
+        Saugyklos leidimas reikalingas tik eksportuoti ir importuoti įvykius iš .ics bylų.
+
+        Kontaktų leidimas naudojamas tik importuoti kontaktų gimtadienius ir sukaktis.
+
+        Ši programėle yra viena iš keletos mūsų programėlių. Likusias Jūs galite rasti čia https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fc3666a2a989b78b443ceec307911df8b7392b46
--- /dev/null
+++ b/app/src/main/res/values-nb/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Kalender</string>
+    <string name="change_view">Endre visning</string>
+    <string name="daily_view">Dagvisning</string>
+    <string name="weekly_view">Ukevisning</string>
+    <string name="monthly_view">Månedsvisning</string>
+    <string name="yearly_view">Årsvisning</string>
+    <string name="simple_event_list">Enkel hendelsesliste</string>
+    <string name="no_upcoming_events">Ser ut som du ikke har noen kommende hendelser.</string>
+    <string name="go_to_today">Gå til idag</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Månedskalender</string>
+    <string name="widget_list">Hendelsesliste</string>
+
+    <!-- Event -->
+    <string name="event">Hendelse</string>
+    <string name="edit_event">Rediger hendelse</string>
+    <string name="new_event">Ny hendelse</string>
+    <string name="create_new_event">Opprett en ny hendelse</string>
+    <string name="duplicate_event">Dupliser hendelse</string>
+    <string name="title_empty">Tittel kan ikke være tom</string>
+    <string name="end_before_start">Hendelsen kan ikke slutte tidligere enn den starter</string>
+    <string name="event_added">Hendelse vellykket lagt til</string>
+    <string name="event_updated">Hendelse vellykket oppdatert</string>
+    <string name="filter_events_by_type">Filtrer hendelser etter type</string>
+    <string name="please_fill_location">Oppfør et sted som skal vises på et kart</string>
+    <string name="public_event_notification_text">En hendelse er forestående</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Gjentagelse</string>
+    <string name="no_repetition">Ingen gjentagelse</string>
+    <string name="daily">Daglig</string>
+    <string name="weekly">Ukentlig</string>
+    <string name="monthly">Månedlig</string>
+    <string name="yearly">Årlig</string>
+    <string name="weeks_raw">uker</string>
+    <string name="months_raw">måneder</string>
+    <string name="years_raw">år</string>
+    <string name="repeat_till">Gjenta til</string>
+    <string name="forever">For alltid</string>
+    <string name="event_is_repeatable">Hendelsen er repeterbar</string>
+    <string name="selection_contains_repetition">Markeringen inneholder gjentagende hendelser</string>
+    <string name="delete_one_only">Slett bare den merkede forekomsten</string>
+    <string name="delete_all_occurrences">Slett alle forekomster</string>
+    <string name="update_one_only">Oppdater bare den merkede forekomsten</string>
+    <string name="update_all_occurrences">Oppdater alle forekomster</string>
+    <string name="repeat_till_date">Gjenta til en dato</string>
+    <string name="repeat_x_times">Gjenta x ganger</string>
+    <string name="repeat_forever">Gjenta for alltid</string>
+    <string name="times">ganger</string>
+    <string name="repeat">Gjenta</string>
+    <string name="repeat_on">Gjenta</string>
+    <string name="every_day">Hver dag</string>
+    <string name="selected_days">På valgte dager</string>
+    <string name="the_same_day">Den samme dagen</string>
+    <string name="the_last_day">Den siste dagen</string>
+    <string name="repeat_on_the_same_day_monthly">Gjenta på den samme dagen hver måned</string>
+    <string name="repeat_on_the_last_day_monthly">Gjenta på den siste dagen i måneden</string>
+    <string name="repeat_on_the_same_day_yearly">Gjenta på den samme dagen hvert år</string>
+    <string name="repeat_every_m">Gjenta hver</string>
+    <string name="every_m">Hver</string>
+    <string name="first_m">første</string>
+    <string name="second_m">andre</string>
+    <string name="third_m">tredje</string>
+    <string name="fourth_m">fjerde</string>
+    <string name="last_m">siste</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Gjenta hver</string>
+    <string name="every_f">Hver</string>
+    <string name="first_f">første</string>
+    <string name="second_f">andre</string>
+    <string name="third_f">tredje</string>
+    <string name="fourth_f">fjerde</string>
+    <string name="last_f">siste</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Bursdager</string>
+    <string name="add_birthdays">Legg til kontaktbursdager</string>
+    <string name="no_birthdays">Ingen bursdager er funnet</string>
+    <string name="birthdays_added">Bursdager vellykket lagt til</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Jubileer</string>
+    <string name="add_anniversaries">Legg til kontaktjubileer</string>
+    <string name="no_anniversaries">Ingen jubileer er funnet</string>
+    <string name="anniversaries_added">Jubileer vellykket lagt til</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Påminnelse</string>
+    <string name="before">før</string>
+    <string name="add_another_reminder">Legg til en annen påminnelse</string>
+    <string name="event_reminders">Hendelsespåminnelser</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importer hendelser</string>
+    <string name="export_events">Eksporter hendelser</string>
+    <string name="import_events_from_ics">Importer hendelser fra en .ics-fil</string>
+    <string name="export_events_to_ics">Eksporter hendelser til en .ics-fil</string>
+    <string name="default_event_type">Standard hendelsestype</string>
+    <string name="export_past_events_too">Eksporter fortidige hendelser også</string>
+    <string name="include_event_types">Inkluder hendelsestyper</string>
+    <string name="filename_without_ics">Filnavn (uten .ics)</string>
+    <string name="override_event_types">Overstyr hendelsestyper i filen</string>
+
+    <!-- Event details -->
+    <string name="title">Tittel</string>
+    <string name="location">Sted</string>
+    <string name="description">Beskrivelse</string>
+    <string name="all_day">Hele dagen</string>
+
+    <!-- Weekly view -->
+    <string name="week">Uke</string>
+
+    <!-- Event types -->
+    <string name="event_types">Hendelsestyper</string>
+    <string name="add_new_type">Legg til en ny type</string>
+    <string name="edit_type">Rediger type</string>
+    <string name="type_already_exists">Type med denne tittelen finnes allerede</string>
+    <string name="color">Farge</string>
+    <string name="regular_event">Vanlig hendelse</string>
+    <string name="cannot_delete_default_type">Standard hendelsestype kan ikke slettes</string>
+    <string name="select_event_type">Velg en hendelsestype</string>
+    <string name="move_events_into_default">Flytt berørte hendelser til standardhendelsestypen</string>
+    <string name="remove_affected_events">Fjern berørte hendelser permanent</string>
+    <string name="unsync_caldav_calendar">For å fjerne en CalDAV-kalender må du desynkronisere den</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Off. fridager</string>
+    <string name="add_holidays">Legg til off. fridager</string>
+    <string name="national_holidays">Nasjonale off. fridager</string>
+    <string name="religious_holidays">Religiøse off. fridager</string>
+    <string name="holidays_imported_successfully">Off. fridager er vellykket importert til hendelsestypen \"Off. fridager\"</string>
+    <string name="importing_some_holidays_failed">Importering av noen hendelser feilet</string>
+    <string name="importing_holidays_failed">Importering av off. fridager feilet</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Behandle hendelsestyper</string>
+    <string name="start_day_at">Start dag kl.</string>
+    <string name="end_day_at">Avslutt dag kl.</string>
+    <string name="week_numbers">Vis ukenummer</string>
+    <string name="vibrate">Vibrer ved påminnelsesvarsel</string>
+    <string name="reminder_sound">Påminnelseslyd</string>
+    <string name="no_ringtone_picker">Ingen app i stand til å sette ringetone funnet</string>
+    <string name="no_ringtone_selected">Ingen</string>
+    <string name="day_end_before_start">Dagen kan ikke slutte tidligere enn den starter</string>
+    <string name="caldav_sync">CalDAV-synkronisering</string>
+    <string name="event_lists">Hendelseslister</string>
+    <string name="display_past_events">Vis hendelser fra fortiden</string>
+    <string name="replace_description_with_location">Erstatt hendelsesbeskrivelse med sted</string>
+    <string name="delete_all_events">Slett alle hendelser</string>
+    <string name="delete_all_events_confirmation">Er du sikker på at du vil slette alle hendelser? Dine hendelsestyper og andre innstillinger blir beholdt.</string>
+    <string name="show_a_grid">Vis rutenett</string>
+    <string name="loop_reminders">Gjenta påminnelser inntil avvist</string>
+    <string name="dim_past_events">Dim tidligere hendelser</string>
+    <string name="events">Hendelser</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Velg kalendere å synkronisere</string>
+    <string name="manage_synced_calendars">Behandle synkroniserte kalendere</string>
+    <string name="store_locally_only">Lagre bare lokalt</string>
+    <string name="refresh_caldav_calendars">Gjenoppfrisk CalDAV-kalendere</string>
+    <string name="refreshing">Gjenoppfrisker…</string>
+    <string name="refreshing_complete">Gjenoppfrisking fullført</string>
+    <string name="editing_calendar_failed">Redigering av kalender feilet</string>
+    <string name="syncing">Synkroniserer…</string>
+    <string name="synchronization_completed">Synkronisering fullført</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Mandag</string>
+    <string name="tuesday_alt">Tirsdag</string>
+    <string name="wednesday_alt">Onsdag</string>
+    <string name="thursday_alt">Torsdag</string>
+    <string name="friday_alt">Fredag</string>
+    <string name="saturday_alt">Lørdag</string>
+    <string name="sunday_alt">Søndag</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Treningsøkt</string>
+    <string name="sample_description_1">Beintrening</string>
+    <string name="sample_title_2">Møte med John</string>
+    <string name="sample_description_2">I hagen</string>
+    <string name="sample_title_3">Bibliotek</string>
+    <string name="sample_title_4">Lunsj med Mari</string>
+    <string name="sample_description_4">På torget</string>
+    <string name="sample_title_5">Kaffepause</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Hvordan kan jeg fjerne off. fridager importert via  meny - \"Legg til off. fridager\"?</string>
+    <string name="faq_1_text">Off. fridager opprettet på denne måten settes inn i en ny hendelsestype kalt \"Off. fridager\". Gå til Innstillinger -> Behandle hendelsestyper,
+        lang-trykk hendelsestypen og slett den ved å velge søppelbøtten.</string>
+    <string name="faq_2_title">Kan jeg synkronisere hendelsene mine via Google Kalender eller annen tjeneste som støtter CalDAV?</string>
+    <string name="faq_2_text">Ja, bare aktiver \"CalDAV-synkronisering\" i innstillingene og velg kalenderne du vil synkronisere. Du trenger imidlertid program som håndterer synkroniseringen mellom enheten og serverne.
+        Hvis du vil synkronisere en Google-kalender, vil deres offisielle kalenderapp gjøre jobben. For andre kalendere trenger du en annen synkroniseringsapp, for eksempel DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">A simple calendar with events, customizable widget and no ads.</string>
+    <string name="app_long_description">
+        A simple calendar with optional CalDAV synchronization. You can easily create recurring events and setup reminders, it can also display week numbers.
+
+        Contains a monthly view and an event list widget where you can customize the color of the text, as well as the alpha and the color of the background.
+
+        Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors.
+
+        The Storage permission is needed only for exporting or importing events from .ics files.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..a6914b604679cf9b4fd32c31cdb65d051204a50d
--- /dev/null
+++ b/app/src/main/res/values-nl/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Eenvoudige Agenda</string>
+    <string name="app_launcher_name">Agenda</string>
+    <string name="change_view">Weergave</string>
+    <string name="daily_view">Dag</string>
+    <string name="weekly_view">Week</string>
+    <string name="monthly_view">Maand</string>
+    <string name="yearly_view">Jaar</string>
+    <string name="simple_event_list">Lijst</string>
+    <string name="no_upcoming_events">Niets gepland.</string>
+    <string name="go_to_today">Naar vandaag</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Maandweergave</string>
+    <string name="widget_list">Afsprakenlijst</string>
+
+    <!-- Event -->
+    <string name="event">Afspraak</string>
+    <string name="edit_event">Afspraak bewerken</string>
+    <string name="new_event">Nieuwe afspraak</string>
+    <string name="create_new_event">Een nieuwe afspraak maken</string>
+    <string name="duplicate_event">Afspraak namaken</string>
+    <string name="title_empty">Titel kan niet leeg zijn</string>
+    <string name="end_before_start">De begintijd valt na de eindtijd</string>
+    <string name="event_added">Afspraak gemaakt</string>
+    <string name="event_updated">Afspraak bijgewerkt</string>
+    <string name="filter_events_by_type">Afspraken op type filteren</string>
+    <string name="please_fill_location">Vul de locatie in om deze op de kaart te tonen</string>
+    <string name="public_event_notification_text">Afspraak aanstaande</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Herhaling</string>
+    <string name="no_repetition">Niet herhalen</string>
+    <string name="daily">Dagelijks</string>
+    <string name="weekly">Wekelijks</string>
+    <string name="monthly">Maandelijks</string>
+    <string name="yearly">Jaarlijks</string>
+    <string name="weeks_raw">weken</string>
+    <string name="months_raw">maanden</string>
+    <string name="years_raw">jaren</string>
+    <string name="repeat_till">Herhalen tot</string>
+    <string name="forever">Blijven herhalen</string>
+    <string name="event_is_repeatable">De afspraak wordt herhaald</string>
+    <string name="selection_contains_repetition">De selectie bevat herhaalde afspraken</string>
+    <string name="delete_one_only">Alleen huidige afspraak verwijderen</string>
+    <string name="delete_all_occurrences">Al deze afspraken verwijderen</string>
+    <string name="update_one_only">Alleen huidige afspraak bijwerken</string>
+    <string name="update_all_occurrences">Alle afspraken bijwerken</string>
+    <string name="repeat_till_date">Herhalen tot datum</string>
+    <string name="repeat_x_times">Aantal keren herhalen</string>
+    <string name="repeat_forever">Voor altijd herhalen</string>
+    <string name="times">keer</string>
+    <string name="repeat">Herhalen</string>
+    <string name="repeat_on">Herhalen op</string>
+    <string name="every_day">Iedere dag</string>
+    <string name="selected_days">Op de volgende dagen</string>
+    <string name="the_same_day">Dezelfde dag</string>
+    <string name="the_last_day">De laatste dag</string>
+    <string name="repeat_on_the_same_day_monthly">Op dezelfde dag van de maand herhalen</string>
+    <string name="repeat_on_the_last_day_monthly">Op de laatste dag van de maand herhalen</string>
+    <string name="repeat_on_the_same_day_yearly">Op dezelfde dag van ieder jaar herhalen</string>
+    <string name="repeat_every_m">Herhalen op elke</string>
+    <string name="every_m">Elke</string>
+    <string name="first_m">eerste</string>
+    <string name="second_m">tweede</string>
+    <string name="third_m">derde</string>
+    <string name="fourth_m">vierde</string>
+    <string name="last_m">laatste</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Herhalen op elke</string>
+    <string name="every_f">Elke</string>
+    <string name="first_f">eerste</string>
+    <string name="second_f">tweede</string>
+    <string name="third_f">derde</string>
+    <string name="fourth_f">vierde</string>
+    <string name="last_f">laatste</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Verjaardagen</string>
+    <string name="add_birthdays">Verjaardagen van contacten toevoegen</string>
+    <string name="no_birthdays">Geen verjaardagen gevonden</string>
+    <string name="birthdays_added">Verjaardagen toegevoegd</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Feestdagen</string>
+    <string name="add_anniversaries">Feestdagen van contacten toevoegen</string>
+    <string name="no_anniversaries">Geen feestdagen gevonden</string>
+    <string name="anniversaries_added">Feestdagen toegevoegd</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Herinnering</string>
+    <string name="before">van tevoren</string>
+    <string name="add_another_reminder">Herinnering toevoegen</string>
+    <string name="event_reminders">Herinneringen</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Afspraken importeren</string>
+    <string name="export_events">Afspraken exporteren</string>
+    <string name="import_events_from_ics">Afspraken uit .ics-bestand importeren</string>
+    <string name="export_events_to_ics">Afspraken naar .ics-bestand exporteren</string>
+    <string name="default_event_type">Standaard afspraaktype</string>
+    <string name="export_past_events_too">Afspraken uit verleden ook exporteren</string>
+    <string name="include_event_types">Afspraaktypes weergeven</string>
+    <string name="filename_without_ics">Bestandsnaam (zonder .ics)</string>
+    <string name="override_event_types">Afspraaktypes uit het bestand negeren</string>
+
+    <!-- Event details -->
+    <string name="title">Titel</string>
+    <string name="location">Locatie</string>
+    <string name="description">Beschrijving</string>
+    <string name="all_day">Hele dag</string>
+
+    <!-- Weekly view -->
+    <string name="week">Week</string>
+
+    <!-- Event types -->
+    <string name="event_types">Afspraaktypes</string>
+    <string name="add_new_type">Type toevoegen</string>
+    <string name="edit_type">Type bewerken</string>
+    <string name="type_already_exists">Type met deze naam bestaat al</string>
+    <string name="color">Kleur</string>
+    <string name="regular_event">Normale afspraak</string>
+    <string name="cannot_delete_default_type">Standaardtype kan niet worden verwijderd</string>
+    <string name="select_event_type">Selecteer een afspraaktype</string>
+    <string name="move_events_into_default">Afspraken van dit type verplaatsen naar het standaardtype</string>
+    <string name="remove_affected_events">Afspraken van dit type permanent verwijderen</string>
+    <string name="unsync_caldav_calendar">Zet synchroniseren uit (Android-instellingen &gt; Accounts) om een CalDAV-agenda te verwijderen</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Feestdagen</string>
+    <string name="add_holidays">Feestdagen toevoegen</string>
+    <string name="national_holidays">Nationale feestdagen</string>
+    <string name="religious_holidays">Religieuze feestdagen</string>
+    <string name="holidays_imported_successfully">De feestdagen zijn geïmporteerd onder afspraaktype \"Feestdagen\"</string>
+    <string name="importing_some_holidays_failed">Sommige feestdagen konden niet worden geïmporteerd</string>
+    <string name="importing_holidays_failed">Fout bij importeren van feestdagen</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Afspraaktypes beheren</string>
+    <string name="start_day_at">Dag starten om</string>
+    <string name="end_day_at">Dag beëindigen om</string>
+    <string name="week_numbers">Weeknummers tonen</string>
+    <string name="vibrate">Trillen bij notificaties</string>
+    <string name="reminder_sound">Geluid voor herinnering</string>
+    <string name="no_ringtone_picker">Geen app gevonden om geluid te kiezen</string>
+    <string name="no_ringtone_selected">Geen</string>
+    <string name="day_end_before_start">De begintijd valt na de eindtijd</string>
+    <string name="caldav_sync">CalDAV-synchronisatie</string>
+    <string name="event_lists">Afsprakenlijst</string>
+    <string name="display_past_events">Afgelopen afspraken tonen</string>
+    <string name="replace_description_with_location">Beschrijving vervangen door locatie van afspraken</string>
+    <string name="delete_all_events">Alle afspraken verwijderen</string>
+    <string name="delete_all_events_confirmation">Alle afspraken verwijderen? Afspraaktypes en andere instellingen blijven behouden.</string>
+    <string name="show_a_grid">Rasterlijnen tonen</string>
+    <string name="loop_reminders">Herinneringen blijven herhalen totdat ze zijn uitgezet</string>
+    <string name="dim_past_events">Afgelopen afspraken dimmen</string>
+    <string name="events">Afspraken</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Selecteer te synchroniseren agenda\'s</string>
+    <string name="manage_synced_calendars">Gesynchroniseerde agenda\'s beheren</string>
+    <string name="store_locally_only">Alleen lokaal opslaan</string>
+    <string name="refresh_caldav_calendars">CalDAV-agenda\'s synchroniseren</string>
+    <string name="refreshing">Verversen…</string>
+    <string name="refreshing_complete">Agenda\'s ververst</string>
+    <string name="editing_calendar_failed">Agenda bijwerken mislukt</string>
+    <string name="syncing">Synchroniseren…</string>
+    <string name="synchronization_completed">Synchroniseren voltooid</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">maandag</string>
+    <string name="tuesday_alt">dinsdag</string>
+    <string name="wednesday_alt">woensdag</string>
+    <string name="thursday_alt">donderdag</string>
+    <string name="friday_alt">vrijdag</string>
+    <string name="saturday_alt">zaterdag</string>
+    <string name="sunday_alt">zondag</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Training</string>
+    <string name="sample_description_1">Hardlopen</string>
+    <string name="sample_title_2">Afspraak met Willem</string>
+    <string name="sample_description_2">Op de Markt</string>
+    <string name="sample_title_3">Bibliotheek</string>
+    <string name="sample_title_4">Lunch met Jacquelien</string>
+    <string name="sample_description_4">Aan de kade</string>
+    <string name="sample_title_5">Koffietijd</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Hoe kan ik de feestdagen die zijn geïmporteerd via \"Feestdagen toevoegen\" weer verwijderen?</string>
+    <string name="faq_1_text">Deze feestdagen hebben het afspraaktype \"Feestdagen\". Om de feestdagen te verwijderen, ga naar Instellingen -> Afspraaktypes beheren,
+        druk lang op \"Feestdagen\" en druk vervolgens op de prullenbak.</string>
+    <string name="faq_2_title">Kan ik mijn afspraken synchroniseren met Google Calendar of een andere service die CalDAV ondersteunt?</string>
+    <string name="faq_2_text">Schakel \"CalDAV-synchronisatie\" in bij Instellingen en selecteer vervolgens de agenda\'s die gesynchroniseerd moeten worden. Er is wel een app nodig die de synchronisatie tussen het apparaat en de service zelf afhandelt.
+        Betreft het een agenda van Google Calendar, dan voldoet hun officiële app. Voor andere services zal een adapter zoals DAVdroid benodigd zijn.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Een simpele agenda met aan te passen widget en zonder advertenties.</string>
+    <string name="app_long_description">
+        Een simpele agenda met optionele CalDAV-synchronisatie. Creëer met gemak herhaalde afspraken met herinneringen. Kan weeknummers tonen.
+
+        Heeft een 4x4 widget, waarbij grootte, achtergrond- en tekstkleuren zijn aan te passen.
+
+        Bevat geen advertenties of onnodige machtigingen. Volledig open-source. Kleuren van de app kunnen worden aangepast.
+
+        De machtiging voor externe opslag is alleen nodig voor het importeren/exporteren van afspraken in .ics-bestanden.
+
+        De machtiging voor contacten wordt alleen gebruikt voor het importeren van verjaardagen en feestdagen.
+
+        Deze app is onderdeel van een grotere verzameling. Vind de andere apps op https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-no/strings.xml b/app/src/main/res/values-no/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9546b463556da4caf48da8b00f6ec9fc7eeffb8d
--- /dev/null
+++ b/app/src/main/res/values-no/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Kalender</string>
+    <string name="change_view">Endre visning</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">Ukevisning</string>
+    <string name="monthly_view">Månedsvisning</string>
+    <string name="yearly_view">Årsvisning</string>
+    <string name="simple_event_list">Enkel hendelsesliste</string>
+    <string name="no_upcoming_events">Ser ut som du ikke har noen kommende hendelser.</string>
+    <string name="go_to_today">Gå til idag</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Månedskalender</string>
+    <string name="widget_list">Hendelsesliste</string>
+
+    <!-- Event -->
+    <string name="event">Hendelse</string>
+    <string name="edit_event">Rediger hendelse</string>
+    <string name="new_event">Ny hendelse</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Tittel kan ikke være tom</string>
+    <string name="end_before_start">Hendelsen kan ikke slutte tidligere enn den starter</string>
+    <string name="event_added">Hendelse vellykket lagt til</string>
+    <string name="event_updated">Hendelse vellykket oppdatert</string>
+    <string name="filter_events_by_type">Filtrer hendelser etter type</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Gjentagelse</string>
+    <string name="no_repetition">Ingen gjentagelse</string>
+    <string name="daily">Daglig</string>
+    <string name="weekly">Ukentlig</string>
+    <string name="monthly">Månedlig</string>
+    <string name="yearly">Årlig</string>
+    <string name="weeks_raw">uker</string>
+    <string name="months_raw">måneder</string>
+    <string name="years_raw">år</string>
+    <string name="repeat_till">Gjenta til</string>
+    <string name="forever">For alltid</string>
+    <string name="event_is_repeatable">Hendelsen er repeterbar</string>
+    <string name="selection_contains_repetition">Markeringen inneholder gjentagende hendelser</string>
+    <string name="delete_one_only">Slett bare den merkede forekomsten</string>
+    <string name="delete_all_occurrences">Slett alle forekomster</string>
+    <string name="update_one_only">Oppdater bare den merkede forekomsten</string>
+    <string name="update_all_occurrences">Oppdater alle forekomster</string>
+    <string name="repeat_till_date">Gjenta til en dato</string>
+    <string name="repeat_x_times">Gjenta x ganger</string>
+    <string name="repeat_forever">Gjenta for alltid</string>
+    <string name="times">ganger</string>
+    <string name="repeat">Gjenta</string>
+    <string name="repeat_on">Gjenta</string>
+    <string name="every_day">Hver dag</string>
+    <string name="selected_days">På valgte dager</string>
+    <string name="the_same_day">Den samme dagen</string>
+    <string name="the_last_day">Den siste dagen</string>
+    <string name="repeat_on_the_same_day_monthly">Gjenta på den samme dagen hver måned</string>
+    <string name="repeat_on_the_last_day_monthly">Gjenta på den siste dagen i måneden</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Gjenta hver</string>
+    <string name="every_m">Hver</string>
+    <string name="first_m">første</string>
+    <string name="second_m">andre</string>
+    <string name="third_m">tredje</string>
+    <string name="fourth_m">fjerde</string>
+    <string name="last_m">siste</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Gjenta hver</string>
+    <string name="every_f">Hver</string>
+    <string name="first_f">første</string>
+    <string name="second_f">andre</string>
+    <string name="third_f">tredje</string>
+    <string name="fourth_f">fjerde</string>
+    <string name="last_f">siste</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Bursdager</string>
+    <string name="add_birthdays">Legg til kontaktbursdager</string>
+    <string name="no_birthdays">Ingen bursdager er funnet</string>
+    <string name="birthdays_added">Bursdager vellykket lagt til</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Jubileer</string>
+    <string name="add_anniversaries">Legg til kontaktjubileer</string>
+    <string name="no_anniversaries">Ingen jubileer er funnet</string>
+    <string name="anniversaries_added">Jubileer vellykket lagt til</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Påminnelse</string>
+    <string name="before">før</string>
+    <string name="add_another_reminder">Legg til en annen påminnelse</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importer hendelser</string>
+    <string name="export_events">Eksporter hendelser</string>
+    <string name="import_events_from_ics">Importer hendelser fra en .ics-fil</string>
+    <string name="export_events_to_ics">Eksporter hendelser til en .ics-fil</string>
+    <string name="default_event_type">Standard hendelsestype</string>
+    <string name="export_past_events_too">Eksporter fortidige hendelser også</string>
+    <string name="include_event_types">Inkluder hendelsestyper</string>
+    <string name="filename_without_ics">Filnavn (uten .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Tittel</string>
+    <string name="location">Sted</string>
+    <string name="description">Beskrivelse</string>
+    <string name="all_day">Hele dagen</string>
+
+    <!-- Weekly view -->
+    <string name="week">Uke</string>
+
+    <!-- Event types -->
+    <string name="event_types">Hendelsestyper</string>
+    <string name="add_new_type">Legg til en ny type</string>
+    <string name="edit_type">Rediger type</string>
+    <string name="type_already_exists">Type med denne tittelen finnes allerede</string>
+    <string name="color">Farge</string>
+    <string name="regular_event">Vanlig hendelse</string>
+    <string name="cannot_delete_default_type">Standard hendelsestype kan ikke slettes</string>
+    <string name="select_event_type">Velg en hendelsestype</string>
+    <string name="move_events_into_default">Flytt berørte hendelser til standardhendelsestypen</string>
+    <string name="remove_affected_events">Fjern berørte hendelser permanent</string>
+    <string name="unsync_caldav_calendar">For å fjerne en CalDAV-kalender må du desynkronisere den</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Off. fridager</string>
+    <string name="add_holidays">Legg til off. fridager</string>
+    <string name="national_holidays">Nasjonale off. fridager</string>
+    <string name="religious_holidays">Religiøse off. fridager</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Importering av noen hendelser feilet</string>
+    <string name="importing_holidays_failed">Importering av off. fridager feilet</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Behandle hendelsestyper</string>
+    <string name="start_day_at">Start dag kl.</string>
+    <string name="end_day_at">Avslutt dag kl.</string>
+    <string name="week_numbers">Vis ukenummer</string>
+    <string name="vibrate">Vibrer ved påminnelsesvarsel</string>
+    <string name="reminder_sound">Påminnelseslyd</string>
+    <string name="no_ringtone_picker">Ingen app i stand til å sette ringetone funnet</string>
+    <string name="no_ringtone_selected">Ingen</string>
+    <string name="day_end_before_start">Dagen kan ikke slutte tidligere enn den starter</string>
+    <string name="caldav_sync">CalDAV-synkronisering</string>
+    <string name="event_lists">Hendelseslister</string>
+    <string name="display_past_events">Vis hendelser fra fortiden</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Velg kalendere å synkronisere</string>
+    <string name="manage_synced_calendars">Behandle synkroniserte kalendere</string>
+    <string name="store_locally_only">Lagre bare lokalt</string>
+    <string name="refresh_caldav_calendars">Gjenoppfrisk CalDAV-kalendere</string>
+    <string name="refreshing">Gjenoppfrisker…</string>
+    <string name="refreshing_complete">Gjenoppfrisking fullført</string>
+    <string name="editing_calendar_failed">Redigering av kalender feilet</string>
+    <string name="syncing">Synkroniserer…</string>
+    <string name="synchronization_completed">Synkronisering fullført</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Mandag</string>
+    <string name="tuesday_alt">Tirsdag</string>
+    <string name="wednesday_alt">Onsdag</string>
+    <string name="thursday_alt">Torsdag</string>
+    <string name="friday_alt">Fredag</string>
+    <string name="saturday_alt">Lørdag</string>
+    <string name="sunday_alt">Søndag</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Workout</string>
+    <string name="sample_description_1">Leg day</string>
+    <string name="sample_title_2">Meeting with John</string>
+    <string name="sample_description_2">In Rockstone garden</string>
+    <string name="sample_title_3">Library</string>
+    <string name="sample_title_4">Lunch with Mary</string>
+    <string name="sample_description_4">In the Plaza</string>
+    <string name="sample_title_5">Coffee time</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">A simple calendar with events, customizable widget and no ads.</string>
+    <string name="app_long_description">
+        A simple calendar with optional CalDAV synchronization. You can easily create recurring events and setup reminders, it can also display week numbers.
+
+        Contains a monthly view and an event list widget where you can customize the color of the text, as well as the alpha and the color of the background.
+
+        Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors.
+
+        The Storage permission is needed only for exporting or importing events from .ics files.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2a6520e0a211c9dd71c46d255c0d0b0451cd87fb
--- /dev/null
+++ b/app/src/main/res/values-pl/strings.xml
@@ -0,0 +1,221 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Prosty Kalendarz</string>
+    <string name="app_launcher_name">Prosty Kalendarz</string>
+    <string name="change_view">Zmień widok</string>
+    <string name="daily_view">Dzień</string>
+    <string name="weekly_view">Tydzień</string>
+    <string name="monthly_view">Miesiąc</string>
+    <string name="yearly_view">Rok</string>
+    <string name="simple_event_list">Prosta lista zdarzeń</string>
+    <string name="no_upcoming_events">Wygląda na to, że nie masz żadnych nadchodzących wydarzeń.</string>
+    <string name="go_to_today">Przejdź do dnia dzisiejszego</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Prosty Kalendarz - widok miesięczny</string>
+    <string name="widget_list">Prosty Kalendarz - lista wydarzeń</string>
+
+    <!-- Event -->
+    <string name="event">Wydarzenie</string>
+    <string name="edit_event">Edytuj wydarzenie</string>
+    <string name="new_event">Nowe wydarzenie</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Tytuł nie może być pusty</string>
+    <string name="end_before_start">Wydarzenie nie może zakończyć się wcześniej, niż się zaczyna</string>
+    <string name="event_added">Wydarzenie zostało dodane</string>
+    <string name="event_updated">Wydarzenie zostało zaktualizowane</string>
+    <string name="filter_events_by_type">Filtruj wydarzenia według typu</string>
+    <string name="please_fill_location">Wpisz lokalizację, która ma być pokazana na mapie</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Powtórzenie</string>
+    <string name="no_repetition">Brak powtórzenia</string>
+    <string name="daily">Codziennie</string>
+    <string name="weekly">Co tydzień</string>
+    <string name="monthly">Co miesiąc</string>
+    <string name="yearly">Co rok</string>
+    <string name="weeks_raw">tygodnie</string>
+    <string name="months_raw">miesiące</string>
+    <string name="years_raw">lata</string>
+    <string name="repeat_till">Powtarzaj do</string>
+    <string name="forever">Końca świata</string>
+    <string name="event_is_repeatable">Wydarzenie jest powtarzalne</string>
+    <string name="selection_contains_repetition">Wybór zawiera powtarzające się wydarzenia</string>
+    <string name="delete_one_only">Usuń tylko wybrane wystąpienie</string>
+    <string name="delete_all_occurrences">Usuń wszystkie wystąpienia</string>
+    <string name="update_one_only">Zaktualizuj tylko wybrane wystąpienia</string>
+    <string name="update_all_occurrences">Zaktualizuj wszystkie wystąpienia</string>
+    <string name="repeat_till_date">Powtarzaj do daty</string>
+    <string name="repeat_x_times">Powtórz x razy</string>
+    <string name="repeat_forever">Powtarzaj do końca świata</string>
+    <string name="times">razy</string>
+    <string name="repeat">Powtórz</string>
+    <string name="repeat_on">Powtórz</string>
+    <string name="every_day">Codziennie</string>
+    <string name="selected_days">Przez wybrane dni</string>
+    <string name="the_same_day">Tego samego dnia</string>
+    <string name="the_last_day">Ostatniego dnia</string>
+    <string name="repeat_on_the_same_day_monthly">Powtarzaj tego samego dnia każdego miesiąca</string>
+    <string name="repeat_on_the_last_day_monthly">Powtarzaj ostatniego dnia każdego miesiąca</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Powtarzaj w każdy(ą)</string>
+    <string name="every_m">Każdy(ą)</string>
+    <string name="first_m">pierwszy(ą)</string>
+    <string name="second_m">drugi(ą)</string>
+    <string name="third_m">trzeci(ą)</string>
+    <string name="fourth_m">czwarty(ą)</string>
+    <string name="last_m">ostatni(ą)</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Powtarzaj w każdy(ą)</string>
+    <string name="every_f">Każdy(ą)</string>
+    <string name="first_f">pierwszy(ą)</string>
+    <string name="second_f">drugi(ą)</string>
+    <string name="third_f">trzeci(ą)</string>
+    <string name="fourth_f">czwarty(ą)</string>
+    <string name="last_f">ostatni(ą)</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Urodziny</string>
+    <string name="add_birthdays">Dodaj urodziny kontaktów</string>
+    <string name="no_birthdays">Nie znaleziono żadnych urodzin</string>
+    <string name="birthdays_added">Urodziny zostały dodane</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Rocznice</string>
+    <string name="add_anniversaries">Dodaj rocznice kontaktów</string>
+    <string name="no_anniversaries">Nie znaleziono żadnych rocznic</string>
+    <string name="anniversaries_added">Rocznice zostały dodane</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Przypomnienie</string>
+    <string name="before">przed</string>
+    <string name="add_another_reminder">Dodaj inne przypomnienie</string>
+    <string name="event_reminders">Przypomnienia</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importuj wydarzenia</string>
+    <string name="export_events">Eksportuj wydarzenia</string>
+    <string name="import_events_from_ics">Importuj wydarzenia z pliku .ics</string>
+    <string name="export_events_to_ics">Eksportuj wydarzenia do pliku .ics</string>
+    <string name="default_event_type">Domyślny typ wydarzenia</string>
+    <string name="export_past_events_too">Eksportuj także wydarzenia z przeszłości</string>
+    <string name="include_event_types">Dołącz typy wydarzeń</string>
+    <string name="filename_without_ics">Nazwa pliku (bez końcówki \".ics\")</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Tytuł</string>
+    <string name="location">Lokalizacja</string>
+    <string name="description">Opis</string>
+    <string name="all_day">Całodniowe</string>
+
+    <!-- Weekly view -->
+    <string name="week">Tydzień</string>
+
+    <!-- Event types -->
+    <string name="event_types">Typy wydarzeń</string>
+    <string name="add_new_type">Dodaj nowy typ</string>
+    <string name="edit_type">Edytuj typ</string>
+    <string name="type_already_exists">Typ ten już istnieje</string>
+    <string name="color">Kolor</string>
+    <string name="regular_event">Zwykłe wydarzenie</string>
+    <string name="cannot_delete_default_type">Domyślne wydarzenie nie może zostać usunięte</string>
+    <string name="select_event_type">Wybierz typ wydarzenia</string>
+    <string name="move_events_into_default">Przenieś powiązane wydarzenia do domyślnego typu wydarzeń</string>
+    <string name="remove_affected_events">Usuń powiązane wydarzenia</string>
+    <string name="unsync_caldav_calendar">Aby usunąć kalendarz CalDAV, musisz wyłączyć jego synchronizację</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Święta</string>
+    <string name="add_holidays">Dodaj święto</string>
+    <string name="national_holidays">Święta państwowe</string>
+    <string name="religious_holidays">Święta religijne</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Importowanie niektórych świąt nie powiodło się</string>
+    <string name="importing_holidays_failed">Importowanie świąt nie powiodło się</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Zarządzaj typami wydarzeń</string>
+    <string name="start_day_at">Początek dnia</string>
+    <string name="end_day_at">Koniec dnia</string>
+    <string name="week_numbers">Pokazuj numery tygodnia</string>
+    <string name="vibrate">Powiadamiaj wibracjami o wydarzeniu</string>
+    <string name="reminder_sound">Dźwięk powiadomień</string>
+    <string name="no_ringtone_picker">Nie znalazłem aplikacji mogącej ustawiać dzwonki</string>
+    <string name="no_ringtone_selected">Żaden</string>
+    <string name="day_end_before_start">Dzień nie może zakończyć się wcześniej niż się zaczyna</string>
+    <string name="caldav_sync">Synchronizacja CalDAV</string>
+    <string name="event_lists">Lista wydarzeń</string>
+    <string name="display_past_events">Pokazuj wydarzenia z przeszłości</string>
+    <string name="replace_description_with_location">Zamieniaj opis wydarzenia na lokalizację</string>
+    <string name="delete_all_events">Usuń wszystkie wydarzenia</string>
+    <string name="delete_all_events_confirmation">Czy na pewno mam usunąć wszystkie wydarzenia? Nie naruszy to typów wydarzeń i innych ustawień.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Wybierz kalendarze, które chcesz zsynchronizować</string>
+    <string name="manage_synced_calendars">Zarządzaj zsynchronizowanymi kalendarzami</string>
+    <string name="store_locally_only">Przechowuj lokalnie</string>
+    <string name="refresh_caldav_calendars">Odśwież kalendarze CalDAV</string>
+    <string name="refreshing">Odświeżanie…</string>
+    <string name="refreshing_complete">Odświeżanie zakończone</string>
+    <string name="editing_calendar_failed">Edytowanie kalendarza nie powiodło się</string>
+    <string name="syncing">Synchronizowanie…</string>
+    <string name="synchronization_completed">Synchronizacja zakończona</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Poniedziałek</string>
+    <string name="tuesday_alt">Wtorek</string>
+    <string name="wednesday_alt">Środę</string>
+    <string name="thursday_alt">Czwartek</string>
+    <string name="friday_alt">Piątek</string>
+    <string name="saturday_alt">Sobotę</string>
+    <string name="sunday_alt">Niedzielę</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Trening</string>
+    <string name="sample_description_1">Dziś robimy nogi</string>
+    <string name="sample_title_2">Spotkanie z Januszem</string>
+    <string name="sample_description_2">W sprawach biznesowych</string>
+    <string name="sample_title_3">Bibiloteka</string>
+    <string name="sample_title_4">Kolacja z ukochaną</string>
+    <string name="sample_description_4">Przy blasku zachodzącego słońca</string>
+    <string name="sample_title_5">Czas na kawę</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Jak mogę usunąć święta zaimportowane przez przycisk \'Dodaj święta\'?</string>
+    <string name="faq_1_text">Święta dodane w ten sposób są wprowadzane do nowego typu wydarzeń - \'Święta\'. Usunąć je możesz, przechodząc do ustawień aplikacji, a następnie w sekcji \'Zarządzaj typami wydarzeń\' usunąć ową kategorię, klikając ikonę kosza.</string>
+    <string name="faq_2_title">Czy mogę zsychronizować moje wydarzenia z Kalendarzem Google lub inną usługą wspierającą CalDAV?</string>
+    <string name="faq_2_text">Tak. Wystarczy włączyć opcję \'Synchronizacja CalDAV\' w ustawieniach aplikacji i wybrać kalendarze do synchronizacji. Jeśli chcesz zsynchronizować wydarzenia z Kalendarzem Google, oficjalna aplikacja kalendarza powinna wystarczyć. W innych przypadkach potrzebna może być zewnętrzna aplikacja, np. DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Prosty kalendarz z wydarzeniami, widżetami i bez reklam.</string>
+    <string name="app_long_description">
+        Prosty kalendarz z obsługą synchronizacji z Dyskiem Google. Dzięki niemu możesz z łatwością tworzyć wydarzenia i przypomnienia, które nigdy nie zaginą.
+
+        Zawiera widżet 4x4 z możliwością ustawiania koloru tekstu i tła, a dla tego drugiego również stopień przezroczystości.
+
+        Nie zawiera żadnych żadnych reklam, nie potrzebuje masy uprawnień, jest w pełni otwartoźródłowy, kolory można dowolnie modyfikować.
+
+        Uprawniena pamięci są potrzebne tylko do eksportowania lub importowania wydarzeń z plików .isc.
+
+        Uprawnienia kontaktów są używane tylko do importowania urodzin.
+
+        Niniejsza aplikacja jest tylko częścią naszej kolekcji prostych narzędzi. Ta, jak i pozostałe, dostępne są na stronie https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..92a1daa126dc2061c69beb980fce29efd61ab35f
--- /dev/null
+++ b/app/src/main/res/values-pt-rBR/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Calendário</string>
+    <string name="change_view">Mudar vista</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">Vista semanal</string>
+    <string name="monthly_view">Vista mensal</string>
+    <string name="yearly_view">Vista anual</string>
+    <string name="simple_event_list">Lista de eventos</string>
+    <string name="no_upcoming_events">Parece que você não tem eventos próximos.</string>
+    <string name="go_to_today">Ir para hoje</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Calendário mensal</string>
+    <string name="widget_list">Lista de eventos</string>
+
+    <!-- Event -->
+    <string name="event">Evento</string>
+    <string name="edit_event">Editar evento</string>
+    <string name="new_event">Novo evento</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">O título não pode ficar vazio</string>
+    <string name="end_before_start">O evento não pode terminar antes de iniciar</string>
+    <string name="event_added">Evento adicionado com sucesso</string>
+    <string name="event_updated">Evento atualizado com sucesso</string>
+    <string name="filter_events_by_type">Filtrar eventos por tipo</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Repetição</string>
+    <string name="no_repetition">Sem repetição</string>
+    <string name="daily">Diária</string>
+    <string name="weekly">Semanal</string>
+    <string name="monthly">Mensal</string>
+    <string name="yearly">Anual</string>
+    <string name="weeks_raw">semanas</string>
+    <string name="months_raw">meses</string>
+    <string name="years_raw">anos</string>
+    <string name="repeat_till">Repetir até</string>
+    <string name="forever">Eternamente</string>
+    <string name="event_is_repeatable">The event is repeatable</string>
+    <string name="selection_contains_repetition">A seleção contém eventos recorrentes</string>
+    <string name="delete_one_only">Apagar a ocorrência selecionada</string>
+    <string name="delete_all_occurrences">Apagar todas as ocorrências</string>
+    <string name="update_one_only">Atualizar a ocorrência selecionada</string>
+    <string name="update_all_occurrences">Atualizar todas as ocorrências</string>
+    <string name="repeat_till_date">Repetir até uma data</string>
+    <string name="repeat_x_times">Repetir x vezes</string>
+    <string name="repeat_forever">Repetir para sempre</string>
+    <string name="times">vezes</string>
+    <string name="repeat">Repetir</string>
+    <string name="repeat_on">Repetir</string>
+    <string name="every_day">Todo dia</string>
+    <string name="selected_days">Em dias selecionados</string>
+    <string name="the_same_day">The same day</string>
+    <string name="the_last_day">The last day</string>
+    <string name="repeat_on_the_same_day_monthly">Repeat on the same day each month</string>
+    <string name="repeat_on_the_last_day_monthly">Repeat on the last day of the month</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Repeat every</string>
+    <string name="every_m">A cada</string>
+    <string name="first_m">primeiro</string>
+    <string name="second_m">segundo</string>
+    <string name="third_m">terceiro</string>
+    <string name="fourth_m">quarto</string>
+    <string name="last_m">último</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repeat every</string>
+    <string name="every_f">Every</string>
+    <string name="first_f">first</string>
+    <string name="second_f">second</string>
+    <string name="third_f">third</string>
+    <string name="fourth_f">fourth</string>
+    <string name="last_f">last</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Birthdays</string>
+    <string name="add_birthdays">Add contact birthdays</string>
+    <string name="no_birthdays">No birthdays have been found</string>
+    <string name="birthdays_added">Birthdays added successfully</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversaries</string>
+    <string name="add_anniversaries">Add contact anniversaries</string>
+    <string name="no_anniversaries">No anniversaries have been found</string>
+    <string name="anniversaries_added">Anniversaries added successfully</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Lembrete</string>
+    <string name="before">antes</string>
+    <string name="add_another_reminder">Adicionar outro lembrete</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importar eventos</string>
+    <string name="export_events">Exportar eventos</string>
+    <string name="import_events_from_ics">Importar eventos de um arquivo .ics</string>
+    <string name="export_events_to_ics">Export events to an .ics file</string>
+    <string name="default_event_type">Tipo de evento padrão</string>
+    <string name="export_past_events_too">Export past events too</string>
+    <string name="include_event_types">Include event types</string>
+    <string name="filename_without_ics">Filename (without .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Título</string>
+    <string name="location">Location</string>
+    <string name="description">Descrição</string>
+    <string name="all_day">O dia todo</string>
+
+    <!-- Weekly view -->
+    <string name="week">Semana</string>
+
+    <!-- Event types -->
+    <string name="event_types">Tipos de evento</string>
+    <string name="add_new_type">Adicionar um tipo</string>
+    <string name="edit_type">Editar tipo</string>
+    <string name="type_already_exists">Já existe um tipo com este nome</string>
+    <string name="color">Cor</string>
+    <string name="regular_event">Evento regular</string>
+    <string name="cannot_delete_default_type">O tipo de evento padrão não pode ser apagado</string>
+    <string name="select_event_type">Selecione um tipo de evento</string>
+    <string name="move_events_into_default">Move affected events into the default event type</string>
+    <string name="remove_affected_events">Permanently remove affected events</string>
+    <string name="unsync_caldav_calendar">To remove a CalDAV calendar you have to unsynchronize it</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Holidays</string>
+    <string name="add_holidays">Add holidays</string>
+    <string name="national_holidays">National holidays</string>
+    <string name="religious_holidays">Religious holidays</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Importing some events failed</string>
+    <string name="importing_holidays_failed">Importing holidays failed</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Gerenciar tipos de eventos</string>
+    <string name="start_day_at">Iniciar vista semanal em</string>
+    <string name="end_day_at">Terminar vista semanal em</string>
+    <string name="week_numbers">Mostrar número das semanas</string>
+    <string name="vibrate">Vibrar ao notificar sobre o lembrete</string>
+    <string name="reminder_sound">Som do lembrete</string>
+    <string name="no_ringtone_picker">Não foi encontrado nenhum aplicativo capaz de definir o som</string>
+    <string name="no_ringtone_selected">Nenhum</string>
+    <string name="day_end_before_start">O dia final não pode ser antes do início</string>
+    <string name="caldav_sync">CalDAV sync</string>
+    <string name="event_lists">Event lists</string>
+    <string name="display_past_events">Display events from the past</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Select calendars to sync</string>
+    <string name="manage_synced_calendars">Manage synced calendars</string>
+    <string name="store_locally_only">Store locally only</string>
+    <string name="refresh_caldav_calendars">Refresh CalDAV calendars</string>
+    <string name="refreshing">Refreshing…</string>
+    <string name="refreshing_complete">Refreshing complete</string>
+    <string name="editing_calendar_failed">Editing calendar failed</string>
+    <string name="syncing">Syncing…</string>
+    <string name="synchronization_completed">Sync completed</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Monday</string>
+    <string name="tuesday_alt">Tuesday</string>
+    <string name="wednesday_alt">Wednesday</string>
+    <string name="thursday_alt">Thursday</string>
+    <string name="friday_alt">Friday</string>
+    <string name="saturday_alt">Saturday</string>
+    <string name="sunday_alt">Sunday</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Ir ao ginásio</string>
+    <string name="sample_description_1">Ir às compras</string>
+    <string name="sample_title_2">Reunião com o João</string>
+    <string name="sample_description_2">Passear no jardim</string>
+    <string name="sample_title_3">Ir à biblioteca</string>
+    <string name="sample_title_4">Almoçar com a Maria</string>
+    <string name="sample_description_4">Ir ao mercado</string>
+    <string name="sample_title_5">Beber um café</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Um calendário para adicionar eventos, com um widget personalizável.</string>
+    <string name="app_long_description">
+        Um calendário que não possui qualquer tipo de integração. Pode-se adicionar eventos e lembretes recorrentes, e possui uma opção para mostrar o número da semana.
+
+        Contém um widget 4x4, em que se pode personalizar a cor do texto, bem como a cor e o valor alfa do fundo.
+
+        Não contém anúncios nem permissões desnecessárias. Disponibiliza um tema escuro, e é totalmente \'open source\'.
+
+        A permissão de armazenamento é necessária apenas para importar eventos dos arquivos .ics.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        Este aplicativo é apenas parte de um conjunto mais vasto de aplicações. Saiba mais em https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Não encontrou todas as cadeias a traduzir? Existem mais algumas em:
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6664e0a0778c420126e847ae48886ca6039ec495
--- /dev/null
+++ b/app/src/main/res/values-pt/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Calendário</string>
+    <string name="change_view">Mudar vista</string>
+    <string name="daily_view">Vista diária</string>
+    <string name="weekly_view">Vista semanal</string>
+    <string name="monthly_view">Vista mensal</string>
+    <string name="yearly_view">Vista anual</string>
+    <string name="simple_event_list">Lista de eventos</string>
+    <string name="no_upcoming_events">Parece que você não tem eventos para breve</string>
+    <string name="go_to_today">Ir para hoje</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Calendário mensal</string>
+    <string name="widget_list">Lista de eventos</string>
+
+    <!-- Event -->
+    <string name="event">Evento</string>
+    <string name="edit_event">Editar evento</string>
+    <string name="new_event">Novo evento</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">O título não pode estar vazio</string>
+    <string name="end_before_start">O evento não pode terminar antes de iniciar</string>
+    <string name="event_added">Evento adicionado com sucesso</string>
+    <string name="event_updated">Evento atualizado com sucesso</string>
+    <string name="filter_events_by_type">Filtrar eventos por tipo</string>
+    <string name="please_fill_location">Introduza a localização para a mostrar no maps</string>
+    <string name="public_event_notification_text">Está para breve um evento</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Repetição</string>
+    <string name="no_repetition">Sem repetição</string>
+    <string name="daily">Diária</string>
+    <string name="weekly">Semanal</string>
+    <string name="monthly">Mensal</string>
+    <string name="yearly">Anual</string>
+    <string name="weeks_raw">semanas</string>
+    <string name="months_raw">meses</string>
+    <string name="years_raw">anos</string>
+    <string name="repeat_till">Repetir até</string>
+    <string name="forever">Eternamente</string>
+    <string name="event_is_repeatable">O evento é repetível</string>
+    <string name="selection_contains_repetition">A seleção contém eventos recorrentes</string>
+    <string name="delete_one_only">Apagar a ocorrência selecionada</string>
+    <string name="delete_all_occurrences">Apagar todas as ocorrências</string>
+    <string name="update_one_only">Atualizar a ocorrência selecionada</string>
+    <string name="update_all_occurrences">Atualizar todas as ocorrências</string>
+    <string name="repeat_till_date">Repetir até à data</string>
+    <string name="repeat_x_times">Repetir x vezes</string>
+    <string name="repeat_forever">Repetir eternamente</string>
+    <string name="times">vezes</string>
+    <string name="repeat">Repetição</string>
+    <string name="repeat_on">Repetir em</string>
+    <string name="every_day">Todos os dias</string>
+    <string name="selected_days">Dias selecionados</string>
+    <string name="the_same_day">Mesmo dia</string>
+    <string name="the_last_day">Último dia</string>
+    <string name="repeat_on_the_same_day_monthly">Repetir no mesmo dia de cada mês</string>
+    <string name="repeat_on_the_last_day_monthly">Repetir no último dia de cada mês</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Repetir</string>
+    <string name="every_m">A cada</string>
+    <string name="first_m">primeira</string>
+    <string name="second_m">segunda</string>
+    <string name="third_m">terceira</string>
+    <string name="fourth_m">quarta</string>
+    <string name="last_m">última</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repetir</string>
+    <string name="every_f">A cada</string>
+    <string name="first_f">primeiro</string>
+    <string name="second_f">segundo</string>
+    <string name="third_f">terceiro</string>
+    <string name="fourth_f">quarto</string>
+    <string name="last_f">último</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Data de nascimento</string>
+    <string name="add_birthdays">Adicionar data de nascimento dos contactos</string>
+    <string name="no_birthdays">Não foram encontradas datas de nascimento</string>
+    <string name="birthdays_added">Datas de nascimento adicionadas com sucesso</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Aniversários</string>
+    <string name="add_anniversaries">Adicionar aniversários dos contactos</string>
+    <string name="no_anniversaries">Não foram encontrados aniversários</string>
+    <string name="anniversaries_added">Aniversários adicionados com sucesso</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Lembrete</string>
+    <string name="before">antes</string>
+    <string name="add_another_reminder">Adicionar outro lembrete</string>
+    <string name="event_reminders">Lembretes para eventos</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importar eventos</string>
+    <string name="export_events">Exportar eventos</string>
+    <string name="import_events_from_ics">Importar eventos de um ficheiro .ics</string>
+    <string name="export_events_to_ics">Exportar eventos para um ficheiro .ics</string>
+    <string name="default_event_type">Tipo de evento padrão</string>
+    <string name="export_past_events_too">Exportar eventos antigos</string>
+    <string name="include_event_types">Incluir tipos de eventos</string>
+    <string name="filename_without_ics">Nome do ficheiro (sem .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Título</string>
+    <string name="location">Location</string>
+    <string name="description">Descrição</string>
+    <string name="all_day">Todo o dia</string>
+
+    <!-- Weekly view -->
+    <string name="week">Semana</string>
+
+    <!-- Event types -->
+    <string name="event_types">Tipos de eventos</string>
+    <string name="add_new_type">Adicionar um tipo</string>
+    <string name="edit_type">Editar tipo</string>
+    <string name="type_already_exists">Já existe um tipo com este nome</string>
+    <string name="color">Cor</string>
+    <string name="regular_event">Evento regular</string>
+    <string name="cannot_delete_default_type">O tipo de evento padrão não pode ser apagado</string>
+    <string name="select_event_type">Selecione um tipo de evento</string>
+    <string name="move_events_into_default">Mover eventos afetados para o tipo de evento padrão</string>
+    <string name="remove_affected_events">Remover permanentemente os eventos afetados</string>
+    <string name="unsync_caldav_calendar">Para remover um calendário CalDAV, tem que cancelar a sua sincronização</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Feriados</string>
+    <string name="add_holidays">Adicionar feriados</string>
+    <string name="national_holidays">Feriados nacionais</string>
+    <string name="religious_holidays">Feriados religiosos</string>
+    <string name="holidays_imported_successfully">Os feriados foram adicionados com sucesso para o tipo de evento \"Feriados\"</string>
+    <string name="importing_some_holidays_failed">Alguns eventos não foram importados</string>
+    <string name="importing_holidays_failed">Falha ao importar os feriados</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Gerir tipos de eventos</string>
+    <string name="start_day_at">Iniciar vista semanal em</string>
+    <string name="end_day_at">Terminar vista semanal em</string>
+    <string name="week_numbers">Mostrar número das semanas</string>
+    <string name="vibrate">Vibrar ao notificar sobre o lembrete</string>
+    <string name="reminder_sound">Som do lembrete</string>
+    <string name="no_ringtone_picker">Não foi encontrada uma aplicação capaz de definir o som</string>
+    <string name="no_ringtone_selected">Nenhum</string>
+    <string name="day_end_before_start">O dia final não pode ser antes do inicial</string>
+    <string name="caldav_sync">Sincronização CalDAV</string>
+    <string name="event_lists">Lista de eventos</string>
+    <string name="display_past_events">Mostrar eventos passados</string>
+    <string name="replace_description_with_location">Substituir descrição pela localização do evento</string>
+    <string name="delete_all_events">Apagar todos os eventos</string>
+    <string name="delete_all_events_confirmation">Tem a certeza de que deseja apagar todos os eventos? Esta ação não afeta os tipos de eventos nem as outras definições.</string>
+    <string name="show_a_grid">Mostrar grelha</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Selecione os calendários a sincronizar</string>
+    <string name="manage_synced_calendars">Gerir calendários sincronizados</string>
+    <string name="store_locally_only">Guardar apenas localmente</string>
+    <string name="refresh_caldav_calendars">Atualizar calendários CalDAV</string>
+    <string name="refreshing">A atualizar…</string>
+    <string name="refreshing_complete">Atualização terminada</string>
+    <string name="editing_calendar_failed">Falha ao editar o calendário</string>
+    <string name="syncing">A sincronizar…</string>
+    <string name="synchronization_completed">Sincronização terminada</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">segunda</string>
+    <string name="tuesday_alt">terça</string>
+    <string name="wednesday_alt">quarta</string>
+    <string name="thursday_alt">quinta</string>
+    <string name="friday_alt">sexta</string>
+    <string name="saturday_alt">sábado</string>
+    <string name="sunday_alt">domingo</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Ir ao ginásio</string>
+    <string name="sample_description_1">Ir às compras</string>
+    <string name="sample_title_2">Reunião com o João</string>
+    <string name="sample_description_2">Passear no jardim</string>
+    <string name="sample_title_3">Ir à biblioteca</string>
+    <string name="sample_title_4">Almoçar com a Maria</string>
+    <string name="sample_description_4">Ir ao mercado</string>
+    <string name="sample_title_5">Beber um café</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Um calendário para adicionar eventos e com um widget personalizável.</string>
+    <string name="app_long_description">
+        Um calendário local que não possui qualquer tipo de integração. Pode adicionar eventos e lembretes recorrentes e possui uma opção para mostrar o número da semana.
+
+        Contém um widget 4x4, em que pode personalizar a cor do texto, bem como a cor e o valor alfa do fundo.
+
+        Não contém anúncios nem permissões desnecessárias. Disponibiliza um tema escuro e é totalmente \'open source\'.
+
+        A permissão de armazenamento apenas é utilizada para importar eventos de ficheiros .ics.
+
+        A permissão aos contactos apenas é utilizada para importar os aniversários.
+        
+        Esta aplicação é apenas parte de um conjunto mais vasto de aplicações. Saiba mais em https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Não encontrou todas as cadeias a traduzir? Existem mais algumas em:
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3727dca5e039554957a8c7c7a3f2ee8bdad3ff5e
--- /dev/null
+++ b/app/src/main/res/values-ru/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Календарь</string>
+    <string name="change_view">Отображение</string>
+    <string name="daily_view">На день</string>
+    <string name="weekly_view">На неделю</string>
+    <string name="monthly_view">На месяц</string>
+    <string name="yearly_view">На год</string>
+    <string name="simple_event_list">Простой список событий</string>
+    <string name="no_upcoming_events">Похоже, у вас нет предстоящих событий.</string>
+    <string name="go_to_today">Сегодня</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Календарь на месяц</string>
+    <string name="widget_list">Календарь событий</string>
+
+    <!-- Event -->
+    <string name="event">Событие</string>
+    <string name="edit_event">Редактировать событие</string>
+    <string name="new_event">Новое событие</string>
+    <string name="create_new_event">Создать новое событие</string>
+    <string name="duplicate_event">Дублировать событие</string>
+    <string name="title_empty">Заголовок не может быть пустым</string>
+    <string name="end_before_start">Событие не может завершаться раньше, чем начинается</string>
+    <string name="event_added">Событие успешно добавлено</string>
+    <string name="event_updated">Событие успешно обновлено</string>
+    <string name="filter_events_by_type">Фильтровать события по типу</string>
+    <string name="please_fill_location">Пожалуйста, введите место, которое будет показано на карте</string>
+    <string name="public_event_notification_text">Предстоящее событие</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Повторять</string>
+    <string name="no_repetition">Без повторения</string>
+    <string name="daily">Ежедневно</string>
+    <string name="weekly">Еженедельно</string>
+    <string name="monthly">Ежемесячно</string>
+    <string name="yearly">Ежегодно</string>
+    <string name="weeks_raw">недель</string>
+    <string name="months_raw">месяцев</string>
+    <string name="years_raw">лет</string>
+    <string name="repeat_till">Повторять до</string>
+    <string name="forever">Бесконечно</string>
+    <string name="event_is_repeatable">Это событие может повторяться</string>
+    <string name="selection_contains_repetition">В выбранном есть повторяющиеся события</string>
+    <string name="delete_one_only">Удалить только выбранное</string>
+    <string name="delete_all_occurrences">Удалить все связанные</string>
+    <string name="update_one_only">Обновить только выбранное</string>
+    <string name="update_all_occurrences">Обновить все связанные</string>
+    <string name="repeat_till_date">Повторять до даты</string>
+    <string name="repeat_x_times">Повторять x раз</string>
+    <string name="repeat_forever">Повторять бесконечно</string>
+    <string name="times">раз</string>
+    <string name="repeat">Повторять</string>
+    <string name="repeat_on">Повторять по</string>
+    <string name="every_day">Каждый день</string>
+    <string name="selected_days">В выбранные дни</string>
+    <string name="the_same_day">Этот же день</string>
+    <string name="the_last_day">Последний день</string>
+    <string name="repeat_on_the_same_day_monthly">Повторять в этот же день каждый месяц</string>
+    <string name="repeat_on_the_last_day_monthly">Повторять в последний день месяца</string>
+    <string name="repeat_on_the_same_day_yearly">Повторять в этот же день каждый год</string>
+    <string name="repeat_every_m">Повторять каждый</string>
+    <string name="every_m">Каждый</string>
+    <string name="first_m">первый</string>
+    <string name="second_m">второй</string>
+    <string name="third_m">третий</string>
+    <string name="fourth_m">четвёртый</string>
+    <string name="last_m">последний</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Повторять каждый</string>
+    <string name="every_f">Каждый</string>
+    <string name="first_f">первый</string>
+    <string name="second_f">второй</string>
+    <string name="third_f">третий</string>
+    <string name="fourth_f">четвёртый</string>
+    <string name="last_f">последний</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Дни рождения</string>
+    <string name="add_birthdays">Добавить дни рождения контактов</string>
+    <string name="no_birthdays">Дни рождения не найдены</string>
+    <string name="birthdays_added">Дни рождения успешно добавлены</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Годовщины</string>
+    <string name="add_anniversaries">Добавить годовщины контактов</string>
+    <string name="no_anniversaries">Годовщины не найдены</string>
+    <string name="anniversaries_added">Годовщины успешно добавлены</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Напоминание</string>
+    <string name="before">до события</string>
+    <string name="add_another_reminder">Добавить ещё одно напоминание</string>
+    <string name="event_reminders">Напоминания о событиях</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Импорт событий</string>
+    <string name="export_events">Экспорт событий</string>
+    <string name="import_events_from_ics">Импорт событий из файла .ics</string>
+    <string name="export_events_to_ics">Экспорт событий в файл .ics</string>
+    <string name="default_event_type">Тип события по умолчанию</string>
+    <string name="export_past_events_too">Экспортировать прошедшие события</string>
+    <string name="include_event_types">Включать типы событий</string>
+    <string name="filename_without_ics">Имя файла (без .ics)</string>
+    <string name="override_event_types">Переопределять типы событий в файле</string>
+
+    <!-- Event details -->
+    <string name="title">Заголовок</string>
+    <string name="location">Место</string>
+    <string name="description">Описание</string>
+    <string name="all_day">Весь день</string>
+
+    <!-- Weekly view -->
+    <string name="week">Неделя</string>
+
+    <!-- Event types -->
+    <string name="event_types">Типы событий</string>
+    <string name="add_new_type">Добавить новый тип</string>
+    <string name="edit_type">Редактировать тип</string>
+    <string name="type_already_exists">Тип с таким названием уже существует</string>
+    <string name="color">Цвет</string>
+    <string name="regular_event">Обычное событие</string>
+    <string name="cannot_delete_default_type">Тип событий по умолчанию не может быть удалён</string>
+    <string name="select_event_type">Выбрать тип события</string>
+    <string name="move_events_into_default">Установить затронутым событиям тип по умолчанию</string>
+    <string name="remove_affected_events">Навсегда удалить затронутые события</string>
+    <string name="unsync_caldav_calendar">Чтобы удалить календарь CalDAV, нужно отключить синхронизацию с ним</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Праздники</string>
+    <string name="add_holidays">Добавить праздники</string>
+    <string name="national_holidays">Национальные праздники</string>
+    <string name="religious_holidays">Религиозные праздники</string>
+    <string name="holidays_imported_successfully">Праздники были успешно импортированы в тип события \"Праздники\"</string>
+    <string name="importing_some_holidays_failed">Не удалось импортировать некоторые события</string>
+    <string name="importing_holidays_failed">Не удалось импортировать праздники</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Управление типами событий</string>
+    <string name="start_day_at">Начало дня (неделя)</string>
+    <string name="end_day_at">Окончание дня (неделя)</string>
+    <string name="week_numbers">Отображать номера недель</string>
+    <string name="vibrate">Вибрация при напоминании</string>
+    <string name="reminder_sound">Звук напоминания</string>
+    <string name="no_ringtone_picker">Не найдено приложение для выбора рингтона</string>
+    <string name="no_ringtone_selected">Нет</string>
+    <string name="day_end_before_start">Конец дня не может быть раньше начала</string>
+    <string name="caldav_sync">Синхронизация по CalDAV</string>
+    <string name="event_lists">Списки событий</string>
+    <string name="display_past_events">Показывать прошедшие события</string>
+    <string name="replace_description_with_location">Заменить описание события местоположением</string>
+    <string name="delete_all_events">Удалить все события</string>
+    <string name="delete_all_events_confirmation">Вы действительно хотите удалить все события? Это не затронет ваши типы событий и другие настройки.</string>
+    <string name="show_a_grid">Показывать сетку</string>
+    <string name="loop_reminders">Циклические напоминания до отключения</string>
+    <string name="dim_past_events">Прошедшие события отображать тусклыми</string>
+    <string name="events">События</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Выберите календари для синхронизации</string>
+    <string name="manage_synced_calendars">Управление календарями для синхронизации</string>
+    <string name="store_locally_only">Хранить только локально</string>
+    <string name="refresh_caldav_calendars">Обновить календари из CalDAV</string>
+    <string name="refreshing">Обновление…</string>
+    <string name="refreshing_complete">Обновление завершено</string>
+    <string name="editing_calendar_failed">Не удалось изменить календарь</string>
+    <string name="syncing">Синхронизация…</string>
+    <string name="synchronization_completed">Синхронизация завершена</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Понедельник</string>
+    <string name="tuesday_alt">Вторник</string>
+    <string name="wednesday_alt">Среда</string>
+    <string name="thursday_alt">Четверг</string>
+    <string name="friday_alt">Пятница</string>
+    <string name="saturday_alt">Суббота</string>
+    <string name="sunday_alt">Воскресенье</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Тренировка</string>
+    <string name="sample_description_1">День ног</string>
+    <string name="sample_title_2">Встреча с Женей</string>
+    <string name="sample_description_2">У метро \"Невский проспект\"</string>
+    <string name="sample_title_3">Библиотека</string>
+    <string name="sample_title_4">Ужин с Машей</string>
+    <string name="sample_description_4">В КЭТ на Караванной</string>
+    <string name="sample_title_5">Время для кофе</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Как удалить праздники, импортированные с помощью кнопки \"Добавить праздники\"?</string>
+    <string name="faq_1_text">Праздники, созданные таким образом, вставляются в новый тип события, называемый \"Праздники\". Можно перейти в \"Настройки\" -> \"Управление типами событий\",
+        затем длительное нажатие на данном типе события и его удаление нажатием на \"корзину\".</string>
+    <string name="faq_2_title">Можно ли синхронизировать события с помощью Календаря Google или других служб, поддерживающих CalDAV?</string>
+    <string name="faq_2_text">Да, просто включите \"Cинхронизацию CalDAV\" в настройках приложения и выберите календари, которые хотите синхронизировать. Тем не менее, вам потребуется стороннее приложение, обрабатывающее синхронизацию между устройством и сервером.
+        Если вы хотите синхронизировать Календарь Google, то их официальное приложение выполнит данную работу. Для других календарей вам понадобится сторонний инструмент синхронизации, например DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Простой календарь с событиями и настраиваемым виджетом. Без рекламы.</string>
+    <string name="app_long_description">
+        Оффлайн календарь, без каких-либо интегрированных сторонних функций. Можно создавать повторяющиеся события и устанавливать напоминания. Есть возможность отображения номеров недель.
+
+        У приложения есть виджет 4x4 с изменяемым размером, у которого можно изменить цвет текста, цвет и прозрачность фона.
+
+        Это приложение не показывает рекламу и не запрашивает лишние разрешения. У него полностью открытый исходный код и настраиваемые цвета оформления.
+
+        Разрешение для доступа к памяти требуется только для экспорта или импорта событий из файлов .ics.
+
+        Разрешение на чтение контактов требуется только при импорте дней рождения.
+
+        Это приложение является лишь частью крупной серии приложений. Вы можете найти остальные на https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..273a9940ca5ea74f73a3370c31487017514035f5
--- /dev/null
+++ b/app/src/main/res/values-sk/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Jednoduchý kalendár</string>
+    <string name="app_launcher_name">Kalendár</string>
+    <string name="change_view">Zmeniť pohľad</string>
+    <string name="daily_view">Denný</string>
+    <string name="weekly_view">Týždenný</string>
+    <string name="monthly_view">Mesačný</string>
+    <string name="yearly_view">Ročný</string>
+    <string name="simple_event_list">Jednoduchý zoznam</string>
+    <string name="no_upcoming_events">Nemáte žiadne naplánované udalosti.</string>
+    <string name="go_to_today">Prejsť na dnešok</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Kalendár mesačný</string>
+    <string name="widget_list">Kalendár so zoznamom</string>
+
+    <!-- Event -->
+    <string name="event">Udalosť</string>
+    <string name="edit_event">Upraviť udalosť</string>
+    <string name="new_event">Nová udalosť</string>
+    <string name="create_new_event">Vytvoriť novú udalosť</string>
+    <string name="duplicate_event">Duplikovať udalosť</string>
+    <string name="title_empty">Prosím zadajte názov</string>
+    <string name="end_before_start">Udalosť nemôže skončiť skôr ako by začala</string>
+    <string name="event_added">Udalosť bola úspešne pridaná</string>
+    <string name="event_updated">Udalosť bola úspešne upravená</string>
+    <string name="filter_events_by_type">Filtrovať udalosti podľa typu</string>
+    <string name="please_fill_location">Prosím zadajte polohu, ktorá má byť zobrazená na mape</string>
+    <string name="public_event_notification_text">Blíži sa udalosť</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Opakovanie</string>
+    <string name="no_repetition">Neopakuje sa</string>
+    <string name="daily">Denne</string>
+    <string name="weekly">Týždenne</string>
+    <string name="monthly">Mesačne</string>
+    <string name="yearly">Ročne</string>
+    <string name="weeks_raw">týždňov</string>
+    <string name="months_raw">mesiacov</string>
+    <string name="years_raw">rokov</string>
+    <string name="repeat_till">Opakovať do</string>
+    <string name="forever">Navždy</string>
+    <string name="event_is_repeatable">Udalosť je opakujúca sa</string>
+    <string name="selection_contains_repetition">Výber obsahuje opakujúce sa udalosti</string>
+    <string name="delete_one_only">Vymazať iba označené opakovania</string>
+    <string name="delete_all_occurrences">Vymazať všetky opakovania</string>
+    <string name="update_one_only">Upraviť iba označené opakovania</string>
+    <string name="update_all_occurrences">Upraviť všetky opakovania</string>
+    <string name="repeat_till_date">Opakovať po dátum</string>
+    <string name="repeat_x_times">Opakovať x krát</string>
+    <string name="repeat_forever">Opakovať navždy</string>
+    <string name="times">krát</string>
+    <string name="repeat">Opakovať</string>
+    <string name="repeat_on">Opakovať v</string>
+    <string name="every_day">Každý deň</string>
+    <string name="selected_days">Vo vybraných dňoch</string>
+    <string name="the_same_day">Rovnaký deň</string>
+    <string name="the_last_day">Posledný deň</string>
+    <string name="repeat_on_the_same_day_monthly">Opakovať každý mesiac v rovnaký deň</string>
+    <string name="repeat_on_the_last_day_monthly">Opakovať posledný deň v mesiaci</string>
+    <string name="repeat_on_the_same_day_yearly">Opakovať každý rok v rovnaký deň</string>
+    <string name="repeat_every_m">Opakovať každý</string>
+    <string name="every_m">Každý</string>
+    <string name="first_m">prvý</string>
+    <string name="second_m">druhý</string>
+    <string name="third_m">tretí</string>
+    <string name="fourth_m">štvrtý</string>
+    <string name="last_m">posledný</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Opakovať každú</string>
+    <string name="every_f">Každú</string>
+    <string name="first_f">prvú</string>
+    <string name="second_f">druhú</string>
+    <string name="third_f">tretiu</string>
+    <string name="fourth_f">štvrtú</string>
+    <string name="last_f">poslednú</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Narodeniny</string>
+    <string name="add_birthdays">Pridať narodeniny kontaktov</string>
+    <string name="no_birthdays">Nenašli sa žiadne narodeniny</string>
+    <string name="birthdays_added">Narodeniny boli úspešne pridané</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Výročia</string>
+    <string name="add_anniversaries">Pridať výročia kontaktov</string>
+    <string name="no_anniversaries">Nenašli sa žiadne výročia</string>
+    <string name="anniversaries_added">Výročia boli úspešne pridané</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Pripomenka</string>
+    <string name="before">pred</string>
+    <string name="add_another_reminder">Pridať ďalšiu pripomienku</string>
+    <string name="event_reminders">Pripomienky udalostí</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importovať udalosti</string>
+    <string name="export_events">Exportovať udalosti</string>
+    <string name="import_events_from_ics">Importovať udalosti z .ics súboru</string>
+    <string name="export_events_to_ics">Exportovať udalosti do .ics súboru</string>
+    <string name="default_event_type">Predvolený typ udalosti</string>
+    <string name="export_past_events_too">Exportovať aj minulé udalosti</string>
+    <string name="include_event_types">Zahrnúť typy udalostí</string>
+    <string name="filename_without_ics">Názov súboru (bez .ics)</string>
+    <string name="override_event_types">Nahradiť typy udalostí v súbore</string>
+
+    <!-- Event details -->
+    <string name="title">Názov</string>
+    <string name="location">Miesto</string>
+    <string name="description">Popis</string>
+    <string name="all_day">Celodenná</string>
+
+    <!-- Weekly view -->
+    <string name="week">Týždeň</string>
+
+    <!-- Event types -->
+    <string name="event_types">Typy udalostí</string>
+    <string name="add_new_type">Pridať nový typ</string>
+    <string name="edit_type">Upraviť typ</string>
+    <string name="type_already_exists">Typ s daným názvom už existuje</string>
+    <string name="color">Farba</string>
+    <string name="regular_event">Bežná udalosť</string>
+    <string name="cannot_delete_default_type">Predvolený typ nie je možné vymazať</string>
+    <string name="select_event_type">Zvoľte typ udalosti</string>
+    <string name="move_events_into_default">Presunúť dotknuté udalosti do predvoleného typu udalostí</string>
+    <string name="remove_affected_events">Natrvalo odstrániť dotknuté udalosti</string>
+    <string name="unsync_caldav_calendar">Na odstránenie CalDAV kalendára musíte vypnúť jeho synchronizáciu</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Sviatky</string>
+    <string name="add_holidays">Pridať sviatky</string>
+    <string name="national_holidays">Štátne sviatky</string>
+    <string name="religious_holidays">Náboženské sviatky</string>
+    <string name="holidays_imported_successfully">Sviatky boli úspešne importované do nového typu udalostí \"Sviatky\"</string>
+    <string name="importing_some_holidays_failed">Importovanie niektorých sviatkov zlyhalo</string>
+    <string name="importing_holidays_failed">Importovanie udalostí zlyhalo</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Spravovať typy udalostí</string>
+    <string name="start_day_at">Začať deň o</string>
+    <string name="end_day_at">Ukončiť deň o</string>
+    <string name="week_numbers">Zobraziť čísla týždňov</string>
+    <string name="vibrate">Vibrovať pri pripomienke</string>
+    <string name="reminder_sound">Zvučka pripomienky</string>
+    <string name="no_ringtone_picker">Nenašla sa žiadna aplikácia na zmenu zvučky</string>
+    <string name="no_ringtone_selected">Žiadna</string>
+    <string name="day_end_before_start">Deň nemôže skončiť skôr než začne</string>
+    <string name="caldav_sync">CalDAV synchronizácia</string>
+    <string name="event_lists">Zoznamy udalostí</string>
+    <string name="display_past_events">Zobraziť minulé udalosti spred</string>
+    <string name="replace_description_with_location">Nahradiť popis udalosti miestom</string>
+    <string name="delete_all_events">Odstrániť všetky udalosti</string>
+    <string name="delete_all_events_confirmation">Ste si istý, že chcete odstrániť všetky udalosti? Všetky typy udalostí a nastavenia ostanú nedotknuté.</string>
+    <string name="show_a_grid">Zobraziť mriežku</string>
+    <string name="loop_reminders">Opakovať pripomienky až po odstránenie</string>
+    <string name="dim_past_events">Stlmiť minulé udalosti</string>
+    <string name="events">Udalosti</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Zvoľte kalendáre pre synchronizáciu</string>
+    <string name="manage_synced_calendars">Spravovať synchronizované kalendáre</string>
+    <string name="store_locally_only">Uložiť iba lokálne</string>
+    <string name="refresh_caldav_calendars">Obnoviť CalDAV kalendáre</string>
+    <string name="refreshing">Obnovuje sa…</string>
+    <string name="refreshing_complete">Obnovovanie ukončené</string>
+    <string name="editing_calendar_failed">Úprava kalendára zlyhala</string>
+    <string name="syncing">Synchronizujem…</string>
+    <string name="synchronization_completed">Synchronizácia ukončená</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">pondelok</string>
+    <string name="tuesday_alt">utorok</string>
+    <string name="wednesday_alt">stredu</string>
+    <string name="thursday_alt">štvrtok</string>
+    <string name="friday_alt">piatok</string>
+    <string name="saturday_alt">sobotu</string>
+    <string name="sunday_alt">nedeľu</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Cvičenie</string>
+    <string name="sample_description_1">Nohy</string>
+    <string name="sample_title_2">Stretnutie s Janom</string>
+    <string name="sample_description_2">V Astone</string>
+    <string name="sample_title_3">Knižnica</string>
+    <string name="sample_title_4">Obed s Katkou</string>
+    <string name="sample_description_4">V supermarkete</string>
+    <string name="sample_title_5">Káva</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">Ako môžem odstrániť sviatky pridané pomocou tlačidla \"Pridať sviatky\"?</string>
+    <string name="faq_1_text">Sviatky vytvorené daným spôsobom sú pridané do typu udalosti \"Sviatky\". Môžete teda ísť do Nastavenia -> Spravovať typy udalostí,
+        podržať daný typ a vymazať ho pomocou smetného koša.</string>
+    <string name="faq_2_title">Viem si zosynchronizovať udalosti pomocou Google Kalendára, alebo inej služby podporujúcej CalDAV?</string>
+    <string name="faq_2_text">Áno, stačí aktivovať funkciu \"CalDAV synchronizácia\" v nastaveniach a zvoliť si správne kalendáre. Pre synchronizáciu medzi zariadením a serverom ale budete potrebovať synchronizačný adaptér od tretej strany.
+        Ak chcete synchronizovať Google kalendár, ich oficiálna aplikácia Kalendár to spraví. Pre iné kalendáre budete potrebovať inú synchronizačnú aplikáciu, napr. DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Jednoduchý kalendár s udalosťami, upraviteľným widgetom a bez reklám.</string>
+    <string name="app_long_description">
+        Jednoduchý kalendár s možnosťou CalDAV synchronizácie. Viete si jednoducho vytvoriť opakujúce sa udalosti s pripomienkami, alebo zobraziť čísla týždňov.
+
+        Obsahuje škálovateľné widgety s mesačným náhľadom alebo zoznamom udalostí, kde viete upraviť farbu textu, ako aj priehľadnosť a farbu pozadia.
+
+        Neobsahuje žiadne reklamy a nepotrebné oprávnenia. Je opensource, poskytuje možnosť zmeny farieb.
+
+        Oprávnenie na prístup k súborom je potrebné iba v prípade exportovania a importovania udalostí z .ics súborov.
+
+        Oprávnenie ku kontaktom je používané iba pri pridávaní narodenín alebo výročí kontaktov.
+
+        Táto aplikácia je iba jednou zo skupiny aplikácií. Ostatné viete nájsť na https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3a54c652d43907940bcf454672a3000f9aec9950
--- /dev/null
+++ b/app/src/main/res/values-sv/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Kalender</string>
+    <string name="change_view">Ändra vy</string>
+    <string name="daily_view">Dagsvy</string>
+    <string name="weekly_view">Veckovy</string>
+    <string name="monthly_view">Månadsvy</string>
+    <string name="yearly_view">Årsvy</string>
+    <string name="simple_event_list">Händelselista</string>
+    <string name="no_upcoming_events">Det verkar som att du inte har några kommande händelser.</string>
+    <string name="go_to_today">Gå till idag</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Kalender månadsvis</string>
+    <string name="widget_list">Kalender händelselista</string>
+
+    <!-- Event -->
+    <string name="event">Händelse</string>
+    <string name="edit_event">Redigera händelse</string>
+    <string name="new_event">Ny händelse</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Titeln får inte vara tom</string>
+    <string name="end_before_start">Händelsen kan inte sluta innan den har startat</string>
+    <string name="event_added">Händelsen har lagts till</string>
+    <string name="event_updated">Händelsen har uppdaterats</string>
+    <string name="filter_events_by_type">Filtrera händelser efter typ</string>
+    <string name="please_fill_location">Du måste ange en plats som kan visas på en karta</string>
+    <string name="public_event_notification_text">Du har en kommande händelse</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Upprepning</string>
+    <string name="no_repetition">Ingen upprepning</string>
+    <string name="daily">Dagligen</string>
+    <string name="weekly">Veckovis</string>
+    <string name="monthly">Månadsvis</string>
+    <string name="yearly">Årligen</string>
+    <string name="weeks_raw">veckor</string>
+    <string name="months_raw">månader</string>
+    <string name="years_raw">år</string>
+    <string name="repeat_till">Upprepa tills</string>
+    <string name="forever">Alltid</string>
+    <string name="event_is_repeatable">Händelsen är återkommande</string>
+    <string name="selection_contains_repetition">Markeringen innehåller återkommande händelser</string>
+    <string name="delete_one_only">Ta bara bort den markerade förekomsten</string>
+    <string name="delete_all_occurrences">Ta bort alla förekomster</string>
+    <string name="update_one_only">Uppdatera bara den markerade förekomsten</string>
+    <string name="update_all_occurrences">Uppdatera alla förekomster</string>
+    <string name="repeat_till_date">Upprepa till ett datum</string>
+    <string name="repeat_x_times">Upprepa x gånger</string>
+    <string name="repeat_forever">Upprepa alltid</string>
+    <string name="times">gånger</string>
+    <string name="repeat">Upprepa</string>
+    <string name="repeat_on">Upprepa på</string>
+    <string name="every_day">Varje dag</string>
+    <string name="selected_days">På markerade dagar</string>
+    <string name="the_same_day">Samma dag</string>
+    <string name="the_last_day">Den sista dagen</string>
+    <string name="repeat_on_the_same_day_monthly">Upprepa på samma dag varje månad</string>
+    <string name="repeat_on_the_last_day_monthly">Upprepa på månadens sista dag</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Upprepa varje</string>
+    <string name="every_m">Varje</string>
+    <string name="first_m">första</string>
+    <string name="second_m">andra</string>
+    <string name="third_m">tredje</string>
+    <string name="fourth_m">fjärde</string>
+    <string name="last_m">sista</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Upprepa varje</string>
+    <string name="every_f">Varje</string>
+    <string name="first_f">första</string>
+    <string name="second_f">andra</string>
+    <string name="third_f">tredje</string>
+    <string name="fourth_f">fjärde</string>
+    <string name="last_f">sista</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Födelsedagar</string>
+    <string name="add_birthdays">Lägg till kontakters födelsedagar</string>
+    <string name="no_birthdays">Inga födelsedagar hittades</string>
+    <string name="birthdays_added">Födelsedagarna har lagts till</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Årsdagar</string>
+    <string name="add_anniversaries">Lägg till kontakters årsdagar</string>
+    <string name="no_anniversaries">Inga årsdagar hittades</string>
+    <string name="anniversaries_added">Årsdagarna har lagts till</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Påminnelse</string>
+    <string name="before">före</string>
+    <string name="add_another_reminder">Lägg till en annan påminnelse</string>
+    <string name="event_reminders">Händelsepåminnelser</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Importera händelser</string>
+    <string name="export_events">Exportera händelser</string>
+    <string name="import_events_from_ics">Importera händelser från en .ics-fil</string>
+    <string name="export_events_to_ics">Exportera händelser till en .ics-fil</string>
+    <string name="default_event_type">Standardhändelsetyp</string>
+    <string name="export_past_events_too">Exportera även tidigare händelser</string>
+    <string name="include_event_types">Inkludera händelsetyper</string>
+    <string name="filename_without_ics">Filnamn (utan .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Titel</string>
+    <string name="location">Plats</string>
+    <string name="description">Beskrivning</string>
+    <string name="all_day">Heldag</string>
+
+    <!-- Weekly view -->
+    <string name="week">Vecka</string>
+
+    <!-- Event types -->
+    <string name="event_types">Händelsetyper</string>
+    <string name="add_new_type">Lägg till en ny typ</string>
+    <string name="edit_type">Redigera typ</string>
+    <string name="type_already_exists">En typ med denna titel finns redan</string>
+    <string name="color">Färg</string>
+    <string name="regular_event">Regelbunden händelse</string>
+    <string name="cannot_delete_default_type">Standardhändelsetypen kan inte tas bort</string>
+    <string name="select_event_type">Välj en händelsetyp</string>
+    <string name="move_events_into_default">Flytta berörda händelser till standardhändelsetypen</string>
+    <string name="remove_affected_events">Ta bort berörda händelser permanent</string>
+    <string name="unsync_caldav_calendar">Du måste sluta synkronisera CalDAV-kalendern innan du kan ta bort den</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Helgdagar</string>
+    <string name="add_holidays">Lägg till helgdagar</string>
+    <string name="national_holidays">Nationella helgdagar</string>
+    <string name="religious_holidays">Religiösa helgdagar</string>
+    <string name="holidays_imported_successfully">Helgdagarna har importerats till händelsetypen \"Helgdagar\"</string>
+    <string name="importing_some_holidays_failed">Vissa händelser kunde inte importeras</string>
+    <string name="importing_holidays_failed">Helgdagar kunde inte importeras</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Hantera händelsetyper</string>
+    <string name="start_day_at">Starta veckovydagen vid</string>
+    <string name="end_day_at">Sluta veckovydagen vid</string>
+    <string name="week_numbers">Visa veckonumret i månadsvyn</string>
+    <string name="vibrate">Vibrera vid påminnelseaviseringen</string>
+    <string name="reminder_sound">Påminnelseljud</string>
+    <string name="no_ringtone_picker">Hittade ingen app som kan ställa in ljudet</string>
+    <string name="no_ringtone_selected">Ingen</string>
+    <string name="day_end_before_start">Dagen kan inte börja innan den tar slut</string>
+    <string name="caldav_sync">CalDAV-synkronisering</string>
+    <string name="event_lists">Händelselistor</string>
+    <string name="display_past_events">Visa tidigare händelser</string>
+    <string name="replace_description_with_location">Ersätt händelsebeskrivning med plats</string>
+    <string name="delete_all_events">Ta bort alla händelser</string>
+    <string name="delete_all_events_confirmation">Är du säker på att du vill ta bort alla händelser? Dina händelsetyper och andra inställningar påverkas inte av borttagningen.</string>
+    <string name="show_a_grid">Visa ett rutnät</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Välj de kalendrar som du vill synkronisera</string>
+    <string name="manage_synced_calendars">Hantera synkroniserade kalendrar</string>
+    <string name="store_locally_only">Spara bara lokalt</string>
+    <string name="refresh_caldav_calendars">Uppdatera CalDAV-kalendrar</string>
+    <string name="refreshing">Uppdaterar…</string>
+    <string name="refreshing_complete">Uppdateringen är klar</string>
+    <string name="editing_calendar_failed">Det gick inte att redigera kalendern</string>
+    <string name="syncing">Synkroniserar…</string>
+    <string name="synchronization_completed">Synkroniseringen är klar</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Måndag</string>
+    <string name="tuesday_alt">Tisdag</string>
+    <string name="wednesday_alt">Onsdag</string>
+    <string name="thursday_alt">Torsdag</string>
+    <string name="friday_alt">Fredag</string>
+    <string name="saturday_alt">Lördag</string>
+    <string name="sunday_alt">Söndag</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Träning</string>
+    <string name="sample_description_1">Bendag</string>
+    <string name="sample_title_2">Möte med Johan</string>
+    <string name="sample_description_2">I trädgården</string>
+    <string name="sample_title_3">Biblioteket</string>
+    <string name="sample_title_4">Lunch med Marie</string>
+    <string name="sample_description_4">På stranden</string>
+    <string name="sample_title_5">Kaffedags</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">En enkel kalender med händelser, en anpassningsbar widget och ingen reklam.</string>
+    <string name="app_long_description">
+        En enkel kalender med valfri CalDAV-synkronisering. Du kan enkelt skapa återkommande händelser och ställa in påminnelser. Den kan också visa veckonummer.
+
+        Har en widget med en månadsvy och en händelselista. Du kan anpassa widgetens textfärg, bakgrundsfärg och bakgrundsgenomskinlighet.
+
+        Innehåller ingen reklam eller onödiga behörigheter. Den har helt öppen källkod och anpassningsbara färger.
+
+        Lagringsbehörigheten behövs bara för att exportera eller importera händelser från .ics-filer.
+
+        Kontaktbehörigheten används bara för att importera kontakters födelsedagar och årsdagar.
+
+        Denna app är bara en del av en större serie appar. Du hittar resten av dem på https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-sw600dp/booleans.xml b/app/src/main/res/values-sw600dp/booleans.xml
new file mode 100644
index 0000000000000000000000000000000000000000..c06e0147ee732340df3dba9567aa90076c64aa47
--- /dev/null
+++ b/app/src/main/res/values-sw600dp/booleans.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <bool name="portrait_only">false</bool>
+</resources>
diff --git a/app/src/main/res/values-sw600dp/dimens.xml b/app/src/main/res/values-sw600dp/dimens.xml
new file mode 100644
index 0000000000000000000000000000000000000000..eb84835a61da9e8466f6ed0fb3c938c55f06cc3d
--- /dev/null
+++ b/app/src/main/res/values-sw600dp/dimens.xml
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <dimen name="min_widget_width">320dp</dimen>
+    <dimen name="min_widget_height">320dp</dimen>
+
+    <dimen name="monthly_day_height">60dp</dimen>
+
+    <dimen name="weekly_view_row_height">90dp</dimen>
+    <dimen name="weekly_view_row_minus_one_height">89dp</dimen>
+    <dimen name="weekly_view_events_height">2160dp</dimen>      <!-- weekly_view_row_height * 24 hours -->
+    <dimen name="weekly_view_minimal_event_height">15dp</dimen>
+
+    <dimen name="meta_text_size">20sp</dimen>
+    <dimen name="day_text_size">22sp</dimen>
+    <dimen name="month_text_size">26sp</dimen>
+
+    <dimen name="year_view_day_text_size">12sp</dimen>
+</resources>
diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..31fb721076e4543fac69a4f18d4cfb259390ba66
--- /dev/null
+++ b/app/src/main/res/values-tr/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Basit Takvim</string>
+    <string name="app_launcher_name">Takvim</string>
+    <string name="change_view">Görünümü değiştir</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">Haftalık görünüm</string>
+    <string name="monthly_view">Aylık görünüm</string>
+    <string name="yearly_view">Yıllık görünüm</string>
+    <string name="simple_event_list">Basit durum listesi</string>
+    <string name="no_upcoming_events">Gelecekteki etkinliğiniz yok gibi görünüyor.</string>
+    <string name="go_to_today">Bugüne git</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Aylık takvim</string>
+    <string name="widget_list">Takvim etkinlik listesi</string>
+
+    <!-- Event -->
+    <string name="event">Durum</string>
+    <string name="edit_event">Etkinliği Düzenle</string>
+    <string name="new_event">Yeni Etkinlik</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Başlık başlığı boş olamaz</string>
+    <string name="end_before_start">Etkinlik, başlamasından önce sona eremez</string>
+    <string name="event_added">Etkinlik başarıyla eklendi</string>
+    <string name="event_updated">Etkinlik başarıyla güncellendi</string>
+    <string name="filter_events_by_type">Etkinlikleri türe göre filtreleyin</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Tekrarla</string>
+    <string name="no_repetition">Tekrarlama yok</string>
+    <string name="daily">Günlük</string>
+    <string name="weekly">Haftalık</string>
+    <string name="monthly">Aylık</string>
+    <string name="yearly">Yıllık</string>
+    <string name="weeks_raw">haftalar</string>
+    <string name="months_raw">aylar</string>
+    <string name="years_raw">yıllar</string>
+    <string name="repeat_till">Kadar tekrarla:</string>
+    <string name="forever">Sonsuza dek</string>
+    <string name="event_is_repeatable">The event is repeatable</string>
+    <string name="selection_contains_repetition">Seçim, tekrar eden etkinlikleri içeriyor</string>
+    <string name="delete_one_only">Yalnızca seçilen olayı sil</string>
+    <string name="delete_all_occurrences">Tüm tekrarlamaları sil</string>
+    <string name="update_one_only">Sadece seçilen olayı güncelle</string>
+    <string name="update_all_occurrences">Tüm olayları güncelle</string>
+    <string name="repeat_till_date">Tarihe kadar tekrarla</string>
+    <string name="repeat_x_times">X süresini tekrarla</string>
+    <string name="repeat_forever">Sonsuza kadar tekrarla</string>
+    <string name="times">zamanlar</string>
+    <string name="repeat">Tekrarla</string>
+    <string name="repeat_on">Tekrarlama açık</string>
+    <string name="every_day">Her gün</string>
+    <string name="selected_days">Seçilen günlerde</string>
+    <string name="the_same_day">Aynı gün</string>
+    <string name="the_last_day">Son gün</string>
+    <string name="repeat_on_the_same_day_monthly">Her ay aynı gün tekrar edin</string>
+    <string name="repeat_on_the_last_day_monthly">Ayın son gününde tekrar et</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Her seferinde tekrarla</string>
+    <string name="every_m">Her</string>
+    <string name="first_m">ilk</string>
+    <string name="second_m">ikinci</string>
+    <string name="third_m">üçüncü</string>
+    <string name="fourth_m">dördüncü</string>
+    <string name="last_m">son</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Her seferinde tekrarla</string>
+    <string name="every_f">Her</string>
+    <string name="first_f">ilk</string>
+    <string name="second_f">ikinci</string>
+    <string name="third_f">üçüncü</string>
+    <string name="fourth_f">dördüncü</string>
+    <string name="last_f">son</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Birthdays</string>
+    <string name="add_birthdays">Add contact birthdays</string>
+    <string name="no_birthdays">No birthdays have been found</string>
+    <string name="birthdays_added">Birthdays added successfully</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversaries</string>
+    <string name="add_anniversaries">Add contact anniversaries</string>
+    <string name="no_anniversaries">No anniversaries have been found</string>
+    <string name="anniversaries_added">Anniversaries added successfully</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Hatırlatma</string>
+    <string name="before">önce</string>
+    <string name="add_another_reminder">Başka bir hatırlatma ekle</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Olayları içe aktar</string>
+    <string name="export_events">Olayları dışa aktar</string>
+    <string name="import_events_from_ics">Bir .ics dosyasından olayları içe aktar</string>
+    <string name="export_events_to_ics">Etkinlikleri bir .ics dosyasına aktarın</string>
+    <string name="default_event_type">Varsayılan olay türü</string>
+    <string name="export_past_events_too">Geçmişteki etkinlikleri de dışa aktar</string>
+    <string name="include_event_types">Include event types</string>
+    <string name="filename_without_ics">Filename (without .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Başlık</string>
+    <string name="location">Location</string>
+    <string name="description">Açıklama</string>
+    <string name="all_day">Tüm-gün</string>
+
+    <!-- Weekly view -->
+    <string name="week">Hafta</string>
+
+    <!-- Event types -->
+    <string name="event_types">Olay türleri</string>
+    <string name="add_new_type">Yeni bir tür ekle</string>
+    <string name="edit_type">Türü düzenle</string>
+    <string name="type_already_exists">Bu başlığı taşıyan tür zaten var</string>
+    <string name="color">Renk</string>
+    <string name="regular_event">Düzenli etkinlik</string>
+    <string name="cannot_delete_default_type">Varsayılan etkinlik türü silinemiyor</string>
+    <string name="select_event_type">Bir etkinlik türü seçin</string>
+    <string name="move_events_into_default">Move affected events into the default event type</string>
+    <string name="remove_affected_events">Permanently remove affected events</string>
+    <string name="unsync_caldav_calendar">To remove a CalDAV calendar you have to unsynchronize it</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Holidays</string>
+    <string name="add_holidays">Tatil ekle</string>
+    <string name="national_holidays">National holidays</string>
+    <string name="religious_holidays">Religious holidays</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Importing some events failed</string>
+    <string name="importing_holidays_failed">Importing holidays failed</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Olay türlerini yönet</string>
+    <string name="start_day_at">Haftalık görüntüleme gününü şu saatte başlatın</string>
+    <string name="end_day_at">Haftalık görüntüleme gününü bitiştir</string>
+    <string name="week_numbers">Aylık görünümde hafta sayılarını göster</string>
+    <string name="vibrate">Hatırlatma bildiriminde titreşim</string>
+    <string name="reminder_sound">Hatırlatma sesi</string>
+    <string name="no_ringtone_picker">Zil sesi ayarlayabilen hiçbir uygulama bulunamadı</string>
+    <string name="no_ringtone_selected">Boş</string>
+    <string name="day_end_before_start">Gün başlamadan önce bitemez</string>
+    <string name="caldav_sync">CalDAV sync</string>
+    <string name="event_lists">Event lists</string>
+    <string name="display_past_events">Display events from the past</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Select calendars to sync</string>
+    <string name="manage_synced_calendars">Manage synced calendars</string>
+    <string name="store_locally_only">Store locally only</string>
+    <string name="refresh_caldav_calendars">Refresh CalDAV calendars</string>
+    <string name="refreshing">Refreshing…</string>
+    <string name="refreshing_complete">Refreshing complete</string>
+    <string name="editing_calendar_failed">Editing calendar failed</string>
+    <string name="syncing">Syncing…</string>
+    <string name="synchronization_completed">Sync completed</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Pazartesi</string>
+    <string name="tuesday_alt">Salı</string>
+    <string name="wednesday_alt">Çarşamba</string>
+    <string name="thursday_alt">Perşembe</string>
+    <string name="friday_alt">Cuma</string>
+    <string name="saturday_alt">Cumartesi</string>
+    <string name="sunday_alt">Pazar</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Egzersiz yapma</string>
+    <string name="sample_description_1">Etap günü</string>
+    <string name="sample_title_2">John ile görüşme</string>
+    <string name="sample_description_2">Rockstone bahçesinde</string>
+    <string name="sample_title_3">Kütüphane</string>
+    <string name="sample_title_4">Mary ile öğle yemeği</string>
+    <string name="sample_description_4">Plaza\'da</string>
+    <string name="sample_title_5">Kahve zamanı</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">Etkinlikler, özelleştirilebilir widget ve reklamsız basit bir takvim.</string>
+    <string name="app_long_description">
+        Başka bir takvim entegrasyonu gerektirmeyen çevrimdışı bir takvim. Yinelenen etkinlikler kolayca oluşturabilir ve hatırlatıcılar oluşturabilir, haftanın sayılarını da gösterebilir.
+
+        Metnin rengini, ayrıca alfa ve arka plan rengini özelleştirebileceğiniz resizable 4x4 bir widget içerir.
+
+        Reklam içermeyen veya gereksiz izinler. Tamamen açık kaynaktır, özelleştirilebilir renkler sağlar.
+
+        Depolama izni yalnızca .ics dosyalarından olayları içe aktarmak için gereklidir.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        Bu uygulama, daha büyük bir uygulama serisinden sadece bir parça. Geri kalanını şu adresten bulabilirsiniz: https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml
new file mode 100644
index 0000000000000000000000000000000000000000..88dcfd80676ab61283060da1dbbd317cdd20f37a
--- /dev/null
+++ b/app/src/main/res/values-v21/styles.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <style name="ArrowStyle">
+        <item name="android:background">?android:attr/selectableItemBackgroundBorderless</item>
+    </style>
+
+    <style name="MonthStyle">
+        <item name="android:background">?android:attr/selectableItemBackground</item>
+    </style>
+
+</resources>
diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..5ce47b98433d7db3e5b555971075fa224226ac5b
--- /dev/null
+++ b/app/src/main/res/values-zh-rTW/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">簡易行事曆</string>
+    <string name="app_launcher_name">簡易行事曆</string>
+    <string name="change_view">改變檢視模式</string>
+    <string name="daily_view">日曆</string>
+    <string name="weekly_view">週曆</string>
+    <string name="monthly_view">月曆</string>
+    <string name="yearly_view">年曆</string>
+    <string name="simple_event_list">簡易活動列表</string>
+    <string name="no_upcoming_events">你近期似乎沒有任何活動。</string>
+    <string name="go_to_today">前往今天</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">月曆</string>
+    <string name="widget_list">行事曆活動列表</string>
+
+    <!-- Event -->
+    <string name="event">活動</string>
+    <string name="edit_event">編輯活動</string>
+    <string name="new_event">新活動</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">標題不能是空白的</string>
+    <string name="end_before_start">活動結束時間不能比開始早</string>
+    <string name="event_added">活動添加成功</string>
+    <string name="event_updated">活動更新成功</string>
+    <string name="filter_events_by_type">依類型篩選活動</string>
+    <string name="please_fill_location">請填入要顯示在地圖上的地點</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">重複</string>
+    <string name="no_repetition">不重複</string>
+    <string name="daily">每日</string>
+    <string name="weekly">每週</string>
+    <string name="monthly">每月</string>
+    <string name="yearly">每年</string>
+    <string name="weeks_raw">週</string>
+    <string name="months_raw">月</string>
+    <string name="years_raw">年</string>
+    <string name="repeat_till">重複直到</string>
+    <string name="forever">永遠</string>
+    <string name="event_is_repeatable">這是個重複活動</string>
+    <string name="selection_contains_repetition">選擇的項目含有重複活動</string>
+    <string name="delete_one_only">只刪除選擇的事件</string>
+    <string name="delete_all_occurrences">刪除全部事件</string>
+    <string name="update_one_only">只更新選擇的事件</string>
+    <string name="update_all_occurrences">更新全部事件</string>
+    <string name="repeat_till_date">重複直到某日</string>
+    <string name="repeat_x_times">重複幾次</string>
+    <string name="repeat_forever">永遠重複</string>
+    <string name="times">次</string>
+    <string name="repeat">重複</string>
+    <string name="repeat_on">重複於</string>
+    <string name="every_day">每天</string>
+    <string name="selected_days">On selected days</string>
+    <string name="the_same_day">同一天</string>
+    <string name="the_last_day">最後一天</string>
+    <string name="repeat_on_the_same_day_monthly">重複每月同一天</string>
+    <string name="repeat_on_the_last_day_monthly">重複每月最後一天</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">重複每月</string>
+    <string name="every_m">每月</string>
+    <string name="first_m">第一個</string>
+    <string name="second_m">第二個</string>
+    <string name="third_m">第三個</string>
+    <string name="fourth_m">第四個</string>
+    <string name="last_m">最後的</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">重複每個</string>
+    <string name="every_f">每月</string>
+    <string name="first_f">第一個</string>
+    <string name="second_f">第二個</string>
+    <string name="third_f">第三個</string>
+    <string name="fourth_f">第四個</string>
+    <string name="last_f">最後的</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">生日</string>
+    <string name="add_birthdays">添加聯絡人生日</string>
+    <string name="no_birthdays">未發現生日</string>
+    <string name="birthdays_added">生日添加成功</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">紀念日</string>
+    <string name="add_anniversaries">添加聯絡人紀念日</string>
+    <string name="no_anniversaries">未發現紀念日</string>
+    <string name="anniversaries_added">紀念日添加成功</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">提醒</string>
+    <string name="before">前</string>
+    <string name="add_another_reminder">新增另一個提醒</string>
+    <string name="event_reminders">活動提醒</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">匯入活動</string>
+    <string name="export_events">匯出活動</string>
+    <string name="import_events_from_ics">從.ics檔案匯入活動</string>
+    <string name="export_events_to_ics">匯出活動成.ics檔案</string>
+    <string name="default_event_type">預設活動類型</string>
+    <string name="export_past_events_too">也匯出過去的活動</string>
+    <string name="include_event_types">包含活動類型</string>
+    <string name="filename_without_ics">檔案名稱 (不含.ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">標題</string>
+    <string name="location">地點</string>
+    <string name="description">描述</string>
+    <string name="all_day">全天</string>
+
+    <!-- Weekly view -->
+    <string name="week">週數</string>
+
+    <!-- Event types -->
+    <string name="event_types">活動類型</string>
+    <string name="add_new_type">添加新類型</string>
+    <string name="edit_type">編輯類型</string>
+    <string name="type_already_exists">已經存在這標題的類型</string>
+    <string name="color">顏色</string>
+    <string name="regular_event">一般活動</string>
+    <string name="cannot_delete_default_type">不能刪除預設活動類型</string>
+    <string name="select_event_type">選擇活動類型</string>
+    <string name="move_events_into_default">受影響的活動移到預設活動類型</string>
+    <string name="remove_affected_events">受影響的活動永久移除</string>
+    <string name="unsync_caldav_calendar">想移除CalDAV行事曆,你必須取消同步</string>
+
+    <!-- Holidays -->
+    <string name="holidays">節日</string>
+    <string name="add_holidays">添加節日</string>
+    <string name="national_holidays">國定節日</string>
+    <string name="religious_holidays">宗教節日</string>
+    <string name="holidays_imported_successfully">節日已成功匯入"節日"活動類型</string>
+    <string name="importing_some_holidays_failed">匯入一些活動失敗</string>
+    <string name="importing_holidays_failed">匯入節日失敗</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">管理活動類型</string>
+    <string name="start_day_at">每日開始於</string>
+    <string name="end_day_at">每日結束於</string>
+    <string name="week_numbers">顯示第幾週</string>
+    <string name="vibrate">提醒通知時震動</string>
+    <string name="reminder_sound">提醒音效</string>
+    <string name="no_ringtone_picker">未發現能夠設置鈴聲的程式</string>
+    <string name="no_ringtone_selected">無</string>
+    <string name="day_end_before_start">結束時間不能比開始早</string>
+    <string name="caldav_sync">CalDAV同步</string>
+    <string name="event_lists">活動列表</string>
+    <string name="display_past_events">顯示過去的活動</string>
+    <string name="replace_description_with_location">活動描述改成地點</string>
+    <string name="delete_all_events">刪除全部活動</string>
+    <string name="delete_all_events_confirmation">你確定要刪除全部活動嗎?會完整留下你的活動類型和其他設定。</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">選擇行事曆來同步</string>
+    <string name="manage_synced_calendars">管理同步的行事曆</string>
+    <string name="store_locally_only">只存於本機端</string>
+    <string name="refresh_caldav_calendars">重新整理CalDAV行事曆</string>
+    <string name="refreshing">重新整理中…</string>
+    <string name="refreshing_complete">重新整理完成</string>
+    <string name="editing_calendar_failed">編輯行事曆失敗</string>
+    <string name="syncing">同步中…</string>
+    <string name="synchronization_completed">同步完成</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">星期一</string>
+    <string name="tuesday_alt">星期二</string>
+    <string name="wednesday_alt">星期三</string>
+    <string name="thursday_alt">星期四</string>
+    <string name="friday_alt">星期五</string>
+    <string name="saturday_alt">星期六</string>
+    <string name="sunday_alt">星期日</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">訓練</string>
+    <string name="sample_description_1">腿部訓練日</string>
+    <string name="sample_title_2">跟約翰碰面</string>
+    <string name="sample_description_2">在滾石花園</string>
+    <string name="sample_title_3">圖書館</string>
+    <string name="sample_title_4">跟瑪麗共進午餐</string>
+    <string name="sample_description_4">在購物商場</string>
+    <string name="sample_title_5">休息時間</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">我如何移除用[添加節日]按鈕所匯入的節日?</string>
+    <string name="faq_1_text">以這方式建立的節日,會被加進一個叫做「節日」的新活動類型。
+        你可以到[設定] -> [管理活動類型],長按特定的活動類型,然後選擇垃圾桶來刪除。</string>
+    <string name="faq_2_title">我可以透過Google日曆或其它支援CalDAV的服務來同步我的活動嗎?</string>
+    <string name="faq_2_text">行的,只要打開程式設定內的[CalDAV同步],然後選擇你要同步的行事曆。然而你需要一些第三方應用程式來處理裝置和伺服器之間的同步。
+        如果你要同步Google日曆,他們官方的行事曆程式就能做到了。而其它行事曆,你需要有第三方同步工具才行,像是DAVdroid。</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">一個有活動功能和可自訂的小工具,且沒有廣告的簡易行事曆。</string>
+    <string name="app_long_description">
+        一個有CalDAV同步選項的簡易行事曆。你可以輕鬆建立週期活動和設置提醒,也能顯示週數。
+
+        含有月曆和活動列表的小工具,你可以自訂文字顏色,以及背景顏色和透明度。
+
+        不包含廣告及非必要的權限,而且完全開放原始碼,並提供自訂顏色。
+
+        儲存空間權限只需要用來從.ics檔案匯出或匯入活動。
+
+        聯絡人權限只是用來匯入聯絡人生日和紀念日。
+
+        這程式只是一系列眾多應用程式的其中一項,你可以在這發現更多 https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values/array.xml b/app/src/main/res/values/array.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d6f7b475be5b957e12d1e07419795c8ef487a437
--- /dev/null
+++ b/app/src/main/res/values/array.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string-array name="reminders">
+        <item>@string/no_reminder</item>
+        <item>@string/at_start</item>
+        <item>@string/custom</item>
+    </string-array>
+
+    <string-array name="custom_reminders">
+        <item>@string/minutes_raw</item>
+        <item>@string/hours_raw</item>
+        <item>@string/days_raw</item>
+    </string-array>
+
+    <string-array name="repetition">
+        <item>@string/no_repetition</item>
+        <item>@string/daily</item>
+        <item>@string/weekly</item>
+        <item>@string/monthly</item>
+        <item>@string/yearly</item>
+    </string-array>
+</resources>
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
new file mode 100644
index 0000000000000000000000000000000000000000..44af24af0686a2fa6981add877ebc62dd83866bf
--- /dev/null
+++ b/app/src/main/res/values/attrs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <declare-styleable name="SmallMonthView">
+        <attr name="days" format="integer"/>
+    </declare-styleable>
+</resources>
diff --git a/app/src/main/res/values/booleans.xml b/app/src/main/res/values/booleans.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9f60d109a2fc7b55dc91110a69038025faace8b4
--- /dev/null
+++ b/app/src/main/res/values/booleans.xml
@@ -0,0 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <bool name="portrait_only">true</bool>
+</resources>
diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d7dccb4348a60a7402da5ecdb4812c8eb7428da6
--- /dev/null
+++ b/app/src/main/res/values/colors.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <color name="red_text">@color/md_red_400_dark</color>
+    <color name="default_birthdays_color">@color/md_blue_800</color>
+    <color name="default_holidays_color">@color/md_green_700</color>
+    <color name="default_anniversaries_color">@color/md_red_400_dark</color>
+</resources>
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
new file mode 100644
index 0000000000000000000000000000000000000000..7975ac94d52ab8a7750025680b3d988a3f8a3402
--- /dev/null
+++ b/app/src/main/res/values/dimens.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <dimen name="yearly_padding_side">10dp</dimen>
+    <dimen name="yearly_padding_half">3dp</dimen>
+    <dimen name="yearly_padding_full">6dp</dimen>
+
+    <dimen name="monthly_day_height">40dp</dimen>
+
+    <dimen name="weekly_view_row_height">60dp</dimen>
+    <dimen name="weekly_view_events_height">1440dp</dimen>      <!-- weekly_view_row_height * 24 hours -->
+    <dimen name="weekly_view_minimal_event_height">10dp</dimen>
+    <dimen name="weekly_view_now_height">10dp</dimen>
+
+    <dimen name="min_widget_width">250dp</dimen>
+    <dimen name="min_widget_height">250dp</dimen>
+
+    <dimen name="repeat_type_margin_start">40dp</dimen>
+
+    <dimen name="yearly_month_padding">0dp</dimen>
+    <dimen name="endless_scroll_move_height">24dp</dimen>
+
+    <dimen name="day_monthly_text_size">11sp</dimen>
+    <dimen name="meta_text_size">14sp</dimen>
+    <dimen name="day_text_size">17sp</dimen>
+    <dimen name="month_text_size">22sp</dimen>
+
+    <dimen name="year_view_day_text_size">8sp</dimen>
+</resources>
diff --git a/app/src/main/res/values/donottranslate.xml b/app/src/main/res/values/donottranslate.xml
new file mode 100644
index 0000000000000000000000000000000000000000..48ddafb6a91c968a4e3e55051b0c488a26917d77
--- /dev/null
+++ b/app/src/main/res/values/donottranslate.xml
@@ -0,0 +1,56 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <!-- Release notes -->
+    <string name="release_119">
+        Allow changing the app launcher icon color\n
+        Added support for more advanced yearly repetition rules\n
+        Allow setting reminder looping till dismissed\n
+        Added a button in Settings for changing widget colors without recreating them\n
+        Added optional dimming of past events
+    </string>
+    <string name="release_117">Reworked custom notification sound picking, should be more reliable</string>
+    <string name="release_98">
+        Added a Location field\n
+        Allow adding Contact birthdays
+    </string>
+    <string name="release_88">Replaced Google Sync with CalDAV sync, please check Settings for enabling it</string>
+    <string name="release_86">Added an initial implementation of Google sync, use with caution (will always be optional)</string>
+    <string name="release_84">Added a setting for changing the widget font size</string>
+    <string name="release_80">Allow editing specific instances of repeating events</string>
+    <string name="release_77">Allow displaying some events from the past in the Simple Event List view</string>
+    <string name="release_76">
+        Added an easy way to import Holidays in some countries\n
+        Allow filtering events to export by event type\n
+        Added Snooze
+    </string>
+    <string name="release_73">Add more advanced monthly repetition options, like \"Last day of the month\" or \"Every second Tuesday\"</string>
+    <string name="release_71">Add a new event repetition type \"Repeat x times\"</string>
+    <string name="release_69">
+        Added more advanced weekly repetition by week days\n
+        Added sharing individual events by creating temporary .ics files
+    </string>
+    <string name="release_67">
+        Replaced raw database exporting with proper .ics file exporting\n
+        Added color themes
+    </string>
+    <string name="release_62">Allow deleting individual occurrences of repeatable events</string>
+    <string name="release_60">Allow toggling 24-hour format in settings</string>
+    <string name="release_59">
+        Added customizable event repeat intervals\n
+        Multiple improvements to importing events from .ics files
+    </string>
+    <string name="release_57">Added event types with customizable colors</string>
+    <string name="release_54">Allow setting up to 3 reminders per event</string>
+    <string name="release_52">Added all-day long event support</string>
+    <string name="release_51">Allow importing events from .ics files</string>
+    <string name="release_49">Allow picking colors by hex codes</string>
+    <string name="release_48">Added a weekly view</string>
+    <string name="release_46">Event reminder types have been tweaked, please update them</string>
+    <string name="release_44">
+        Added more color customization options\n
+        Your settings have been cleared, please reset them</string>
+    <string name="release_42">Allow changing the reminder notification sound</string>
+    <string name="release_40">Added a new view, a list of upcoming events</string>
+    <string name="release_39">Added the option to vibrate at notifications</string>
+</resources>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
new file mode 100644
index 0000000000000000000000000000000000000000..3f6a634151283cf5c5d4506fc58f19028b449367
--- /dev/null
+++ b/app/src/main/res/values/strings.xml
@@ -0,0 +1,223 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <string name="app_name">Simple Calendar</string>
+    <string name="app_launcher_name">Calendar</string>
+    <string name="change_view">Change view</string>
+    <string name="daily_view">Daily view</string>
+    <string name="weekly_view">Weekly view</string>
+    <string name="monthly_view">Monthly view</string>
+    <string name="yearly_view">Yearly view</string>
+    <string name="simple_event_list">Simple event list</string>
+    <string name="no_upcoming_events">Seems like you don\'t have any upcoming events.</string>
+    <string name="go_to_today">Go to today</string>
+
+    <!-- Widget titles -->
+    <string name="widget_monthly">Calendar monthly</string>
+    <string name="widget_list">Calendar event list</string>
+
+    <!-- Event -->
+    <string name="event">Event</string>
+    <string name="edit_event">Edit Event</string>
+    <string name="new_event">New Event</string>
+    <string name="create_new_event">Create a new event</string>
+    <string name="duplicate_event">Duplicate event</string>
+    <string name="title_empty">Title cannot be empty</string>
+    <string name="end_before_start">The event cannot end earlier than it starts</string>
+    <string name="event_added">Event added successfully</string>
+    <string name="event_updated">Event updated successfully</string>
+    <string name="filter_events_by_type">Filter events by type</string>
+    <string name="please_fill_location">Please fill in a location to be shown on a map</string>
+    <string name="public_event_notification_text">An event is upcoming</string>
+
+    <!-- Event Repetition -->
+    <string name="repetition">Repetition</string>
+    <string name="no_repetition">No repetition</string>
+    <string name="daily">Daily</string>
+    <string name="weekly">Weekly</string>
+    <string name="monthly">Monthly</string>
+    <string name="yearly">Yearly</string>
+    <string name="weeks_raw">weeks</string>
+    <string name="months_raw">months</string>
+    <string name="years_raw">years</string>
+    <string name="repeat_till">Repeat till</string>
+    <string name="forever">Forever</string>
+    <string name="event_is_repeatable">The event is repeatable</string>
+    <string name="selection_contains_repetition">The selection contains repeating events</string>
+    <string name="delete_one_only">Delete the selected occurrence only</string>
+    <string name="delete_all_occurrences">Delete all occurrences</string>
+    <string name="update_one_only">Update the selected occurrence only</string>
+    <string name="update_all_occurrences">Update all occurrences</string>
+    <string name="repeat_till_date">Repeat till a date</string>
+    <string name="repeat_x_times">Repeat x times</string>
+    <string name="repeat_forever">Repeat forever</string>
+    <string name="times">times</string>
+    <string name="repeat">Repeat</string>
+    <string name="repeat_on">Repeat on</string>
+    <string name="every_day">Every day</string>
+    <string name="selected_days">On selected days</string>
+    <string name="the_same_day">The same day</string>
+    <string name="the_last_day">The last day</string>
+    <string name="repeat_on_the_same_day_monthly">Repeat on the same day each month</string>
+    <string name="repeat_on_the_last_day_monthly">Repeat on the last day of the month</string>
+    <string name="repeat_on_the_same_day_yearly">Repeat on the same day every year</string>
+    <string name="repeat_every_m">Repeat every</string>
+    <string name="every_m">Every</string>
+    <string name="first_m">first</string>
+    <string name="second_m">second</string>
+    <string name="third_m">third</string>
+    <string name="fourth_m">fourth</string>
+    <string name="last_m">last</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every first Sunday" -->
+    <string name="repeat_every_f">Repeat every</string>
+    <string name="every_f">Every</string>
+    <string name="first_f">first</string>
+    <string name="second_f">second</string>
+    <string name="third_f">third</string>
+    <string name="fourth_f">fourth</string>
+    <string name="last_f">last</string>
+
+    <!-- Birthdays -->
+    <string name="birthdays">Birthdays</string>
+    <string name="add_birthdays">Add contact birthdays</string>
+    <string name="no_birthdays">No birthdays have been found</string>
+    <string name="birthdays_added">Birthdays added successfully</string>
+
+    <!-- Anniversaries -->
+    <string name="anniversaries">Anniversaries</string>
+    <string name="add_anniversaries">Add contact anniversaries</string>
+    <string name="no_anniversaries">No anniversaries have been found</string>
+    <string name="anniversaries_added">Anniversaries added successfully</string>
+
+    <!-- Event Reminders -->
+    <string name="reminder">Reminder</string>
+    <string name="before">before</string>
+    <string name="add_another_reminder">Add another reminder</string>
+    <string name="event_reminders">Event reminders</string>
+
+    <!-- Export / Import -->
+    <string name="import_events">Import events</string>
+    <string name="export_events">Export events</string>
+    <string name="import_events_from_ics">Import events from an .ics file</string>
+    <string name="export_events_to_ics">Export events to an .ics file</string>
+    <string name="default_event_type">Default event type</string>
+    <string name="export_past_events_too">Export past events too</string>
+    <string name="include_event_types">Include event types</string>
+    <string name="filename_without_ics">Filename (without .ics)</string>
+    <string name="override_event_types">Override event types in the file</string>
+
+    <!-- Event details -->
+    <string name="title">Title</string>
+    <string name="location">Location</string>
+    <string name="description">Description</string>
+    <string name="all_day">All-day</string>
+
+    <!-- Weekly view -->
+    <string name="week">Week</string>
+
+    <!-- Event types -->
+    <string name="event_types">Event types</string>
+    <string name="add_new_type">Add a new type</string>
+    <string name="edit_type">Edit type</string>
+    <string name="type_already_exists">Type with this title already exists</string>
+    <string name="color">Color</string>
+    <string name="regular_event">Regular event</string>
+    <string name="cannot_delete_default_type">Default event type cannot be deleted</string>
+    <string name="select_event_type">Select an event type</string>
+    <string name="move_events_into_default">Move affected events into the default event type</string>
+    <string name="remove_affected_events">Permanently remove affected events</string>
+    <string name="unsync_caldav_calendar">To remove a CalDAV calendar you have to unsynchronize it</string>
+
+    <!-- Holidays -->
+    <string name="holidays">Holidays</string>
+    <string name="add_holidays">Add holidays</string>
+    <string name="national_holidays">National holidays</string>
+    <string name="religious_holidays">Religious holidays</string>
+    <string name="holidays_imported_successfully">Holidays have been successfully imported into the \"Holidays\" event type</string>
+    <string name="importing_some_holidays_failed">Importing some events failed</string>
+    <string name="importing_holidays_failed">Importing holidays failed</string>
+
+    <!-- Settings -->
+    <string name="manage_event_types">Manage event types</string>
+    <string name="start_day_at">Start day at</string>
+    <string name="end_day_at">End day at</string>
+    <string name="week_numbers">Show week numbers</string>
+    <string name="vibrate">Vibrate on reminder notification</string>
+    <string name="reminder_sound">Reminder sound</string>
+    <string name="no_ringtone_picker">No app capable of setting ringtone found</string>
+    <string name="no_ringtone_selected">None</string>
+    <string name="day_end_before_start">The day cannot end earlier than it starts</string>
+    <string name="caldav_sync">CalDAV sync</string>
+    <string name="event_lists">Event lists</string>
+    <string name="display_past_events">Display events from the past</string>
+    <string name="replace_description_with_location">Replace event description with location</string>
+    <string name="delete_all_events">Delete all events</string>
+    <string name="delete_all_events_confirmation">Are you sure you want to delete all events? This will leave your event types and other settings intact.</string>
+    <string name="show_a_grid">Show a grid</string>
+    <string name="loop_reminders">Loop reminders until dismissed</string>
+    <string name="dim_past_events">Dim past events</string>
+    <string name="events">Events</string>
+
+    <!-- CalDAV sync -->
+    <string name="caldav">CalDAV</string>
+    <string name="select_caldav_calendars">Select calendars to sync</string>
+    <string name="manage_synced_calendars">Manage synced calendars</string>
+    <string name="store_locally_only">Store locally only</string>
+    <string name="refresh_caldav_calendars">Refresh CalDAV calendars</string>
+    <string name="refreshing">Refreshing…</string>
+    <string name="refreshing_complete">Refreshing complete</string>
+    <string name="editing_calendar_failed">Editing calendar failed</string>
+    <string name="syncing">Syncing…</string>
+    <string name="synchronization_completed">Sync completed</string>
+
+    <!-- alternative versions for some languages, use the same translations if you are not sure what this means -->
+    <!-- used in repetition, like "Every last Sunday" -->
+    <string name="monday_alt">Monday</string>
+    <string name="tuesday_alt">Tuesday</string>
+    <string name="wednesday_alt">Wednesday</string>
+    <string name="thursday_alt">Thursday</string>
+    <string name="friday_alt">Friday</string>
+    <string name="saturday_alt">Saturday</string>
+    <string name="sunday_alt">Sunday</string>
+
+    <!-- List widget config example events -->
+    <string name="sample_title_1">Workout</string>
+    <string name="sample_description_1">Leg day</string>
+    <string name="sample_title_2">Meeting with John</string>
+    <string name="sample_description_2">In Rockstone garden</string>
+    <string name="sample_title_3">Library</string>
+    <string name="sample_title_4">Lunch with Mary</string>
+    <string name="sample_description_4">In the Plaza</string>
+    <string name="sample_title_5">Coffee time</string>
+
+    <!-- FAQ -->
+    <string name="faq_1_title">How can I remove the holidays imported via the \"Add holidays\" button?</string>
+    <string name="faq_1_text">Holidays created that way are inserted in a new event type called \"Holidays\". You can go in Settings -> Manage Event Types,
+        long press the given event type and delete it by selecting the trashbin.</string>
+    <string name="faq_2_title">Can I sync my events via Google Calendar, or other service supporting CalDAV?</string>
+    <string name="faq_2_text">Yes, just toggle \"CalDAV sync\" in the app settings and select the calendars you want to sync. However, you will need some third party app handling the synchronization between the device and servers.
+        In case you want to synchronize a Google calendar, their official Calendar app will do the job. For other calendars you will need a third party sync adapter, for example DAVdroid.</string>
+
+    <!-- Strings displayed only on Google Playstore. Optional, but good to have -->
+    <!-- Short description has to have less than 80 chars -->
+    <string name="app_short_description">A simple calendar with events, customizable widget and no ads.</string>
+    <string name="app_long_description">
+        A simple calendar with optional CalDAV synchronization. You can easily create recurring events and setup reminders, it can also display week numbers.
+
+        Contains a monthly view and an event list widget where you can customize the color of the text, as well as the alpha and the color of the background.
+
+        Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors.
+
+        The Storage permission is needed only for exporting or importing events from .ics files.
+
+        The Contacts permission is used only at importing contact birthdays and anniversaries.
+
+        This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
+    </string>
+
+    <!--
+        Haven't found some strings? There's more at
+        https://github.com/SimpleMobileTools/Simple-Commons/tree/master/commons/src/main/res
+    -->
+</resources>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
new file mode 100644
index 0000000000000000000000000000000000000000..987325f529b24d0f2f8a294e8e997c7869efe2f6
--- /dev/null
+++ b/app/src/main/res/values/styles.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <style name="AppTheme" parent="AppTheme.Base"/>
+
+    <style name="DayView">
+        <item name="android:gravity">center</item>
+        <item name="android:textSize">@dimen/day_text_size</item>
+        <item name="android:fontFamily">sans-serif-light</item>
+    </style>
+
+    <style name="MetaView" parent="DayView">
+        <item name="android:textStyle">bold</item>
+        <item name="android:textSize">@dimen/meta_text_size</item>
+    </style>
+
+    <style name="WeekNumberStyle">
+        <item name="android:textStyle">bold</item>
+        <item name="android:gravity">top|center_horizontal</item>
+        <item name="android:textSize">@dimen/day_monthly_text_size</item>
+        <item name="android:textColor">@color/default_text_color</item>
+        <item name="android:fontFamily">sans-serif-light</item>
+    </style>
+
+    <style name="ArrowStyle">
+        <item name="android:background">@drawable/transparent_button</item>
+    </style>
+
+    <style name="MonthStyle">
+        <item name="android:background">@drawable/transparent_button</item>
+    </style>
+</resources>
diff --git a/app/src/main/res/xml/provider_paths.xml b/app/src/main/res/xml/provider_paths.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d1836f452505f80abd35c6082c7368562eb9e00b
--- /dev/null
+++ b/app/src/main/res/xml/provider_paths.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="utf-8"?>
+<paths>
+    <external-path name="external_files" path="."/>
+    <cache-path name="shared_events" path="events/"/>
+    <root-path name="external_files" path="/storage/" />
+</paths>
diff --git a/app/src/main/res/xml/searchable.xml b/app/src/main/res/xml/searchable.xml
new file mode 100644
index 0000000000000000000000000000000000000000..892fa25a7c33f61f08317ff87ee440aa9356858f
--- /dev/null
+++ b/app/src/main/res/xml/searchable.xml
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<searchable
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:hint="@string/search"
+    android:label="@string/app_name"/>
diff --git a/app/src/main/res/xml/widget_list_info.xml b/app/src/main/res/xml/widget_list_info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..05a61dbd415a7440d255392dcefedfe0b6e9967c
--- /dev/null
+++ b/app/src/main/res/xml/widget_list_info.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<appwidget-provider
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:configure="com.simplemobiletools.calendar.activities.WidgetListConfigureActivity"
+    android:initialLayout="@layout/widget_event_list"
+    android:minHeight="@dimen/min_widget_height"
+    android:minResizeHeight="110dp"
+    android:minResizeWidth="110dp"
+    android:minWidth="@dimen/min_widget_width"
+    android:previewImage="@drawable/img_widget_list_preview"
+    android:resizeMode="horizontal|vertical"
+    android:updatePeriodMillis="600000"/>
diff --git a/app/src/main/res/xml/widget_monthly_info.xml b/app/src/main/res/xml/widget_monthly_info.xml
new file mode 100644
index 0000000000000000000000000000000000000000..59f81443eaffe074d6f5770cce7f18b198b0fd1c
--- /dev/null
+++ b/app/src/main/res/xml/widget_monthly_info.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<appwidget-provider
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:configure="com.simplemobiletools.calendar.activities.WidgetMonthlyConfigureActivity"
+    android:initialLayout="@layout/fragment_month"
+    android:minHeight="@dimen/min_widget_height"
+    android:minResizeHeight="110dp"
+    android:minResizeWidth="110dp"
+    android:minWidth="@dimen/min_widget_width"
+    android:previewImage="@drawable/img_widget_monthly_preview"
+    android:resizeMode="horizontal|vertical"
+    android:updatePeriodMillis="3600000"/>
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..0a7f2288330cc77118e4e8b06f209ae054476e5e
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,30 @@
+// Top-level build file where you can add configuration options common to all sub-projects/modules.
+
+buildscript {
+    ext.kotlin_version = '1.2.41'
+
+    repositories {
+        jcenter()
+        google()
+    }
+
+    dependencies {
+        classpath 'com.android.tools.build:gradle:3.1.2'
+        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+
+        // NOTE: Do not place your application dependencies here; they belong
+        // in the individual module build.gradle files
+    }
+}
+
+allprojects {
+    repositories {
+        jcenter()
+        google()
+        maven { url "https://jitpack.io" }
+    }
+}
+
+task clean(type: Delete) {
+    delete rootProject.buildDir
+}
diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt
new file mode 100644
index 0000000000000000000000000000000000000000..3171e70ba66b1188ccd67c99c03458ce5b9d0168
--- /dev/null
+++ b/fastlane/metadata/android/en-US/full_description.txt
@@ -0,0 +1,11 @@
+A simple calendar with optional CalDAV synchronization. You can easily create recurring events and setup reminders, it can also display week numbers.
+
+Contains a monthly view and an event list widget where you can customize the color of the text, as well as the alpha and the color of the background.
+
+Contains no ads or unnecessary permissions. It is fully opensource, provides customizable colors.
+
+The Storage permission is needed only for exporting or importing events from .ics files.
+
+The Contacts permission is used only for importing contact birthdays and anniversaries.
+
+This app is just one piece of a bigger series of apps. You can find the rest of them at https://www.simplemobiletools.com
diff --git a/fastlane/metadata/android/en-US/images/featureGraphic.png b/fastlane/metadata/android/en-US/images/featureGraphic.png
new file mode 100644
index 0000000000000000000000000000000000000000..e328550e435a2362cb54adeb2235ecf5fffbaa40
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/featureGraphic.png differ
diff --git a/fastlane/metadata/android/en-US/images/icon.png b/fastlane/metadata/android/en-US/images/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..377b57397342850f8f568403efbc8b31f93eeef2
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/icon.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/app.png
new file mode 100644
index 0000000000000000000000000000000000000000..282504c7a3c1dcb1df1433595e51c8e498487217
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.png
new file mode 100644
index 0000000000000000000000000000000000000000..5605a1feaca69a4a0c7e87eacf39de1f566be64f
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_2.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.png
new file mode 100644
index 0000000000000000000000000000000000000000..57625cf9f963c585c5735659d69bc68f8e05a2ff
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_3.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.png
new file mode 100644
index 0000000000000000000000000000000000000000..a7750795c2354a64cdb27cb658880eeb05b704a6
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_4.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.png
new file mode 100644
index 0000000000000000000000000000000000000000..eca6d7ed8276f732dff2ada27cec1473faf21962
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_5.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.png
new file mode 100644
index 0000000000000000000000000000000000000000..0a2533bd0a0530477df6f3211713cacccf0cf82d
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/app_6.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/widget.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/widget.png
new file mode 100644
index 0000000000000000000000000000000000000000..ae3ee3c32895ba4ec535d05f3e07c7c606dcc756
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/widget.png differ
diff --git a/fastlane/metadata/android/en-US/images/phoneScreenshots/widget_config.png b/fastlane/metadata/android/en-US/images/phoneScreenshots/widget_config.png
new file mode 100644
index 0000000000000000000000000000000000000000..679355bc2124d61879b036e81763a899ee886c39
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/phoneScreenshots/widget_config.png differ
diff --git a/fastlane/metadata/android/en-US/images/sevenInchScreenshots/tablet-7.png b/fastlane/metadata/android/en-US/images/sevenInchScreenshots/tablet-7.png
new file mode 100644
index 0000000000000000000000000000000000000000..81571cbde58959d7676e081c1e87b24cc316fd41
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/sevenInchScreenshots/tablet-7.png differ
diff --git a/fastlane/metadata/android/en-US/images/tenInchScreenshots/tablet-10.png b/fastlane/metadata/android/en-US/images/tenInchScreenshots/tablet-10.png
new file mode 100644
index 0000000000000000000000000000000000000000..fb53897ac73bad4f308297d7ba02119254cf30f7
Binary files /dev/null and b/fastlane/metadata/android/en-US/images/tenInchScreenshots/tablet-10.png differ
diff --git a/fastlane/metadata/android/en-US/short_description.txt b/fastlane/metadata/android/en-US/short_description.txt
new file mode 100644
index 0000000000000000000000000000000000000000..c41e4271e23d61e19928f1681cee8605ea3687e9
--- /dev/null
+++ b/fastlane/metadata/android/en-US/short_description.txt
@@ -0,0 +1 @@
+A simple calendar with events, customizable widget and no ads.
diff --git a/fastlane/metadata/android/en-US/title.txt b/fastlane/metadata/android/en-US/title.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6ef5af5e9f8c5c778cefa744c2c08bf5bacea107
--- /dev/null
+++ b/fastlane/metadata/android/en-US/title.txt
@@ -0,0 +1 @@
+Simple Calendar
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000000000000000000000000000000000000..05ef575b0cd0173fc735f2857ce4bd594ce4f6bd
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000000000000000000000000000000000000..65417b39061e43df80ad2124749dd93e91edf41e
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Tue Nov 07 14:52:59 CET 2017
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-4.4.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100644
index 0000000000000000000000000000000000000000..9d82f78915133e1c35a6ea51252590fb38efac2f
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,160 @@
+#!/usr/bin/env bash
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+esac
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Split up the JVM_OPTS And GRADLE_OPTS values into an array, following the shell quoting and substitution rules
+function splitJvmOpts() {
+    JVM_OPTS=("$@")
+}
+eval splitJvmOpts $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS
+JVM_OPTS[${#JVM_OPTS[*]}]="-Dorg.gradle.appname=$APP_BASE_NAME"
+
+exec "$JAVACMD" "${JVM_OPTS[@]}" -classpath "$CLASSPATH" org.gradle.wrapper.GradleWrapperMain "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000000000000000000000000000000000000..8a0b282aa6885fb573c106b3551f7275c5f17e8e
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,90 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windowz variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+if "%@eval[2+2]" == "4" goto 4NT_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+goto execute
+
+:4NT_args
+@rem Get arguments from the 4NT Shell from JP Software
+set CMD_LINE_ARGS=%$
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..e7b4def49cb53d9aa04228dd3edb14c9e635e003
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1 @@
+include ':app'
diff --git a/signing.properties_sample b/signing.properties_sample
new file mode 100644
index 0000000000000000000000000000000000000000..cf8e23968ff5d2a0371d2f04e9dd9206a839b9fe
--- /dev/null
+++ b/signing.properties_sample
@@ -0,0 +1,3 @@
+STORE_FILE=/path/to/your.keystore
+KEY_ALIAS=projectkeyalias
+PASSWORD=yourpass