diff --git a/server.py b/server.py
index 0379c89f97180785e9de09399d063c28f38c510d..827e063c8ed0645b0ba23d87174e23b0c993a9de 100755
--- a/server.py
+++ b/server.py
@@ -22,7 +22,7 @@ import config
 from shared import db, date_filter, datetime_filter, date_filter_long, time_filter, ldap_manager, security_manager, current_user, check_login, login_required, group_required, class_filter
 from utils import is_past, mail_manager, url_manager, get_first_unused_int, set_etherpad_text, get_etherpad_text, split_terms
 from models.database import ProtocolType, Protocol, DefaultTOP, TOP, Document, Todo, Decision, MeetingReminder, Error
-from views.forms import LoginForm, ProtocolTypeForm, DefaultTopForm, MeetingReminderForm, NewProtocolForm, DocumentUploadForm, KnownProtocolSourceUploadForm, NewProtocolSourceUploadForm, ProtocolForm, TopForm, SearchForm
+from views.forms import LoginForm, ProtocolTypeForm, DefaultTopForm, MeetingReminderForm, NewProtocolForm, DocumentUploadForm, KnownProtocolSourceUploadForm, NewProtocolSourceUploadForm, ProtocolForm, TopForm, SearchForm, NewProtocolFileUploadForm
 from views.tables import ProtocolsTable, ProtocolTypesTable, ProtocolTypeTable, DefaultTOPsTable, MeetingRemindersTable, ErrorsTable, TodosTable, DocumentsTable, DecisionsTable
 
 app = Flask(__name__)
@@ -398,6 +398,7 @@ def new_protocol():
     protocoltypes = ProtocolType.get_modifiable_protocoltypes(user)
     form = NewProtocolForm(protocoltypes)
     upload_form = NewProtocolSourceUploadForm(protocoltypes)
+    file_upload_form = NewProtocolFileUploadForm(protocoltypes)
     if form.validate_on_submit():
         protocoltype = ProtocolType.query.filter_by(id=form.protocoltype.data).first()
         if protocoltype is None or not protocoltype.has_modify_right(user):
@@ -410,7 +411,8 @@ def new_protocol():
     type_id = request.args.get("type_id")
     if type_id is not None:
         form.protocoltype.data = type_id
-    return render_template("protocol-new.html", form=form, upload_form=upload_form, protocoltypes=protocoltypes)
+        upload_form.protocoltype.data = type_id
+    return render_template("protocol-new.html", form=form, upload_form=upload_form, file_upload_form=file_upload_form, protocoltypes=protocoltypes)
 
 @app.route("/protocol/show/<int:protocol_id>")
 def show_protocol(protocol_id):
@@ -488,31 +490,62 @@ def upload_source_to_known_protocol(protocol_id):
 @login_required
 def upload_new_protocol():
     user = current_user()
-    available_types = [
-        protocoltype for protocoltype in ProtocolType.query.all()
-        if protocoltype.has_modify_right(user)
-    ]
+    available_types = ProtocolType.get_modifiable_protocoltypes()
     form = NewProtocolSourceUploadForm(protocoltypes=available_types)
     if form.validate_on_submit():
         if form.source.data is None:
             flash("Es wurde keine Datei ausgewählt.", "alert-error")
