diff --git a/README.md b/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..7d01f4bf16d681b2f44667083a4577d1394a10b1
--- /dev/null
+++ b/README.md
@@ -0,0 +1,49 @@
+# Install
+
+To install all requirements simply type `pip install -r requirements.txt`. It is recommended to use a [virtualenv](https://virtualenv.pypa.io/en/stable/)
+
+# Usage
+
+## check output
+
+```
+usage: program_info.py [-h] [--preview]
+
+UFC Programminfo Bot
+
+optional arguments:
+  -h, --help  show this help message and exit
+  --preview   Überprüfe die nächsten 7 Tage statt nur den nächsten Tag.
+```
+
+## twitter
+
+```
+usage: twitter_bot.py [-h] [--doit] [--dest DEST] [--preview]
+
+UFC Twitter Bot
+
+optional arguments:
+  -h, --help   show this help message and exit
+  --doit       Sendet die Nachricht über den UFC Twitter Account, anstatt sie
+               nur auszugeben
+  --dest DEST  Schreibe DEST per mention an
+  --preview    Überprüfe die nächsten 7 Tage statt nur den nächsten Tag.
+```
+
+## telegram
+
+```
+usage: telegram_bot.py [-h] [--doit] [--dest DEST] [--preview]
+
+UFC Telegram Bot
+
+optional arguments:
+  -h, --help   show this help message and exit
+  --doit       Sendet die Nachricht an den UFC Channel, anstatt nur eine
+               Ausgabe zu machen
+  --dest DEST  Alternativer Telegramchat
+  --preview    Überprüfe die nächsten 7 Tage statt nur den nächsten Tag.
+
+```
+
diff --git a/program_info.py b/program_info.py
new file mode 100644
index 0000000000000000000000000000000000000000..908909519adb78413b53851857f63ff2e812b567
--- /dev/null
+++ b/program_info.py
@@ -0,0 +1,147 @@
+#!/bin/env python3
+import datetime
+import json
+import re
+from argparse import ArgumentParser
+from datetime import timedelta
+from io import BytesIO
+from pprint import pprint
+
+import requests
+from dateutil import parser as date_parser
+from pytz import UTC
+
+
+class Date:
+    weekday = ""
+    day = ""
+    month = ""
+    year = ""
+    time = ""
+
+    def __init__(self):
+        pass
+
+class NextEvent:
+    date = Date()
+    title = ""
+    description = ""
+    movie_description = ""
+    tags = ""
+    link = ""
+    image = ""
+
+    days = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]
+    month = [
+        "Januar",
+        "Februar",
+        "März",
+        "April",
+        "Mai",
+        "Juni",
+        "Juli",
+        "August",
+        "September",
+        "Oktober",
+        "November",
+        "Dezember"
+    ]
+
+    def __init__(self, next_event, now):
+        # passende Zeitangabe raussuchen
+        event_date = date_parser.parse(next_event["date"])
+        tomorrow = now + timedelta(days=1)
+        if event_date.day == now.day and event_date.month == now.month and event_date.year == now.year:
+            start = "Heute"
+        elif event_date.day == tomorrow.day and event_date.month == tomorrow.month and event_date.year == tomorrow.year:
+            start = "Morgen"
+        else:
+            start = self.days[event_date.weekday()]
+
+        self.date.weekday = start
+        self.date.day = event_date.day
+        self.date.month = self.month[event_date.month - 1]
+        self.date.year = event_date.year
+        self.date.time = event_date.strftime("%H:%M")
+
+        # Title des Events
+        self.title = next_event["title"]
+
+        # Beschreibung des Events
+        self.description = next_event["description"]
+
+        # Beschreibung des Films
+        self.movie_description = next_event["movie"]["description"]
+
+        # Baue die Tag-Reihe zusammen.
+        self.tags = " | ".join([w["description"] for w in next_event["tags"]])
+
+        # Generiere die URL zum Event, da diese nicht im JSON steht.
+        link = next_event["title"].lower().replace('ö', 'o').replace('ä', 'a').replace('ü', 'u').replace('ß', 'ss')
+        link = re.sub("[^[A-Za-z0-9]", '-', link)
+        link = re.sub(r"-{2,}", '-', link)
+        link: str = link.rstrip("-")
+        link = str(next_event["id"]) + "-" + link
+        self.link = "https://ufc.tu-dortmund.de/vorstellung/%s" % link
+
+        if next_event["movie"]["youtube_id"] is not "":
+            self.trailer = "https://youtu.be/%s" % next_event["movie"]["youtube_id"]
+
+        response = requests.get("https://ufc.tu-dortmund.de/%s"
+                                % next_event['movie']['image_url_medium']
+                                .replace('medium', 'original'))
+        self.image = BytesIO(response.content)
+
+
+class ProgramInfo:
+    semester = ""
+
+    next_event = ""
+
+    def __init__(self):
+        # Hole das UFC Semester
+        self.semester = json.loads(
+            requests.get(url="https://ufc.tu-dortmund.de/semesters/current.json").text
+        )
+
+    def get_next_event(self, day_diff, just_print=False):
+        # Finde das nächste Event, dass nach heute ist und in `day_diff` Tagen stattfindet.
+        now = UTC.localize(
+            datetime.datetime.now()
+        )
+        for i in self.semester:
+            d = date_parser.parse(i["date"])
+            if d > now and (d - now).days <= day_diff:
+                if just_print:
+                    pprint(i)
+                else:
+                    self.next_event = NextEvent(i, now)
+                    return self.next_event
+
+    def get_image(self):
+        # return image data
+        return self.next_event.image
+
+
+def main():
+    # Parse Arguments
+    aparser: ArgumentParser = ArgumentParser(
+        description="UFC Programminfo Bot"
+    )
+    aparser.add_argument(
+        "--preview",
+        dest='day_diff',
+        action="store_const",
+        const=7,
+        default=1,
+        help="Überprüfe die nächsten 7 Tage statt nur den nächsten Tag."
+    )
+    args = aparser.parse_args()
+
+    p_info = ProgramInfo()
+
+    p_info.get_next_event(args.day_diff, True)
+
+
+if __name__ == "__main__":
+    main()
diff --git a/programminformbot b/programminformbot
deleted file mode 100755
index d0109f6b11038e6ed125157dddbfe21115f53903..0000000000000000000000000000000000000000
--- a/programminformbot
+++ /dev/null
@@ -1,146 +0,0 @@
-#!/bin/env python3
-import requests, json
-from pprint import pprint
-import datetime
-from datetime import timedelta
-from dateutil import parser
-from pytz import UTC
-import re
-import telepot
-import argparse
-
-telegram_recv = "@ufcdortmund" #kanal
-
-#Parse Arguments
-aparser = argparse.ArgumentParser(
-				description="UFC Telegram Bot"
-)
-aparser.add_argument(
-				"--doit",
-				action="store_true",
-				help="Sendet die Nachricht an den UFC Channel, anstatt nur eine Ausgabe zu machen"
-)
-aparser.add_argument(
-				"--dest",
-				help="Alternativer Telegramchat"
-)
-aparser.add_argument(
-				"--json",
-				action="store_true",
-				help="Schreibt das nächste Event in JSON nach stdout und beendet das Programm."
-)
-args = aparser.parse_args()
-# Überschreibe den Telegramkanal, wenn einer angegeben wurde. (Praktisch für Debugging)
-if not args.dest is None:
-	telegram_recv = args.dest
-
-#Hole das UFC Semester
-semester = json.loads(
-				requests.get(url="https://ufc.tu-dortmund.de/semesters/current.json").text
-)
-now = UTC.localize(
-				datetime.datetime.now()
-)
-
-# Finde heraus, ob morgen ein Event ansteht. Wenn der Bot nicht im doit-Modus ist, guckt er auch ob übermorgen ein Event ist.
-next_event = None
-if args.doit:
-	daydiff = 1
-else:
-	daydiff = 2
-
-# Finde das nächste Event, dass nach heute ist und morgen oder übermorgen stattfindet.
-for i in semester:
-	d = parser.parse(i["date"])
-	if d > now and (d-now).days <= (daydiff):
-		next_event = i
-		break
-
-# Wenn es keinen öffentlichen Film gibt, brich ab.
-if next_event is None:
-	print("keine Filme in nächster Zeit")
-	exit(0)
-
-# Wenn der Bot nur nach dem JSON des Events suchen sollte, soll er es ausgeben und beenden.
-if args.json is True:
-	print(next_event)
-	exit(0)
-
-
-# Textkonstanten für Datum
-tage = ["Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag"]
-monate = [
-				"Januar",
-				"Februar",
-				"März",
-				"April",
-				"Mai",
-				"Juni",
-				"Juli",
-				"August",
-				"September",
-				"Oktober",
-				"November",
-				"Dezember"
-]
-
-# passende Zeitangabe raussuchen
-evda = parser.parse(next_event["date"])
-tomorrow = now + timedelta(days=1)
-dif = (evda-now)
-if evda.day == now.day and evda.month == now.month and evda.year == now.year:
-	anfang = "Heute"
-elif evda.day == tomorrow.day and evda.month == tomorrow.month and evda.year == tomorrow.year:
-	anfang = "Morgen"
-else:
-	anfang = tage[evda.weekday()]
-
-
-# Generiere die URL zum Event, da diese nicht im JSON steht.
-title = next_event["title"].lower().replace('ö', 'o').replace('ä', 'a').replace('ü', 'u').replace('ß', 'ss')
-title = re.sub("[^[A-Za-z0-9]", '-', title)
-title = re.sub(r"-{2,}", '-', title)
-title = title.rstrip("-")
-title = str(next_event["id"]) + "-" + title
-
-# Baue die Tag-Reihe zusammen.
-tags = " | ".join([ w["description"] for w in  next_event["tags"]])
-
-# Erste Nachricht zusammenbauen
-ankündigung = [
-				("%s, %d. %s %d um %s Uhr im UFC:\n" % (anfang, evda.day, monate[evda.month-1], evda.year, evda.strftime("%H:%M"))),
-				"\n",
-				"*", next_event["title"], "*\n",
-				"\n",
-				next_event["description"], "" if next_event["description"] is "" else "\n",
-				next_event["movie"]["description"], "\n",
-				"\n",
-				tags, "\n",
-				"\n",
-				"[Link zur Veranstaltung](https://ufc.tu-dortmund.de/vorstellung/%s?pk_campaign=telegram)" % title
-]
-
-
-# Trailernachricht zusammenbauen
-if next_event["movie"]["youtube_id"] is "":
-	print("Es gibt keinen Trailer")
-else:
-	ankündigung.append(
-				"\n[Link zum Trailer](https://youtu.be/%s)" % next_event["movie"]["youtube_id"]
-				)
-
-
-ankündigung=''.join(ankündigung)
-
-print("Vorschau Ankündigung:")
-print(ankündigung)
-
-
-# Nur abschicken, wenn es wirklich verlangt wird. Ansonsten nur in die Konsole schreiben
-if args.doit is True:
-	print("\nSchick Nachricht an Telegramchat " + telegram_recv)
-	bot = telepot.Bot("247551569:AAHpTb4pR8Vq8FlEWYC3O8cOD2OIzQKADyQ") # UFC-Do-Bot
-	bot.sendMessage(telegram_recv, ankündigung, parse_mode="markdown", disable_web_page_preview=True)
-else:
-	print("\n--doit wurde nicht gesetzt. Programm endet hier")
-
diff --git a/requirements.txt b/requirements.txt
index 927a31a125aec86c8c468a75554884fdf96aa9e5..98d4c29a4cecfdd479cefb8581357b404bf246a0 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -2,3 +2,4 @@ python-dateutil
 telepot
 requests
 pytz
