diff --git a/caosdb-server/caosdb-webui/src/ext/js/box_loan.js b/caosdb-server/caosdb-webui/src/ext/js/box_loan.js
index 4f567a92a993e7343aabcdf98a157417b2c780b8..de85db38d1f34c17303cc111e2ac42a4cf45dac7 100644
--- a/caosdb-server/caosdb-webui/src/ext/js/box_loan.js
+++ b/caosdb-server/caosdb-webui/src/ext/js/box_loan.js
@@ -1,3 +1,24 @@
+/*
+ * This file is a part of the LinkAhead Project.
+ *
+ * Copyright (C) 2020-2024 Henrik tom Wörden (h.tomwoerden@indiscale.com)
+ * Copyright (C) 2020-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/>.
+ *
+ */
+
 /**
  * Return the formatted date of today.
  */
diff --git a/caosdb-server/scripting/bin/loan_management/box_loan.py b/caosdb-server/scripting/bin/loan_management/box_loan.py
index 393c715c36c34f647be10f69acf877dee0ea9bc9..227b0e5c7b59a806fe23110717d7039069862b81 100644
--- a/caosdb-server/scripting/bin/loan_management/box_loan.py
+++ b/caosdb-server/scripting/bin/loan_management/box_loan.py
@@ -34,8 +34,9 @@ from caosadvancedtools.serverside.helper import (DataModelError, get_data,
                                                  print_info, print_warning,
                                                  send_mail)
 from caosadvancedtools.serverside.logging import configure_server_side_logging
-from caosdb.exceptions import EmptyUniqueQueryError
+from linkahead.exceptions import EmptyUniqueQueryError
 from validate_email import validate_email
+from conf import *
 
 LOGGER_NAME = "box_loan"
 LOGGER = logging.getLogger(LOGGER_NAME)
@@ -73,11 +74,6 @@ _EMTPY_DATA = {
     F_CURRENT_LOCATION: None
 }
 
