diff --git a/integrationtests/basic_test.py b/integrationtests/basic_test.py
new file mode 100644
index 0000000000000000000000000000000000000000..a4becb2c39664e22364cd122e8f9e877c0a2ff8c
--- /dev/null
+++ b/integrationtests/basic_test.py
@@ -0,0 +1,96 @@
+#  This file is a part of the LinkAhead Project.
+#
+#  Copyright (C) 2024 Henrik tom Wörden (h.tomwoerden@indiscale.com)
+#  Copyright (C) 2024 IndiScale GmbH (info@indiscale.com)
+#
+#  This program is free software: you can redistribute it and/or modify
+#  it under the terms of the GNU Affero General Public License as
+#  published by the Free Software Foundation, either version 3 of the
+#  License, or (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY; without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#  GNU Affero General Public License for more details.
+#
+#  You should have received a copy of the GNU Affero General Public License
+#  along with this program. If not, see <https://www.gnu.org/licenses/>.
+
+"""
+basic integration test of the loan workflow
+"""
+
+from pytest import fixture
+import json
+import linkahead as db
+import re
+from tempfile import NamedTemporaryFile
+from linkahead.utils.server_side_scripting import run_server_side_script
+from box_loan import (BORROWER, BOX, COMMENT, DESTINATION, EXHAUST_CONTENTS,
+                      EXPECTED_RETURN, F_BOX, F_COMMENT, F_DESTINATION,PERSON,
+                      F_EMAIL, F_EXHAUST_CONTENTS, F_EXPECTED_RETURN_DATE, EMAIL,
+                      F_FIRST_NAME, F_LAST_NAME, FIRST_NAME, LAST_NAME, LOAN, LOCATION,
+                      LOAN_REQUESTED, assert_date_in_future,
+                      assert_key_in_data, get_box, insert_or_update_person, main,
+                      send_loan_request_mail)
+
+
+TESTLOANCOMMENT = 'This is a test'
+TESTBOXNUMBER = '0123 TEST'
+TESTDESTINATION = 'TEST DEST'
+TESTBORROWEREMAIL = 'test@example.com'
+TESTFN = "Alice"
+TESTLN = "Wunderland"
+
+def delete_stuff():
+    to_be_deleted = db.Container()
+    to_be_deleted.extend(db.execute_query(f"FIND loan with {COMMENT.name}='{TESTLOANCOMMENT}'"))
+    to_be_deleted.extend(db.execute_query(f"FIND '{TESTDESTINATION}'"))
+    to_be_deleted.extend(db.execute_query(f"FIND '{TESTBOXNUMBER}'"))
+    to_be_deleted.extend(db.execute_query(f"FIND person with {EMAIL.name}='{TESTBORROWEREMAIL}'"))
+    if len(to_be_deleted)>0:
+        to_be_deleted.delete()
+
+@fixture(autouse=True)
+def prepare():
+    delete_stuff()
+    db.Record(name=TESTBOXNUMBER).add_parent(BOX.name).insert()
+    db.Record(name=TESTDESTINATION).add_parent(LOCATION.name).insert()
+    (db.Record().add_parent(PERSON.name).add_property(EMAIL.name, TESTBORROWEREMAIL)
+                .add_property(FIRST_NAME.name, TESTFN)
+                .add_property(LAST_NAME.name, TESTLN).insert())
+    yield
+    delete_stuff()
+
+
+def test_request_loan():
+    data = {}
+    data[F_EXHAUST_CONTENTS] = False
+    data[F_EXPECTED_RETURN_DATE]= "2042-02-02"
+    data[F_BOX]=db.utils.get_entity.get_entity_by_name(TESTBOXNUMBER).id
+    data[F_COMMENT]=TESTLOANCOMMENT
+    data[F_DESTINATION]=db.utils.get_entity.get_entity_by_name(TESTDESTINATION).id
+    data[F_EMAIL]=TESTBORROWEREMAIL
+    data[F_LAST_NAME]=TESTLN
+    data[F_FIRST_NAME]=TESTFN
+
+    fi = NamedTemporaryFile(delete=False, suffix=".json")
+    fi.close()
+    with open(fi.name, "w") as f:
+        json.dump(data, f)
+
+    response = run_server_side_script("loan_management/request_loan.py",
+                                    #"pos0",
+                                    #option1="val1",
+                                    files={"-p0": fi.name},
+                                    **{"auth-token":db.get_connection()._authenticator.auth_token})
+    assert response.stderr is None
+    assert response.code == 0
+    loan = db.execute_query(f"FIND loan with {COMMENT.name}='{TESTLOANCOMMENT}'", unique=True)
+    assert loan.get_property(f"{BOX.name}").value == data[F_BOX]
+    assert loan.get_property(f"{LOAN_REQUESTED.name}").value.startswith("20")
+    assert loan.get_property(f"{BORROWER.name}").value == db.execute_query(
+        f"FIND {PERSON.name} with {EMAIL.name}='{TESTBORROWEREMAIL}'", unique=True).id
+    assert loan.get_property(f"{EXPECTED_RETURN.name}").value == data[F_EXPECTED_RETURN_DATE]
+    assert loan.get_property(f"{EXHAUST_CONTENTS.name}").value == data[F_EXHAUST_CONTENTS]
+    assert loan.get_property(f"{DESTINATION.name}").value == data[F_DESTINATION]
diff --git a/integrationtests/box_loan.py b/integrationtests/box_loan.py
new file mode 120000
index 0000000000000000000000000000000000000000..59146e98ae906b78e437917af8e4e22b868ed636
--- /dev/null
+++ b/integrationtests/box_loan.py
@@ -0,0 +1 @@
+../loan-custom/caosdb-server/scripting/bin/loan_management/box_loan.py
\ No newline at end of file
diff --git a/integrationtests/conf.py b/integrationtests/conf.py
new file mode 120000
index 0000000000000000000000000000000000000000..ff726da6bb485ce5add33969b229ddce13950b31
--- /dev/null
+++ b/integrationtests/conf.py
@@ -0,0 +1 @@
+../loan-custom/caosdb-server/scripting/bin/loan_management/conf.py
\ No newline at end of file
diff --git a/caosdb-server/caosdb-webui/src/ext/html/forms/loan-forms/borrow_checkout.html b/loan-custom/caosdb-server/caosdb-webui/src/ext/html/forms/loan-forms/borrow_checkout.html
similarity index 100%
rename from caosdb-server/caosdb-webui/src/ext/html/forms/loan-forms/borrow_checkout.html
rename to loan-custom/caosdb-server/caosdb-webui/src/ext/html/forms/loan-forms/borrow_checkout.html
diff --git a/caosdb-server/caosdb-webui/src/ext/html/forms/loan-forms/return_box.html b/loan-custom/caosdb-server/caosdb-webui/src/ext/html/forms/loan-forms/return_box.html
similarity index 100%
rename from caosdb-server/caosdb-webui/src/ext/html/forms/loan-forms/return_box.html
rename to loan-custom/caosdb-server/caosdb-webui/src/ext/html/forms/loan-forms/return_box.html
diff --git a/caosdb-server/caosdb-webui/src/ext/js/box_loan.js b/loan-custom/caosdb-server/caosdb-webui/src/ext/js/box_loan.js
similarity index 100%
rename from caosdb-server/caosdb-webui/src/ext/js/box_loan.js
rename to loan-custom/caosdb-server/caosdb-webui/src/ext/js/box_loan.js
diff --git a/caosdb-server/scripting/bin/loan_management/accept_loan_request.py b/loan-custom/caosdb-server/scripting/bin/loan_management/accept_loan_request.py
similarity index 100%
rename from caosdb-server/scripting/bin/loan_management/accept_loan_request.py
rename to loan-custom/caosdb-server/scripting/bin/loan_management/accept_loan_request.py
diff --git a/caosdb-server/scripting/bin/loan_management/accept_return_request.py b/loan-custom/caosdb-server/scripting/bin/loan_management/accept_return_request.py
similarity index 100%
rename from caosdb-server/scripting/bin/loan_management/accept_return_request.py
rename to loan-custom/caosdb-server/scripting/bin/loan_management/accept_return_request.py
diff --git a/caosdb-server/scripting/bin/loan_management/box_loan.py b/loan-custom/caosdb-server/scripting/bin/loan_management/box_loan.py
similarity index 100%
rename from caosdb-server/scripting/bin/loan_management/box_loan.py
rename to loan-custom/caosdb-server/scripting/bin/loan_management/box_loan.py
diff --git a/caosdb-server/scripting/bin/loan_management/conf.py b/loan-custom/caosdb-server/scripting/bin/loan_management/conf.py
similarity index 100%
rename from caosdb-server/scripting/bin/loan_management/conf.py
rename to loan-custom/caosdb-server/scripting/bin/loan_management/conf.py
diff --git a/caosdb-server/scripting/bin/loan_management/confirm_loan.py b/loan-custom/caosdb-server/scripting/bin/loan_management/confirm_loan.py
similarity index 100%
rename from caosdb-server/scripting/bin/loan_management/confirm_loan.py
rename to loan-custom/caosdb-server/scripting/bin/loan_management/confirm_loan.py
diff --git a/caosdb-server/scripting/bin/loan_management/manual_return.py b/loan-custom/caosdb-server/scripting/bin/loan_management/manual_return.py
similarity index 100%
rename from caosdb-server/scripting/bin/loan_management/manual_return.py
rename to loan-custom/caosdb-server/scripting/bin/loan_management/manual_return.py
diff --git a/caosdb-server/scripting/bin/loan_management/reject_return_request.py b/loan-custom/caosdb-server/scripting/bin/loan_management/reject_return_request.py
similarity index 100%
rename from caosdb-server/scripting/bin/loan_management/reject_return_request.py
rename to loan-custom/caosdb-server/scripting/bin/loan_management/reject_return_request.py
diff --git a/caosdb-server/scripting/bin/loan_management/request_loan.py b/loan-custom/caosdb-server/scripting/bin/loan_management/request_loan.py
similarity index 100%
rename from caosdb-server/scripting/bin/loan_management/request_loan.py
rename to loan-custom/caosdb-server/scripting/bin/loan_management/request_loan.py
diff --git a/caosdb-server/scripting/bin/loan_management/request_return.py b/loan-custom/caosdb-server/scripting/bin/loan_management/request_return.py
similarity index 100%
rename from caosdb-server/scripting/bin/loan_management/request_return.py
rename to loan-custom/caosdb-server/scripting/bin/loan_management/request_return.py
diff --git a/caosdb-server/scripting/bin/test/loan_management/box_loan.py b/loan-custom/caosdb-server/scripting/bin/test/loan_management/box_loan.py
similarity index 100%
rename from caosdb-server/scripting/bin/test/loan_management/box_loan.py
rename to loan-custom/caosdb-server/scripting/bin/test/loan_management/box_loan.py
diff --git a/caosdb-server/scripting/bin/test/loan_management/conf.py b/loan-custom/caosdb-server/scripting/bin/test/loan_management/conf.py
similarity index 100%
rename from caosdb-server/scripting/bin/test/loan_management/conf.py
rename to loan-custom/caosdb-server/scripting/bin/test/loan_management/conf.py
diff --git a/caosdb-server/scripting/bin/test/loan_management/manual_return.py b/loan-custom/caosdb-server/scripting/bin/test/loan_management/manual_return.py
similarity index 100%
rename from caosdb-server/scripting/bin/test/loan_management/manual_return.py
rename to loan-custom/caosdb-server/scripting/bin/test/loan_management/manual_return.py
diff --git a/caosdb-server/scripting/bin/test/loan_management/request_loan.py b/loan-custom/caosdb-server/scripting/bin/test/loan_management/request_loan.py
similarity index 100%
rename from caosdb-server/scripting/bin/test/loan_management/request_loan.py
rename to loan-custom/caosdb-server/scripting/bin/test/loan_management/request_loan.py
diff --git a/caosdb-server/scripting/bin/test/loan_management/request_loan_form.json b/loan-custom/caosdb-server/scripting/bin/test/loan_management/request_loan_form.json
similarity index 100%
rename from caosdb-server/scripting/bin/test/loan_management/request_loan_form.json
rename to loan-custom/caosdb-server/scripting/bin/test/loan_management/request_loan_form.json
diff --git a/caosdb-server/scripting/bin/test/loan_management/request_return.py b/loan-custom/caosdb-server/scripting/bin/test/loan_management/request_return.py
similarity index 100%
rename from caosdb-server/scripting/bin/test/loan_management/request_return.py
rename to loan-custom/caosdb-server/scripting/bin/test/loan_management/request_return.py
diff --git a/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py b/loan-custom/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py
similarity index 100%
rename from caosdb-server/scripting/bin/test/loan_management/test_box_loan.py
rename to loan-custom/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py
diff --git a/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py b/loan-custom/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py
similarity index 100%
rename from caosdb-server/scripting/bin/test/loan_management/test_manual_return.py
rename to loan-custom/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py
diff --git a/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py b/loan-custom/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py
similarity index 100%
rename from caosdb-server/scripting/bin/test/loan_management/test_request_loan.py
rename to loan-custom/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py
diff --git a/caosdb-server/scripting/bin/test/loan_management/test_request_return.py b/loan-custom/caosdb-server/scripting/bin/test/loan_management/test_request_return.py
similarity index 100%
rename from caosdb-server/scripting/bin/test/loan_management/test_request_return.py
rename to loan-custom/caosdb-server/scripting/bin/test/loan_management/test_request_return.py
diff --git a/notes b/notes
index 548ba927d11995e0c4b5c6d298e2f02577e415b7..313cea340989b90d16db5cc85e5d0dcc604694f3 100644
--- a/notes
+++ b/notes
@@ -11,3 +11,5 @@ Soll die Email Adress wirklich on the fly mit geändert werden? Alternative
 
 
 Introduce a single loan.py file with argparse (`loan.py accept a b c`, etc) 
+
+Person without first or lastname seem to be a problem.