+tweepy
\ No newline at end of file
diff --git a/telegram_bot.py b/telegram_bot.py
new file mode 100755
index 0000000000000000000000000000000000000000..f05f2aca680a4c83e931c8080a56fb2b82f36d91
--- /dev/null
+++ b/telegram_bot.py
@@ -0,0 +1,70 @@
+#!/bin/env python3
+import telepot
+import argparse
+from program_info import ProgramInfo
+
+telegram_recv = "@ufcdortmund"  # kanal
+
+# Parse Arguments
+aparser = argparse.ArgumentParser(
+    description="UFC Telegram Bot"
+)
+aparser.add_argument(
+    "--doit",
+    action="store_true",
+    help="Sendet die Nachricht an den UFC Channel, anstatt nur eine Ausgabe zu machen"
+)
+aparser.add_argument(
+    "--dest",
+    help="Alternativer Telegramchat"
+)
+aparser.add_argument(
+    "--preview",
+    dest='day_diff',
+    action="store_const",
+    const=7,
+    default=1,
+    help="Überprüfe die nächsten 7 Tage statt nur den nächsten Tag."
+)
+args = aparser.parse_args()
+# Überschreibe den Telegramkanal, wenn einer angegeben wurde. (Praktisch für Debugging)
+if not args.dest is None:
+    telegram_recv = args.dest
+
+program_info = ProgramInfo()
+
+next_event = program_info.get_next_event(args.day_diff)
+
+date = next_event.date
+
+# Erste Nachricht zusammenbauen
+message = [
+    ("%s, %d. %s %d um %s Uhr im UFC:\n" % (
+    date.weekday, date.day, date.month, date.year, date.time)),
+    "\n",
+    "*", next_event.title, "*\n",
+    "\n",
+    next_event.description, "" if next_event.description is "" else "\n",
+    next_event.movie_description, "\n",
+    "\n",
+    next_event.tags, "\n",
+    "\n",
+    "[Link zur Veranstaltung](%s?pk_campaign=telegram)" % next_event.link
+]
+
+# Trailernachricht zusammenbauen
+if next_event.trailer is not "":
+    message.append("\n[Link zum Trailer](https://youtu.be/%s)" % next_event.trailer)
+
+text = ''.join(message)
+
+print("Vorschau Ankündigung:")
+print(text)
+
+# Nur abschicken, wenn es wirklich verlangt wird. Ansonsten nur in die Konsole schreiben
+if args.doit is True:
+    print("\nSchick Nachricht an Telegramchat " + telegram_recv)
+    bot = telepot.Bot("247551569:AAHpTb4pR8Vq8FlEWYC3O8cOD2OIzQKADyQ")  # UFC-Do-Bot
+    bot.sendMessage(telegram_recv, text, parse_mode="markdown", disable_web_page_preview=True)
+else:
+    print("\n--doit wurde nicht gesetzt. Programm endet hier")
diff --git a/twitter_bot.py b/twitter_bot.py
new file mode 100644
index 0000000000000000000000000000000000000000..830f2e1eab919fa9f8092c43935b09e2a1bf1a2f
--- /dev/null
+++ b/twitter_bot.py
@@ -0,0 +1,66 @@
+import shutil
+
+import tweepy
+import argparse
+from program_info import ProgramInfo
+
+CONSUMER_KEY = 'WEF5WDeWnql2I292voEG9mww3'
+CONSUMER_SECRET = 'WrUCif5m7rxWDSDTb2YK7Djtb2MmUqFVZZXXcyH87amLbCgdpM'
+ACCESS_TOKEN = '50611492-ALHt50D7VKc8jZA9weQ5zdIF5RWwLhqkTPbgvWG5O'
+ACCESS_TOKEN_SECRET = 'z9Pwf5RjuJjJ8bzlMPCCKkYFukdi01j2oAcWnKdXZcAfZ'
+
+auth = tweepy.OAuthHandler(CONSUMER_KEY, CONSUMER_SECRET)
+auth.set_access_token(ACCESS_TOKEN, ACCESS_TOKEN_SECRET)
+api = tweepy.API(auth)
+
+# Parse Arguments
+aparser = argparse.ArgumentParser(
+    description="UFC Twitter Bot"
+)
+aparser.add_argument(
+    "--doit",
+    action="store_true",
+    help="Sendet die Nachricht über den UFC Twitter Account, anstatt sie nur auszugeben"
+)
+aparser.add_argument(
+    "--dest",
+    help="Schreibe DEST per mention an"
+)
+aparser.add_argument(
+    "--preview",
+    dest='day_diff',
+    action="store_const",
+    const=7,
+    default=1,
+    help="Überprüfe die nächsten 7 Tage statt nur den nächsten Tag."
+)
+args = aparser.parse_args()
+
+program_info = ProgramInfo()
+
+next_event = program_info.get_next_event(args.day_diff)
+
+date = next_event.date
+
+# Twitternachricht zusammenbauen
+message = [
+    ("%s, %d. %s %d um %s Uhr im Hörsaal 1 der EF50:\n" % (
+        date.weekday, date.day, date.month, date.year, date.time)),
+    "\n",
+    next_event.title,
+    "\n",
+    "%s?pk_campaign=twitter" % next_event.link
+]
+
+text = ''.join(message)
+
+image = program_info.get_image()
+
+if not args.dest is None:
+    text = args.dest + " " + text
+
+print("Vorschau Twitter:")
+print(text)
+
+if args.doit:
+    api.update_with_media("image.png", text, file=image)