diff --git a/netmon_core/__init__.py b/netmon_core/__init__.py
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e1d05d401f0f8ae172c3d9de8aed81504784bd09 100644
--- a/netmon_core/__init__.py
+++ b/netmon_core/__init__.py
@@ -0,0 +1,3 @@
+from .tasks import app as celery_app
+
+__all__ = ('celery_app',)
diff --git a/netmon_core/tasks.py b/netmon_core/tasks.py
new file mode 100644
index 0000000000000000000000000000000000000000..4d6a43658b84d451e5f0b0c004b727648d2312d8
--- /dev/null
+++ b/netmon_core/tasks.py
@@ -0,0 +1,56 @@
+from celery import Celery
+from django.core.mail import send_mail
+from django.conf import settings
+from datetime import timedelta
+from django.utils import timezone
+from django.db.models import Q
+from django.template.loader import render_to_string
+from crawler.models import Monitor, Node
+from crawler.models import UserProfile
+
+app = Celery('netmon_core')
+
+def send_offline_notification(monitor):
+    #get Usersettings to corrisponding nodes
+    user_profile = UserProfile.objects.get(user=monitor.user_id)
+
+    # Continiure only if the maximum amount of notification mails is not reach
+    if user_profile.max_notification_interval > monitor.notify_count and monitor.notify:
+        days_since_last_notified = timezone.now().date() - monitor.last_notified
+        if days_since_last_notified >= timedelta(days=user_profile.days_between_notification * monitor.notify_count):
+            monitor.notify_count += 1
+            monitor.last_notified = timezone.now().date()
+            monitor.save()
+
+            subject = f'(Offline) Knoten {monitor.node_id.node_name} ist seit dem {monitor.node_id.last_seen} außer Betrieb'
+            message = render_to_string('offline_notification_email.html', {'monitor': monitor})
+            from_email = settings.DEFAULT_FROM_EMAIL
+            to_email = [monitor.user_id.email]
+
+            send_mail(subject, message, from_email, to_email)
+
+
+def send_online_notification(monitor):
+    monitor.notify_count = 0
+    monitor.last_notified = timezone.now().date()
+    monitor.save()
+
+    subject = f'(Online) Knoten {monitor.node_id.node_name} ist seit dem {monitor.node_id.last_seen} wieder erreichbar'
+    message = render_to_string('online_notification_email.html', {'monitor': monitor})
+    from_email = settings.DEFAULT_FROM_EMAIL
+    to_email = [monitor.user_id.email]
+
+    send_mail(subject, message, from_email, to_email)
+
+
+@app.task
+def check_and_notify():
+    # Get nodes that meet the conditions for notification
+    nodes_to_notify = Node.objects.filter(is_online=False)
+    monitored_nodes_to_notify = Monitor.objects.filter(Q(notify=True) & Q(node_id__in=nodes_to_notify) | Q(notify_count__gt=0))
+    
+    for monitor in monitored_nodes_to_notify:
+        if not monitor.node_id.is_online:
+            send_offline_notification(monitor) 
+        else:
+            send_online_notification(monitor)