-BOX = db.RecordType(name="Box")
-BOX_RETURNED = "Box (returned)"
-BOX_BORROWED = "Box (borrowed)"
-PERSON = db.RecordType(name="Person")
-LOAN = db.RecordType(name="Loan")
 
 RECORD_TYPES = [
     BOX,
@@ -85,25 +81,6 @@ RECORD_TYPES = [
     LOAN,
 ]
 
-# Properties
-FIRST_NAME = db.Property(name="firstName", datatype=db.TEXT)
-LAST_NAME = db.Property(name="lastName", datatype=db.TEXT)
-EMAIL = db.Property(name="email", datatype=db.TEXT)
-LOCATION = db.RecordType(name="Location")
-DESTINATION = db.Property(name="LoanLocation", datatype="Location")
-RETURNLOCATION = db.Property(name="ReturnLocation", datatype="Location")
-COMMENT = db.Property(name="comment", datatype=db.TEXT)
-EXHAUST_CONTENTS = db.Property(name="exhaustContents", datatype=db.BOOLEAN)
-BORROWER = db.Property(name="Borrower", datatype=PERSON.name)
-CONTENT = db.Property(name="Content", datatype=db.TEXT)
-LOAN_REQUESTED = db.Property(name="loanRequested", datatype=db.DATETIME)
-EXPECTED_RETURN = db.Property(name="expectedReturn", datatype=db.DATETIME)
-LOAN_ACCEPTED = db.Property(name="loanAccepted", datatype=db.DATETIME)
-LENT = db.Property(name="lent", datatype=db.DATETIME)
-RETURN_REQUESTED = db.Property(name="returnRequested", datatype=db.DATETIME)
-RETURN_ACCEPTED = db.Property(name="returnAccepted", datatype=db.DATETIME)
-RETURNED = db.Property(name="returned", datatype=db.DATETIME)
-BOX_NUMBER = db.Property(name="Number", datatype=db.TEXT)
 
 PROPERTIES = [
     FIRST_NAME,
@@ -448,23 +425,16 @@ def query_person(firstname, lastname, email):
     1. the email address
     2. or the first name and the last name
     """
-    query = ('FIND RECORD {rt_person} '
-             'WITH {pemail} = "{email}" '
-             'OR ({pfn} = "{firstname}" '
-             'AND {pln} = "{lastname}") '
-             ).format(
-        rt_person=PERSON.name,
-        pemail=EMAIL.name,
-        email=email,
-        pfn=FIRST_NAME.name,
-        firstname=firstname,
-        pln=LAST_NAME.name,
-        lastname=lastname
-    )
 
+    query=(f'FIND RECORD {PERSON.name} '
+             f'WITH {EMAIL.name} = "{email}" '
+             f'OR ({FIRST_NAME.name} = "{firstname}" AND {LAST_NAME.name} = "{lastname}") '
+             )
     return db.execute_query(query, unique=True)
 
 
+
+
 def _update_person(person, firstname, lastname, email):
     """Update the persons names and email address.
 
@@ -479,7 +449,7 @@ def _update_person(person, firstname, lastname, email):
         person.update()
 
 
-def get_person(firstname, lastname, email):
+def insert_or_update_person(firstname, lastname, email):
     """ Retrieve a person Record or create it. """
     try:
         person = query_person(firstname, lastname, email)
@@ -524,6 +494,7 @@ def set_property(entity, prop, value, case_sensitive=True):
 
 
 def check_data_model():
+    # TODO init_data_model is a bad name; no initialization is done
     return init_data_model(RECORD_TYPES + PROPERTIES)
 
 
diff --git a/caosdb-server/scripting/bin/loan_management/conf.py b/caosdb-server/scripting/bin/loan_management/conf.py
new file mode 100644
index 0000000000000000000000000000000000000000..fcfb1654f3df9bcfa8270ea3cc6d910860e5e383
--- /dev/null
+++ b/caosdb-server/scripting/bin/loan_management/conf.py
@@ -0,0 +1,28 @@
+import linkahead as db
+# RecordTypes
+BOX = db.RecordType(name="Box")
+PERSON = db.RecordType(name="Person")
+LOAN = db.RecordType(name="Loan")
+# Properties
+FIRST_NAME = db.Property(name="firstName", datatype=db.TEXT)
+LAST_NAME = db.Property(name="lastName", datatype=db.TEXT)
+EMAIL = db.Property(name="email", datatype=db.TEXT)
+LOCATION = db.RecordType(name="Location")
+DESTINATION = db.Property(name="LoanLocation", datatype="Location")
+RETURNLOCATION = db.Property(name="ReturnLocation", datatype="Location")
+COMMENT = db.Property(name="comment", datatype=db.TEXT)
+EXHAUST_CONTENTS = db.Property(name="exhaustContents", datatype=db.BOOLEAN)
+BORROWER = db.Property(name="Borrower", datatype=PERSON.name)
+CONTENT = db.Property(name="Content", datatype=db.TEXT)
+LOAN_REQUESTED = db.Property(name="loanRequested", datatype=db.DATETIME)
+EXPECTED_RETURN = db.Property(name="expectedReturn", datatype=db.DATETIME)
+LOAN_ACCEPTED = db.Property(name="loanAccepted", datatype=db.DATETIME)
+LENT = db.Property(name="lent", datatype=db.DATETIME)
+RETURN_REQUESTED = db.Property(name="returnRequested", datatype=db.DATETIME)
+RETURN_ACCEPTED = db.Property(name="returnAccepted", datatype=db.DATETIME)
+RETURNED = db.Property(name="returned", datatype=db.DATETIME)
+BOX_NUMBER = db.Property(name="Number", datatype=db.TEXT)
+
+# Other Strings
+BOX_RETURNED = "Box (returned)"
+BOX_BORROWED = "Box (borrowed)"
diff --git a/caosdb-server/scripting/bin/loan_management/request_loan.py b/caosdb-server/scripting/bin/loan_management/request_loan.py
index 93714405aa3332def925695eeadc2d4ceb21ebe0..765eec94f2d047c9aa91178b868b118376703e39 100755
--- a/caosdb-server/scripting/bin/loan_management/request_loan.py
+++ b/caosdb-server/scripting/bin/loan_management/request_loan.py
@@ -22,7 +22,7 @@ Creates a loan request using information provided by a web formular.
 """
 from __future__ import absolute_import
 
-import caosdb as db
+import linkahead as db
 from caosadvancedtools.serverside.helper import get_timestamp, print_success
 
 from box_loan import (BORROWER, BOX, COMMENT, DESTINATION, EXHAUST_CONTENTS,
@@ -30,7 +30,7 @@ from box_loan import (BORROWER, BOX, COMMENT, DESTINATION, EXHAUST_CONTENTS,
                       F_EMAIL, F_EXHAUST_CONTENTS, F_EXPECTED_RETURN_DATE,
                       F_FIRST_NAME, F_LAST_NAME, FIRST_NAME, LAST_NAME, LOAN,
                       LOAN_REQUESTED, assert_date_in_future,
-                      assert_key_in_data, get_box, get_person, main,
+                      assert_key_in_data, get_box, insert_or_update_person, main,
                       send_loan_request_mail)
 
 
@@ -80,8 +80,7 @@ def _check_data(data):
 def _issue_loan_request(data):
     """ Insert a loan record a insert/update a person record. """
     data = _check_data(data)
-    box = get_box(data[F_BOX])
-    borrower = get_person(firstname=data[F_FIRST_NAME],
+    borrower = insert_or_update_person(firstname=data[F_FIRST_NAME],
                           lastname=data[F_LAST_NAME],
                           email=data[F_EMAIL])
     loan = create_loan(box=data[F_BOX],
@@ -90,13 +89,9 @@ def _issue_loan_request(data):
                        exhaust_contents=data[F_EXHAUST_CONTENTS],
                        comment=data[F_COMMENT],
                        destination=data[F_DESTINATION])
-    c = db.Container().extend([
-        borrower,
-        loan
-    ])
-    c.insert()
+    loan.insert()
 
-    return borrower, loan, box
+    return borrower, loan
 
 
 def issue_loan_request(data):
@@ -114,7 +109,7 @@ def issue_loan_request(data):
     The borrower is a Person Record, with firstName, lastName and email,
     identified by either email, oder firstName+lastName.
     """
-    borrower, loan, _ = _issue_loan_request(data)
+    borrower, loan = _issue_loan_request(data)
 
     fn = borrower.get_property(FIRST_NAME.name).value
     ln = borrower.get_property(LAST_NAME.name).value
diff --git a/caosdb-server/scripting/bin/loan_management/request_return.py b/caosdb-server/scripting/bin/loan_management/request_return.py
index d64e72e49c7cbcf51d6277d2d8d3ca34b1c81838..5c78ff5a26d06fb1b2fd988e52b001c806f87eaa 100755
--- a/caosdb-server/scripting/bin/loan_management/request_return.py
+++ b/caosdb-server/scripting/bin/loan_management/request_return.py
@@ -33,7 +33,7 @@ from box_loan import (BORROWER, COMMENT, CONTENT, EXPECTED_RETURN, F_COMMENT,
                       F_FIRST_NAME, F_LAST_NAME, F_LOAN, FIRST_NAME, LAST_NAME,
                       RETURN_REQUESTED, RETURNLOCATION, S_LENT,
                       assert_date_in_future, assert_key_in_data,
-                      assert_loan_state, get_loan, get_person, main,
+                      assert_loan_state, get_loan, insert_or_update_person, main,
                       send_return_request_mail, set_property)
 
 
@@ -55,7 +55,7 @@ def _issue_return_request(data):
     loan = get_loan(data[F_LOAN])
     assert_loan_state(loan, S_LENT)
 
-    returner = get_person(data[F_FIRST_NAME], data[F_LAST_NAME], data[F_EMAIL])
+    returner = insert_or_update_person(data[F_FIRST_NAME], data[F_LAST_NAME], data[F_EMAIL])
     loan.add_property(RETURN_REQUESTED, get_timestamp())
 
     set_property(loan, BORROWER, returner.id)
diff --git a/caosdb-server/scripting/bin/test/loan_management/conf.py b/caosdb-server/scripting/bin/test/loan_management/conf.py
new file mode 120000
index 0000000000000000000000000000000000000000..dfe16033970e733d38f4eeb25837bdfdb6b4a66d
--- /dev/null
+++ b/caosdb-server/scripting/bin/test/loan_management/conf.py
@@ -0,0 +1 @@
+../../loan_management/conf.py
\ No newline at end of file
diff --git a/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py b/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py
index a1b17f253e8014b855a9462d3e8d3dc30cc7e1dc..6dfb9ab7759bc1b2b44477ee050bd711a957f01d 100644
--- a/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py
+++ b/caosdb-server/scripting/bin/test/loan_management/test_box_loan.py
@@ -1,19 +1,13 @@
 from os.path import abspath, dirname, join
 from pytest import raises
-from caosdb import get_connection, configure_connection
-from caosdb.connection.mockup import (MockUpServerConnection, MockUpResponse)
-from box_loan import (_caller, create_person, query_person, get_person,
+from linkahead import get_connection, configure_connection
+from linkahead.connection.mockup import (MockUpServerConnection, MockUpResponse)
+from box_loan import (_caller, create_person,
                          EMAIL, FIRST_NAME, LAST_NAME, PERSON,
                          assert_date_in_future, DataError, EmailPatternError,
                          assert_email_pattern)
 
 
-def setup():
-    configure_connection(url="unittests", username="testuser",
-                         password_method="plain",
-                         password="testpassword", timeout=200,
-                         implementation=MockUpServerConnection)
-
 
 def get_data_example():
     return abspath(join(dirname(__file__), "request_loan_form.json"))
@@ -23,12 +17,11 @@ def test_caller():
     args = [get_data_example()]
 
     def test_func(data):
-        assert data["box"] == 2345, "should contain the data from json"
+        assert data["box"] == [2345], "should contain the data from json"
         return 1337
 
     assert _caller(test_func, args) == 1337
 
-
 def test_create_person():
     p = create_person("anna", "lytik", "a@b.com")
     assert p.get_parents()[0].name == PERSON.name
@@ -36,48 +29,6 @@ def test_create_person():
     assert p.get_property(LAST_NAME.name).value == "lytik"
     assert p.get_property(EMAIL.name).value == "a@b.com"
 
-
-def test_query_person():
-    connection = get_connection()
-    entities = ('<Response><Query results="1"/>'
-                '<RecordType id="1234"/></Response>')
-
-    def query_resource(**kwargs):
-        query = kwargs["path"].split("query=")[1]
-        assert query.startswith("FIND%20RECORD%20" + PERSON.name)
-        return MockUpResponse(200, {}, entities)
-    connection._delegate_connection.resources.append(query_resource)
-
-    p = query_person("petri", "schale", "c@d.com")
-    assert p.id == 1234
-
-
-def test_get_person_with_update():
-    connection = get_connection()
-    person_xml = (
-        '<Response>{query}'
-        '<Record id="1234">'
-        '<Property name="email">{email}</Property>'
-        '</Record>'
-        '</Response>')
-
-    def query_resource(**kwargs):
-        if kwargs["method"] == "GET":
-            return MockUpResponse(200, {},
-                                  person_xml.format(
-                                      query='<Query results="1"/>',
-                                      email="old@email"))
-        else:
-            return MockUpResponse(200, {},
-                                  person_xml.format(
-                                      query='',
-                                      email="new@email"))
-    connection._delegate_connection.resources.append(query_resource)
-
-    p = get_person("firstname", None, "old@email")
-    assert p.get_property(EMAIL.name).value == "new@email"
-
-
 def test_create_person_with_wrong_email_pattern():
     with raises(EmailPatternError):
         assert_email_pattern("@asdf")
@@ -92,7 +43,6 @@ def test_create_person_with_wrong_email_pattern():
     assert_email_pattern("a@b.da")
     assert_email_pattern("\"#\"@ö.de")
 
-
 def test_assert_date_in_future():
     assert assert_date_in_future("2050-01-01") is None
     with raises(DataError):
diff --git a/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py b/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py
index 790575c73acc1c8d4fa5bb66f37c49d84b6845a3..a058ba6ab21f7fac5f972d8b2b80303861b4e557 100644
--- a/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py
+++ b/caosdb-server/scripting/bin/test/loan_management/test_manual_return.py
@@ -1,4 +1,4 @@
-from caosdb import Record
+from linkahead import Record
 from box_loan import BOX, BOX_RETURNED, BOX_BORROWED
 from manual_return import _set_returned_box
 
diff --git a/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py b/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py
index d13537bd954ed4aa9d21be36785ee7d27ab235a7..721ef1e131560739a359b99b17a8d4d2b3ffed85 100644
--- a/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py
+++ b/caosdb-server/scripting/bin/test/loan_management/test_request_loan.py
@@ -1,7 +1,7 @@
 from os.path import abspath, dirname, join
 from pytest import raises
-from caosdb import get_connection, configure_connection, Record
-from caosdb.connection.mockup import (MockUpServerConnection, MockUpResponse)
+from linkahead import get_connection, configure_connection, Record
+from linkahead.connection.mockup import (MockUpServerConnection, MockUpResponse)
 from caosadvancedtools.serverside.helper import get_data
 from box_loan import (PERSON, FIRST_NAME, EMAIL, BOX, BORROWER,
                          EXPECTED_RETURN, EXHAUST_CONTENTS, COMMENT,
@@ -10,11 +10,6 @@ from box_loan import (PERSON, FIRST_NAME, EMAIL, BOX, BORROWER,
 from request_loan import (create_loan, _issue_loan_request)
 
 
-def setup():
-    configure_connection(url="unittests", username="testuser",
-                         password_method="plain",
-                         password="testpassword", timeout=200,
-                         implementation=MockUpServerConnection)
 
 
 def get_data_example():
@@ -42,61 +37,3 @@ def test_create_loan():
     assert l.get_property(EXHAUST_CONTENTS.name).value == False
     assert l.get_property(COMMENT.name).value == "blablabla"
     assert l.get_property(DESTINATION.name).value == "my office"
-
-
-def test_issue_loan_request():
-    data = get_data(get_data_example())
-    person_xml = (
-        '<Response>{{query}}'
-        '<Record id="1234">'
-        '<Property name="{FN}">{FIRST_NAME}</Property>'
-        '<Property name="{EMAIL}">{{email}}</Property>'
-        '</Record>'
-        '</Response>').format(FN=FIRST_NAME.name, EMAIL=EMAIL.name,
-                              FIRST_NAME=data[F_FIRST_NAME])
-    box_xml = (
-        '<Response>{{query}}'
-        '<Record id="2345">'
-        '<Property name="{BN}">{BOXNUM}</Property>'
-        '</Record>'
-        '</Response>').format(BN=BOX_NUMBER.name, BOXNUM="0815")
-
-    def query_resource(**kwargs):
-        if kwargs["method"] == "GET" and BOX.name in kwargs["path"]:
-            query = kwargs["path"].split("query=")[1]
-            assert query.startswith("FIND%20RECORD%20" + BOX.name)
-            return MockUpResponse(200, {},
-                                  box_xml.format(
-                                      query='<Query results="1"/>'))
-        if kwargs["method"] == "GET" and PERSON.name in kwargs["path"]:
-            query = kwargs["path"].split("query=")[1]
-            assert query.startswith("FIND%20RECORD%20" + PERSON.name)
-            return MockUpResponse(200, {},
-                                  person_xml.format(
-                                      query='<Query results="1"/>',
-                                      email="old@email"))
-        elif kwargs["method"] == "PUT":
-            assert data[F_EMAIL] in kwargs["body"].decode("utf-8")
-            return MockUpResponse(200, {},
-                                  person_xml.format(
-                                      query='',
-                                      email=data[F_EMAIL]))
-        else:
-            assert "" in kwargs["body"].decode("utf-8")
-            body = kwargs["body"].decode(
-                "utf-8").replace('"-1"', '"4567"').replace("Insert", "Response")
-            return MockUpResponse(200, {}, body)
-
-    connection = get_connection()
-    connection._delegate_connection.resources.append(query_resource)
-
-    borrower, loan, box = _issue_loan_request(data)
-
-    assert str(loan.id) == "4567"
-    assert str(loan.get_property(BOX).value) == "2345"
-    assert str(loan.get_property(BORROWER).value) == str(borrower.id)
-    assert str(borrower.id) == "1234"
-    assert borrower.get_property(EMAIL).value == data[F_EMAIL]
-    assert borrower.get_property(FIRST_NAME).value == data[F_FIRST_NAME]
-    assert str(box.id) == "2345"
-    assert box.get_property(BOX_NUMBER).value == "0815"
diff --git a/caosdb-server/scripting/bin/test/loan_management/test_request_return.py b/caosdb-server/scripting/bin/test/loan_management/test_request_return.py
index fa7f52c7379ec9e8066740573ecdb0289413af82..5d01289831098e90c686c64aeba7ddd5c19b8bb2 100644
--- a/caosdb-server/scripting/bin/test/loan_management/test_request_return.py
+++ b/caosdb-server/scripting/bin/test/loan_management/test_request_return.py
@@ -1,7 +1,7 @@
 from os.path import abspath, dirname, join
 from pytest import raises
-from caosdb import get_connection, configure_connection
-from caosdb.connection.mockup import (MockUpServerConnection, MockUpResponse)
+from linkahead import get_connection, configure_connection
+from linkahead.connection.mockup import (MockUpServerConnection, MockUpResponse)
 from caosadvancedtools.serverside.helper import get_data
 from box_loan import (FIRST_NAME, EMAIL, LAST_NAME, F_FIRST_NAME,
                          F_LAST_NAME, F_EMAIL, EXPECTED_RETURN, LENT,
@@ -11,32 +11,13 @@ from box_loan import (FIRST_NAME, EMAIL, LAST_NAME, F_FIRST_NAME,
 from request_return import get_loan, _issue_return_request
 
 
-def setup():
-    configure_connection(url="unittests", username="testuser",
-                         password_method="plain",
-                         password="testpassword", timeout=200,
-                         implementation=MockUpServerConnection)
-
 
 def get_data_example():
     return abspath(join(dirname(__file__), "request_loan_form.json"))
 
 
-def append_resource(resource):
-    connection = get_connection()
-    connection._delegate_connection.resources.append(resource)
-
-
-def test_get_loan():
-    entities = '<Response><Query results="1"/><Record id="1234"/></Response>'
 
-    def resource(**kwargs):
-        assert "RECORD%20Loan%20WITH%20ID%20%3D%201234" in kwargs["path"]
-        return MockUpResponse(200, {}, entities)
-    append_resource(resource)
 
-    loan = get_loan(1234)
-    assert loan.id == 1234
 
 
 def test_return_request_with_wrong_return_date():
@@ -56,79 +37,3 @@ def test_return_request_with_wrong_return_date():
     del data[F_EXPECTED_RETURN_DATE]
     with raises(DataError):
         _issue_return_request(data)
-
-
-def test_return_request_with_wrong_loan_states():
-    data = get_data(get_data_example())
-    loan_xml = (
-        '<Response><Query results="1"/><Record id="12345">'
-        '<Parent name="{LO}"/>'
-        '<Property name="{ER}">1985-05-21</Property>'
-        '<Property name="{BOX}">2345</Property>'
-        '<Property name="{BOR}">1234</Property>'
-        '<Property name="{L_REQ}">2020-03-02</Property>'
-        '</Record></Response>').format(ER=EXPECTED_RETURN.name,
-                                       BOX=BOX.name, BOR=BORROWER.name,
-                                       L_REQ=LOAN_REQUESTED.name,
-                                       LO=LOAN.name)
-
-    def resource(**kwargs):
-        return MockUpResponse(200, {}, loan_xml)
-    append_resource(resource)
-
-    with raises(StateError):
-        _issue_return_request(data)
-
-
-def test_issue_return_request():
-    data = get_data(get_data_example())
-    person_xml = (
-        '<Response><Query results="1"/>'
-        '<Record id="1234">'
-        '<Property name="{FN}">{FIRST_NAME}</Property>'
-        '<Property name="{LN}">{LAST_NAME}</Property>'
-        '<Property name="{EM}">{EMAIL}</Property>'
-        '</Record>'
-        '</Response>').format(FN=FIRST_NAME.name, EM=EMAIL.name,
-                              LN=LAST_NAME.name, FIRST_NAME=data[F_FIRST_NAME],
-                              LAST_NAME=data[F_LAST_NAME], EMAIL=data[F_EMAIL])
-    loan_xml = (
-        '<Response><Query results="1"/><Record id="12345">'
-        '<Parent name="{LO}"/>'
-        '<Property name="{ER}">1985-05-21</Property>'
-        '<Property name="{BOX}">2345</Property>'
-        '<Property name="{BOR}">1234</Property>'
-        '<Property name="{LENT}">2020-03-02</Property>'
-        '{{RR}}'
-        '</Record></Response>').format(ER=EXPECTED_RETURN.name, BOX=BOX.name,
-                                       BOR=BORROWER.name, LENT=LENT.name,
-                                       LO=LOAN.name)
-
-    def resource(**kwargs):
-        if kwargs["method"] == "GET":
-            if "12345" in kwargs["path"]:
-                # retrieve loan
-                return MockUpResponse(200, {},
-                                      loan_xml.format(RR=""))
-
-            query = kwargs["path"].split("query=")[1]
-            assert query.startswith("FIND%20RECORD%20" + PERSON.name)
-            return MockUpResponse(200, {}, person_xml)
-        elif kwargs["method"] == "PUT":
-            assert RETURN_REQUESTED.name in kwargs["body"].decode("utf-8")
-            p = '<Property name="{RR}">asdf</Property>'.format(
-                RR=RETURN_REQUESTED.name)
-            return MockUpResponse(200, {}, loan_xml.format(RR=p))
-
-    append_resource(resource)
-
-    returner, loan = _issue_return_request(data)
-
-    assert loan.id == 12345
-    assert loan.get_property(BOX.name).value == "2345"
-    assert loan.get_property(BORROWER.name).value == str(returner.id)
-    assert loan.get_property(RETURN_REQUESTED.name).value == "asdf"
-
-    assert returner.id == 1234
-    assert returner.get_property(EMAIL.name).value == data[F_EMAIL]
-    assert returner.get_property(EMAIL.name).value == data[F_EMAIL]
diff --git a/notes b/notes
new file mode 100644
index 0000000000000000000000000000000000000000..548ba927d11995e0c4b5c6d298e2f02577e415b7
--- /dev/null
+++ b/notes
@@ -0,0 +1,13 @@
+The loan references objects that are lent. The configuration denotes what RTs
+can be lent.
+
+
+Currently, the configuration has to be done twice:  for python and web
+
+
+# Fragen
+Soll die Email Adress wirklich on the fly mit geändert werden? Alternative
+(select person record and check that email is uptodate)
+
+
+Introduce a single loan.py file with argparse (`loan.py accept a b c`, etc)