diff --git a/app/src/apkFlavor/AndroidManifest.xml b/app/src/apkFlavor/AndroidManifest.xml
index 2357f4642..cf6a61194 100644
--- a/app/src/apkFlavor/AndroidManifest.xml
+++ b/app/src/apkFlavor/AndroidManifest.xml
@@ -71,6 +71,7 @@
     
     
     
+    
     
@@ -143,6 +144,7 @@
         
         
         
+        
 
         
         
         
+        
 
         
     
     
+    
     
@@ -140,6 +141,7 @@
         
         
         
+        
 
         
         
         
+        
 
         
     
     
+    
     
@@ -125,6 +126,7 @@
         
         
         
+        
 
         
         
         
+        
 
          calendarEvents = CalendarReceiver.readCalendarEvents(AutomationService.getInstance());
+
+			/*
+				0 = titleDirection
+				1 = title;
+				2 = descriptionDirection
+				3 = description
+				4 = eventLocationDirection
+				5 = eventLocation
+				6 = availabilityDirection
+				7 = availability
+			 */
+
+			for(CalendarReceiver.CalendarEvent event : calendarEvents)
+			{
+				boolean isActive = Boolean.parseBoolean(conditions[0]);
+				if(isActive == event.isCurrentActive())
+				{
+					if(Miscellaneous.compare(conditions[0], conditions[1], event.title))
+					{
+						// title matches according to demands
+
+						if(Miscellaneous.compare(conditions[2], conditions[3], event.description))
+						{
+							// description matches according to demands
+
+							if(Miscellaneous.compare(conditions[4], conditions[5], event.location))
+							{
+								// location matches according to demands
+
+								if(Miscellaneous.compare(conditions[6], conditions[7], event.availability))
+								{
+									// availability matches according to demands
+
+									return true;
+								}
+							}
+						}
+					}
+				}
+			}
+
+			return false;
+
+			//TODO: If trigger demands no calendar event and there is absolutely no future event, we'll need to check for that.
+		}
+		catch(Exception e)
+		{
+			Miscellaneous.logEvent("e", "checkVariable()", Log.getStackTraceString(e), 1);
+		}
+
+		return false;
+	}
+
     boolean checkBluetooth()
 	{
 		Miscellaneous.logEvent("i", Miscellaneous.getAnyContext().getResources().getString(R.string.ruleCheckOf), String.format("Checking for bluetooth...", this.getParentRule().getName()), 4);
diff --git a/app/src/main/java/com/jens/automation2/receivers/CalendarReceiver.java b/app/src/main/java/com/jens/automation2/receivers/CalendarReceiver.java
new file mode 100644
index 000000000..f9474c7e6
--- /dev/null
+++ b/app/src/main/java/com/jens/automation2/receivers/CalendarReceiver.java
@@ -0,0 +1,128 @@
+package com.jens.automation2.receivers;
+
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.Cursor;
+import android.net.Uri;
+
+import com.jens.automation2.AutomationService;
+import com.jens.automation2.Miscellaneous;
+import com.jens.automation2.Rule;
+import com.jens.automation2.Trigger;
+
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+
+public class CalendarReceiver extends BroadcastReceiver implements AutomationListenerInterface
+{
+    static BroadcastReceiver calendarReceiverInstance = null;
+    static boolean calendarReceiverActive = false;
+    static IntentFilter calendarIntentFilter = null;
+    @Override
+    public void onReceive(Context context, Intent intent)
+    {
+        if(intent.getAction().equalsIgnoreCase(Intent.ACTION_PROVIDER_CHANGED))
+        {
+            ArrayList ruleCandidates = Rule.findRuleCandidates(Trigger.Trigger_Enum.calendarEvent);
+            for(int i = 0; i < ruleCandidates.size(); i++)
+            {
+                if(ruleCandidates.get(i).getsGreenLight(context))
+                    ruleCandidates.get(i).activate(AutomationService.getInstance(), false);
+            }
+        }
+    }
+
+    @Override
+    public void startListener(AutomationService automationService)
+    {
+        if(!calendarReceiverActive)
+        {
+            if(calendarReceiverInstance == null)
+                calendarReceiverInstance = new BatteryReceiver();
+
+            if(calendarIntentFilter == null)
+            {
+                calendarIntentFilter = new IntentFilter();
+                calendarIntentFilter.addAction(Intent.ACTION_PROVIDER_CHANGED);
+            }
+
+            AutomationService.getInstance().registerReceiver(calendarReceiverInstance, calendarIntentFilter);
+
+            calendarReceiverActive = true;
+        }
+    }
+
+    @Override
+    public void stopListener(AutomationService automationService)
+    {
+        if(calendarReceiverActive)
+        {
+            if(calendarReceiverInstance != null)
+            {
+                AutomationService.getInstance().unregisterReceiver(calendarReceiverInstance);
+                calendarReceiverInstance = null;
+            }
+
+            calendarReceiverActive = false;
+        }
+    }
+
+    @Override
+    public boolean isListenerRunning()
+    {
+        return calendarReceiverActive;
+    }
+
+    @Override
+    public Trigger.Trigger_Enum[] getMonitoredTrigger()
+    {
+        return new Trigger.Trigger_Enum[]{Trigger.Trigger_Enum.calendarEvent};
+    }
+
+    public static class CalendarEvent
+    {
+        public String id, title, description, location, availability;
+        public Calendar start, end;
+
+        public boolean isCurrentActive()
+        {
+            Calendar now = Calendar.getInstance();
+            return now.getTimeInMillis() >= start.getTimeInMillis() && now.getTimeInMillis() < end.getTimeInMillis();
+        }
+    }
+
+    public static List readCalendarEvents(Context context)
+    {
+        Cursor cursor = context.getContentResolver()
+                .query(
+                        Uri.parse("content://com.android.calendar/events"),
+                        new String[] { "calendar_id", "title", "description", "dtstart", "dtend", "eventLocation", "AVAILABILITY" },
+                        null, null, null);
+
+        cursor.moveToFirst();
+        // fetching calendars name
+        String CNames[] = new String[cursor.getCount()];
+
+        List eventlist = new ArrayList<>();
+
+        for (int i = 0; i < CNames.length; i++)
+        {
+            CalendarEvent event = new CalendarEvent();
+            event.id = cursor.getString(1);
+            event.title = cursor.getString(2);
+            event.description = cursor.getString(3);
+            event.start = Miscellaneous.calendarFromLong(Long.parseLong(cursor.getString(4)));
+            event.end = Miscellaneous.calendarFromLong(Long.parseLong(cursor.getString(5)));
+            event.location = cursor.getString(6);
+            event.availability = cursor.getString(7)
+            eventlist.add(event);
+
+            cursor.moveToNext();
+        }
+
+        return eventlist;
+    }
+}
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_manage_trigger_calendar.xml b/app/src/main/res/layout/activity_manage_trigger_calendar.xml
new file mode 100644
index 000000000..64f7e99bb
--- /dev/null
+++ b/app/src/main/res/layout/activity_manage_trigger_calendar.xml
@@ -0,0 +1,213 @@
+
+
+
+	
+
+		
+
+		
+
+			
+
+				
+
+				
+
+			
+
+			
+
+			
+
+			
+
+			
+
+				
+
+				
+
+					
+
+					
+
+				
+
+			
+
+			
+	    
+			
+
+				
+
+				
+
+					
+
+					
+
+				
+
+			
+
+			
+
+			
+
+				
+
+				
+
+					
+
+					
+
+				
+
+			
+
+			
+
+			
+
+				
+
+				
+
+					
+
+					
+
+				
+
+			
+
+		
+
+		
+
+	
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 1c2676986..6c1c64f75 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -905,4 +905,11 @@
     BATTERY_SAVING
     HIGH_ACCURACY
     The result of this request will be stored in the variable LAST_TRIGGERURL_RESULT if you wish to check it from another rule. In case of HTTP errors like 404 the value will be \"HTTP_ERROR\".
+    calendar event
+    Event is currently active
+    Calendar event
+    Location
+    Description/notes
+    Marked as
+    Event is currently not happening/has ended
 
\ No newline at end of file