diff --git a/toardb/stationmeta/crud.py b/toardb/stationmeta/crud.py
index 8691370834fa5aee80643758ddd987c6f388d4b6..481173e18c2a345ae4e953910b5400deb9c9ba7a 100644
--- a/toardb/stationmeta/crud.py
+++ b/toardb/stationmeta/crud.py
@@ -4,7 +4,7 @@ Create, Read, Update, Delete functionality
 
 """
 
-from sqlalchemy import cast, Text, insert, update, delete
+from sqlalchemy import cast, Text, insert, update, delete, select
 from typing import List
 from geoalchemy2.types import Geometry
 from geoalchemy2.elements import WKBElement, WKTElement
@@ -19,7 +19,7 @@ from .models import StationmetaCore, StationmetaChangelog, stationmeta_core_stat
 from toardb.generic.models import RS_enum, RC_enum
 from .schemas import get_coordinates_from_geom, get_geom_from_coordinates, StationmetaCreate, StationmetaPatch, Coordinates
 from pydantic import ValidationError
-from toardb.utils.utils import get_value_from_str
+from toardb.utils.utils import get_value_from_str, get_str_from_value
 
 
 def get_stationmeta_core(db: Session, station_code: str):
@@ -62,11 +62,20 @@ def get_all_stationmeta(db: Session, skip : int = 0, limit: int = None):
     return db_objects
 
 
+# is this internal, or should this also go to public REST api?
+# - get_stationmeta_roles
+# - get_stationmeta_changelog
+# - get_unique_stationmeta_role
+# - get_stationmeta_role_by_id
+# - get_unique_stationmeta_annotation
+def get_stationmeta_roles(db: Session, station_id: int):
+    return db.execute(select([stationmeta_core_stationmeta_roles_table]).where(stationmeta_core_stationmeta_roles_table.c.station_id == station_id))
+
+
 def get_stationmeta_changelog(db: Session, station_id: int):
     return db.query(models.StationmetaChangelog).filter(models.StationmetaChangelog.station_id == station_id).all()
 
 
-# is this internal, or should this also go to public REST api?
 def get_unique_stationmeta_role(db: Session, role: int, contact_id: int, status: int):
     db_object = db.query(models.StationmetaRole).filter(models.StationmetaRole.role == role) \
                                                 .filter(models.StationmetaRole.contact_id == contact_id) \
@@ -74,8 +83,10 @@ def get_unique_stationmeta_role(db: Session, role: int, contact_id: int, status:
                                                 .first()
     return db_object
 
+def get_stationmeta_role_by_id(db: Session, role_id):
+    return db.query(models.StationmetaRole).filter(models.StationmetaRole.id == role_id).first()
+
 
-# is this internal, or should this also go to public REST api?
 def get_unique_stationmeta_annotation(db: Session, text: str, contributor_id: int):
     db_object = db.query(models.StationmetaAnnotation).filter(models.StationmetaAnnotation.text == text) \
                                                       .filter(models.StationmetaAnnotation.contributor_id == contributor_id) \
@@ -205,11 +216,11 @@ def patch_stationmeta(db: Session, description: str, station_id: int, stationmet
     for k, v in stationmeta_dict.items():
         if v is not None:
             # prepare changelog entry/entries
-            db_changelog = StationmetaChangelog(description=description, station_id=station_id, author_id=1, type_of_change=1)
+            desc = description + f"; field: {k}"
+            db_changelog = StationmetaChangelog(description=desc, station_id=station_id, author_id=1, type_of_change=1)
             db_changelog.old_value=str(getattr(db_stationmeta,k))
             setattr(db_stationmeta,k,stationmeta_dict[k])
             db_changelog.new_value=str(getattr(db_stationmeta,k))
-            db_changelog.description=description + f"; field: {k}"
             db.add(db_changelog)
             result = db.commit()
     db.refresh(db_stationmeta)
@@ -217,8 +228,16 @@ def patch_stationmeta(db: Session, description: str, station_id: int, stationmet
     if roles_data:
         for r in roles_data:
             # prepare changelog entry/entries
-            db_changelog = StationmetaChangelog(description=description, station_id=station_id, author_id=1, type_of_change=1)
-            db_changelog.old_value=str(getattr(db_stationmeta,"roles"))
+            desc = description + f"; add role"
+            db_changelog = StationmetaChangelog(description=desc, station_id=station_id, author_id=1, type_of_change=1)
+            db_old_roles = get_stationmeta_roles(db, station_id)
+            oldvalue=''
+            for oldr in db_old_roles:
+                old_role = get_stationmeta_role_by_id(db, oldr.role_id)
+                oldvalue=oldvalue + "{'role': '" + get_str_from_value(RC_enum,old_role.role) + \
+                                    "', 'status': '" + get_str_from_value(RS_enum,old_role.status) + \
+                                    "', 'contact_id': " + str(old_role.contact_id) + '}'
+            db_changelog.old_value=oldvalue
             db_role = models.StationmetaRole(**r)
             db_role.role = get_value_from_str(RC_enum,db_role.role)
             db_role.status = get_value_from_str(RS_enum,db_role.status)
@@ -232,7 +251,7 @@ def patch_stationmeta(db: Session, description: str, station_id: int, stationmet
                 db.refresh(db_role)
                 role_id = db_role.id
             db.execute(insert(stationmeta_core_stationmeta_roles_table).values(station_id=station_id, role_id=role_id))
-            db_changelog.new_value=str(r)
+            db_changelog.new_value=oldvalue + str(r)
             db.add(db_changelog)
             db.commit()
     # store annotations and update association table