-        else:
-            file = form.source.data
-            if file.filename == "":
-                flash("Es wurde keine Datei ausgewählt.", "alert-error")
-            else:
-                source = file.stream.read().decode("utf-8")
-                protocoltype = ProtocolType.query.filter_by(id=form.protocoltype.data).first()
-                if protocoltype is None or not protocoltype.has_modify_right(user):
-                    flash("Invalider Protokolltyp oder keine Rechte.", "alert-error")
-                else:
-                    protocol = Protocol(protocoltype.id, None, source)
-                    db.session.add(protocol)
-                    db.session.commit()
-                    tasks.parse_protocol(protocol)
-                    return redirect(request.args.get("next") or url_for("show_protocol", protocol_id=protocol.id))
+            return redirect(request.args.get("fail") or url_for("new_protocol"))
+        file = form.source.data
+        if file.filename == "":
+            flash("Es wurde keine Datei ausgewählt.", "alert-error")
+            return redirect(request.args.get("fail") or url_for("new_protocol"))
+        source = file.stream.read().decode("utf-8")
+        protocoltype = ProtocolType.query.filter_by(id=form.protocoltype.data).first()
+        if protocoltype is None or not protocoltype.has_modify_right(user):
+            flash("Invalider Protokolltyp oder keine Rechte.", "alert-error")
+            return redirect(request.args.get("fail") or url_for("new_protocol"))
+        protocol = Protocol(protocoltype.id, None, source)
+        db.session.add(protocol)
+        db.session.commit()
+        tasks.parse_protocol(protocol)
+        return redirect(request.args.get("next") or url_for("show_protocol", protocol_id=protocol.id))
+    return redirect(request.args.get("fail") or url_for("new_protocol"))
+
+@app.route("/protocol/upload/new/file/", methods=["POST"])
+@login_required
+def upload_new_protocol_by_file():
+    user = current_user()
+    available_types = ProtocolType.get_modifiable_protocoltypes(user)
+    form = NewProtocolFileUploadForm(protocoltypes=available_types)
+    if form.validate_on_submit():
+        if form.file.data is None:
+            flash("Es wurde keine Datei ausgewählt.", "alert-error")
+            return redirect(request.args.get("fail") or url_for("new_protocol"))
+        file = form.file.data
+        if file.filename == "":
+            flash("Es wurde keine Datei ausgewählt.", "alert-error")
+            return redirect(request.args.get("fail") or url_for("new_protocol"))
+        filename = secure_filename(file.filename)
+        protocoltype = ProtocolType.query.filter_by(id=form.protocoltype.data).first()
+        if protocoltype is None or not protocoltype.has_modify_right(user):
+            flash("Invalider Protokolltyp oder keine Rechte.", "alert-error")
+            return redirect(request.args.get("fail") or url_for("new_protocol"))
+        protocol = Protocol(protocoltype.id, datetime.now().date(), done=True)
+        db.session.add(protocol)
+        db.session.commit()
+        document = Document(protocol.id, filename, "", False, form.private.data)
+        db.session.add(document)
+        db.session.commit()
+        internal_filename = "{}-{}-{}".format(protocol.id, document.id, filename)
+        document.filename = internal_filename
+        file.save(os.path.join(config.DOCUMENTS_PATH, internal_filename))
+        db.session.commit()
+        return redirect(request.args.get("next") or url_for("show_protocol", protocol_id=protocol.id))
     return redirect(request.args.get("fail") or url_for("new_protocol"))
 
+
+
 @app.route("/protocol/source/<int:protocol_id>")
 @login_required
 def get_protocol_source(protocol_id):
diff --git a/templates/protocol-new.html b/templates/protocol-new.html
index c6110fdd50df18cdad4c604470cb35c3ae1a713f..9b761a8ce56d3acbc5e3e4613e63b145acb111e6 100644
--- a/templates/protocol-new.html
+++ b/templates/protocol-new.html
@@ -10,8 +10,10 @@
             {{render_form(form, action_url=url_for("new_protocol"), action_text="Anlegen")}}
         </div>
         <div id="left-column" class="col-lg-6">
-            <h3>Neues Protokoll hochladen</h3>
+            <h3>Quellcode hochladen</h3>
             {{render_form(upload_form, action_url=url_for("upload_new_protocol", fail=url_for("new_protocol")), action_text="Hochladen", enctype="multipart/form-data")}}
+            <h3>Datei hochladen</h3>
+            {{render_form(file_upload_form, action_url=url_for("upload_new_protocol_by_file", fail=url_for("new_protocol")), action_text="Hochladen", enctype="multipart/form-data")}}
         </div>
     </div>
 </div>
diff --git a/views/forms.py b/views/forms.py
index 90f4ddc80d9d55e6316c4324de8f7741a28fa200..1c579e8edb375ae8e668f874a89b0717980b43f4 100644
--- a/views/forms.py
+++ b/views/forms.py
@@ -56,6 +56,15 @@ class NewProtocolSourceUploadForm(FlaskForm):
         super().__init__(**kwargs)
         self.protocoltype.choices = [(protocoltype.id, protocoltype.short_name) for protocoltype in protocoltypes]
 
+class NewProtocolFileUploadForm(FlaskForm):
+    file = FileField("Datei")
+    protocoltype = SelectField("Typ", choices=[], coerce=int)
+    private = BooleanField("Intern")
+
+    def __init__(self, protocoltypes, **kwargs):
+        super().__init__(**kwargs)
+        self.protocoltype.choices = [(protocoltype.id, protocoltype.short_name) for protocoltype in protocoltypes]
+
 class ProtocolForm(FlaskForm):
     date = DateField("Datum", validators=[InputRequired("Bitte gib das Datum des Protkolls an.")], format="%d.%m.%Y")
     start_time = DateTimeField("Beginn", format="%H:%M", validators=[Optional()])