diff --git a/toardb/stationmeta/crud.py b/toardb/stationmeta/crud.py
index 066e82d879e5cebb21e3ac9ca6aa05c2969bdaf5..8584be453e99f1ef66e9740a4bff92dd95837480 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
+from sqlalchemy import cast, Text, insert, update
 from typing import List
 from geoalchemy2.types import Geometry
 from sqlalchemy.orm import Session
@@ -12,10 +12,10 @@ from sqlalchemy.dialects.postgresql import JSONB, ARRAY
 from fastapi import File, UploadFile
 from fastapi.responses import JSONResponse
 from . import models
-from .models import stationmeta_core_stationmeta_roles_table, stationmeta_core_stationmeta_annotations_table, \
+from .models import StationmetaCore, stationmeta_core_stationmeta_roles_table, stationmeta_core_stationmeta_annotations_table, \
                     CZ_enum, CV_enum, ST_enum, TA_enum
 from toardb.generic.models import RS_enum, RC_enum
-from .schemas import get_coordinates_from_geom, get_geom_from_coordinates, StationmetaCreate, Coordinates
+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
 
@@ -91,7 +91,6 @@ def create_stationmeta(db: Session, stationmeta: StationmetaCreate):
     # but return from this method gives: "additional_metadata": {}
     # ==> there is a mismatch between model(JSONB) and schema(JSON)
     db_stationmeta.additional_metadata = str(db_stationmeta.additional_metadata).replace("'",'"')
-    db_stationmeta.coordinate_validation_status = get_value_from_str(CV_enum,db_stationmeta.coordinate_validation_status)
     db_stationmeta.type_of_environment = get_value_from_str(ST_enum,db_stationmeta.type_of_environment)
     db_stationmeta.type_of_area = get_value_from_str(TA_enum,db_stationmeta.type_of_area)
     db.add(db_stationmeta)
@@ -174,3 +173,102 @@ def create_stationmeta(db: Session, stationmeta: StationmetaCreate):
     # there's a mismatch with coordinates --> how to automatically switch back and forth?!
     db_stationmeta.coordinates = tmp_coordinates
     return db_stationmeta
+
+def patch_stationmeta(db: Session, stationmeta_core_id: int, stationmeta: StationmetaPatch):
+    stationmeta_dict = stationmeta.dict()
+    roles_data         = stationmeta_dict.pop('roles', None)
+    annotations_data   = stationmeta_dict.pop('annotations', None)
+    aux_images_data    = stationmeta_dict.pop('aux_images', None)
+    aux_docs_data      = stationmeta_dict.pop('aux_docs', None)
+    aux_urls_data      = stationmeta_dict.pop('aux_urls', None)
+    globalmeta_data    = stationmeta_dict.pop('globalmeta', None)
+    globalservice_data = stationmeta_dict.pop('globalservice', None)
+    # there's a mismatch with coordinates --> how to automatically switch back and forth?!
+    # ==> the following two commands are not working
+    # ==> workaround
+    # stationmeta_dict2 = {k: v for k, v in stationmeta_dict.items() if v is not None}
+    # db.query(models.StationmetaCore).filter(models.StationmetaCore.id == stationmeta_core_id).update(stationmeta_dict2)
+    db_obj = models.StationmetaCore(**stationmeta_dict)
+    tmp_coordinates = db_obj.coordinates
+    db_stationmeta = db.query(models.StationmetaCore).get(stationmeta_core_id)
+    db_stationmeta.coordinates = get_geom_from_coordinates(db_stationmeta.coordinates)
+    for k, v in stationmeta_dict.items():
+        if v is not None:
+            setattr(db_stationmeta,k,stationmeta_dict[k])
+    result = db.commit()
+    db.refresh(db_stationmeta)
+    # store roles and update association table
+    if roles_data:
+        for r in roles_data:
+            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)
+            # check whether role is already present in database
+            db_object = get_unique_stationmeta_role(db, db_role.role, db_role.contact_id, db_role.status)
+            if db_object:
+                role_id = db_object.id
+            else:
+                db.add(db_role)
+                db.commit()
+                db.refresh(db_role)
+                role_id = db_role.id
+            db.execute(insert(stationmeta_core_stationmeta_roles_table).values(station_id=stationmeta_core_id, role_id=role_id))
+            db.commit()
+    # store annotations and update association table
+    if annotations_data:
+        for a in annotations_data:
+            db_annotation = models.StationmetaAnnotation(**a)
+            # check whether annotation is already present in database
+            db_object = get_unique_stationmeta_annotation(db, db_annotation.text, db_annotation.contributor_id)
+            if db_object:
+                annotation_id = db_object.id
+            else:
+                db.add(db_annotation)
+                db.commit()
+                db.refresh(db_annotation)
+                annotation_id = db_annotation.id
+            db.execute(insert(stationmeta_core_stationmeta_annotations_table).values(station_id=stationmeta_core_id, annotation_id=annotation_id))
+            db.commit()
+    # store aux_images
+    if aux_images_data:
+        for i in aux_images_data:
+            db_aux_image = models.StationmetaAuxImage(**i)
+            db_aux_image.station_id = stationmeta_core_id
+            db.add(db_aux_image)
+            db.commit()
+            db.refresh(db_aux_image)
+    # store aux_docs
+    if aux_docs_data:
+        for d in aux_docs_data:
+            db_aux_doc = models.StationmetaAuxDoc(**d)
+            db_aux_doc.station_id = stationmeta_core_id
+            db.add(db_aux_doc)
+            db.commit()
+            db.refresh(db_aux_doc)
+    # store aux_urls
+    if aux_urls_data:
+        for u in aux_urls_data:
+            db_aux_url = models.StationmetaAuxUrl(**u)
+            db_aux_url.station_id = stationmeta_core_id
+            db.add(db_aux_url)
+            db.commit()
+            db.refresh(db_aux_url)
+    # store globalmeta
+    if globalmeta_data:
+        db_global = models.StationmetaGlobal(**globalmeta_data)
+        if db_global.climatic_zone:
+            db_global.climatic_zone = get_value_from_str(CZ_enum,db_global.climatic_zone)
+        db_global.station_id = stationmeta_core_id
+        db.add(db_global)
+        db.commit()
+        db.refresh(db_global)
+    # store globalservice
+    if globalservice_data:
+        db_globalservice = models.StationmetaGlobalService(**globalservice)
+        db_globalservice.station_id = stationmeta_core_id
+        db.add(db_globalservice)
+        db.commit()
+        db.refresh(db_globalservice)
+    # there's a mismatch with coordinates --> how to automatically switch back and forth?!
+    db_stationmeta.coordinates = tmp_coordinates
+    return db_stationmeta
diff --git a/toardb/stationmeta/schemas.py b/toardb/stationmeta/schemas.py
index 7bc9314817b38392714a5606155192a10ea188fc..20d6a2aa1c2fc4f1e36c28c1c2ac9a07a0b6c7b5 100644
--- a/toardb/stationmeta/schemas.py
+++ b/toardb/stationmeta/schemas.py
@@ -18,9 +18,9 @@ from toardb.contacts.schemas import Contact
 # the following class was taken from:
 # https://github.com/tiangolo/fastapi/issues/312
 class Coordinates(BaseModel):
-    lat: float = Field(0, gte=-90, lte=90, description="longitude coordinate of station (decimal degrees_east). This is our best estimate of the station location which is not always identical to the official station coordinates (see coordinate_validation_status).")
-    lng: float = Field(0, gte=-180, lte=180, description="latitude coordinate of station (decimal degrees_north). This is our best estimate of the station location which is not always identical to the official station coordinates (see coordinate_validation_status).")
-    alt: float = Field(0, description="altitude of station (in m above sea level). This is our best estimate of the station altitude, which is not always identical to the reported station altitude, but frequently uses the elevation from google earth instead (see coordinate_validation_status).")
+    lat: float = Field(0, gte=-90, lte=90, description="longitude coordinate of station (decimal degrees_east). This is our best estimate of the station location which is not always identical to the official station coordinates (see potential changelog entry).")
+    lng: float = Field(0, gte=-180, lte=180, description="latitude coordinate of station (decimal degrees_north). This is our best estimate of the station location which is not always identical to the official station coordinates (see potential changelog entry).")
+    alt: float = Field(0, description="altitude of station (in m above sea level). This is our best estimate of the station altitude, which is not always identical to the reported station altitude, but frequently uses the elevation from google earth instead (see potential changelog entry).")
 
 # ======== StationmetaCore =========
 
@@ -31,9 +31,6 @@ class StationmetaCoreBase(BaseModel):
     coordinates: Coordinates
     country: str
     state: str
-    coordinate_validation_status: str
-    coordinate_validation_date: dt.datetime
-    coordinate_validator_id: int
     type_of_environment: str
     type_of_area: str
     timezone: str
@@ -42,10 +39,6 @@ class StationmetaCoreBase(BaseModel):
     class Config(BaseConfig):
         orm_mode = True
 
-    @validator('coordinate_validation_status')
-    def check_coordinate_validation_status(cls, v):
-        return tuple(filter(lambda x: x.value == int(v), CV_enum))[0].string
-
     @validator('type_of_environment')
     def check_type_of_environment(cls, v):
         return tuple(filter(lambda x: x.value == int(v), ST_enum))[0].string
@@ -55,16 +48,34 @@ class StationmetaCoreBase(BaseModel):
         return tuple(filter(lambda x: x.value == int(v), TA_enum))[0].string
 
 
+class StationmetaCorePatch(BaseModel):
+    codes: List[str] = None
+    name: str = None
+    coordinates: Coordinates = None
+    country: str = None
+    state: str = None
+    type_of_environment: str = None
+    type_of_area: str = None
+    timezone: str = None
+    additional_metadata: Json = None
+
+    class Config(BaseConfig):
+        orm_mode = True
+
+    @validator('type_of_environment')
+    def check_type_of_environment(cls, v):
+        if v:
+            return tuple(filter(lambda x: x.value == int(v), ST_enum))[0].string
+
+    @validator('type_of_area')
+    def check_type_of_area(cls, v):
+        if v:
+            return tuple(filter(lambda x: x.value == int(v), TA_enum))[0].string
+
+
 class StationmetaCoreCreate(StationmetaCoreBase):
     pass
 
-    @validator('coordinate_validation_status')
-    def check_coordinate_validation_status(cls, v):
-        if tuple(filter(lambda x: x.string == v, CV_enum)):
-            return v
-        else:
-            raise ValueError(f"coordinate validation status not known: {v}")
-
     @validator('type_of_environment')
     def check_type_of_environment(cls, v):
         if tuple(filter(lambda x: x.string == v, ST_enum)):
@@ -108,6 +119,14 @@ class StationmetaAnnotationBase(BaseModel):
     contributor_id: int
 
 
+class StationmetaAnnotationPatch(BaseModel):
+    kind: int = None
+    text: str = None
+    date_added: dt.datetime = None
+    approved: bool = None
+    contributor_id: int = None
+
+
 class StationmetaAnnotationCreate(StationmetaAnnotationBase):
     pass
 
@@ -130,6 +149,13 @@ class StationmetaAuxDocBase(BaseModel):
     station_id: int
 
 
+class StationmetaAuxDocPatch(BaseModel):
+    resource_description: str = None
+    date_added: dt.datetime = None
+    resource: str = None
+    station_id: int = None
+
+
 class StationmetaAuxDocCreate(StationmetaAuxDocBase):
     pass
 
@@ -152,6 +178,15 @@ class StationmetaAuxImageBase(BaseModel):
     station_id: int
 
 
+class StationmetaAuxImagePatch(BaseModel):
+    resource_description: str = None
+    date_added: dt.datetime = None
+    resource: str = None
+    image_height: int = None
+    image_width: int = None
+    station_id: int = None
+
+
 class StationmetaAuxImageCreate(StationmetaAuxImageBase):
     pass
 
@@ -171,6 +206,14 @@ class StationmetaAuxUrlBase(BaseModel):
     resource: str
     station_id: int
 
+
+class StationmetaAuxUrlPatch(BaseModel):
+    resource_description: str = None
+    date_added: dt.datetime = None
+    resource: str = None
+    station_id: int = None
+
+
 class StationmetaAuxUrlCreate(StationmetaAuxUrlBase):
     pass
 
@@ -219,6 +262,43 @@ class StationmetaGlobalBase(BaseModel):
     def check_dominant_landcover_year2012(cls, v):
         return tuple(filter(lambda x: x.value == int(v), DL_enum))[0].string
 
+
+class StationmetaGlobalPatch(BaseModel):
+    population_density_year2010: float = None
+    max_population_density_25km_year2010: float = None
+    climatic_zone: str = None
+    nightlight_1km_year2013: float = None
+    nightlight_5km_year2013: float = None
+    max_nightlight_25km_year2013: float = None
+    wheat_production_year2000: float = None
+    rice_production_year2000: float = None
+    edgar_htap_v2_nox_emissions_year2010: float = None
+    omi_no2_column_years2011to2015: float = None
+    htap_region_tier1: str = None
+    etopo_alt: float = None
+    etopo_min_alt_5km: float  = None
+    etopo_relative_alt: float = None
+    dominant_landcover_year2012: str = None
+    toar1_category: str = None
+    station_id: int = None
+
+    @validator('climatic_zone')
+    def check_climatic_zone(cls, v):
+        return tuple(filter(lambda x: x.value == int(v), CZ_enum))[0].string
+
+    @validator('toar1_category')
+    def check_toar1_category(cls, v):
+        return tuple(filter(lambda x: x.value == int(v), TC_enum))[0].string
+
+    @validator('htap_region_tier1')
+    def check_htap_region_tier1(cls, v):
+        return tuple(filter(lambda x: x.value == int(v), TR_enum))[0].string
+
+    @validator('dominant_landcover_year2012')
+    def check_dominant_landcover_year2012(cls, v):
+        return tuple(filter(lambda x: x.value == int(v), DL_enum))[0].string
+
+
 class StationmetaGlobalCreate(StationmetaGlobalBase):
     pass
 
@@ -330,6 +410,23 @@ class StationmetaRoleBase(BaseModel):
         orm_mode = True
 
 
+class StationmetaRolePatch(BaseModel):
+    role: str = None
+    status: str = None
+    contact: Contact = None
+
+    @validator('role')
+    def check_role(cls, v):
+        return tuple(filter(lambda x: x.value == int(v), RC_enum))[0].string
+
+    @validator('status')
+    def check_status(cls, v):
+        return tuple(filter(lambda x: x.value == int(v), RS_enum))[0].string
+
+    class Config:
+        orm_mode = True
+
+
 class StationmetaRoleCreate(StationmetaRoleBase):
     pass
 
@@ -369,6 +466,18 @@ class StationmetaBase(StationmetaCoreBase):
        orm_mode = True
 
 
+class StationmetaPatch(StationmetaCorePatch):
+    roles: List[StationmetaRolePatch] = None
+    annotations: List[StationmetaAnnotationPatch] = None
+    aux_images: List[StationmetaAuxImagePatch] = None
+    aux_docs: List[StationmetaAuxDocPatch] = None
+    aux_urls: List[StationmetaAuxUrlPatch] = None
+    globalmeta: StationmetaGlobalPatch = None
+
+    class Config:
+       orm_mode = True
+
+
 class StationmetaCreate(StationmetaCoreCreate):
     roles: List[StationmetaRoleCreate] = None
     annotations: List[StationmetaAnnotation] = None
diff --git a/toardb/stationmeta/stationmeta.py b/toardb/stationmeta/stationmeta.py
index 0c68dd9552ed206f394f4a94654e8d5527dc9a76..86c5eb95ada246cf30726c8d12d4bd8391c4fcb8 100644
--- a/toardb/stationmeta/stationmeta.py
+++ b/toardb/stationmeta/stationmeta.py
@@ -53,8 +53,21 @@ def get_stationmeta(station_code: str, db: Session = Depends(get_db)):
 # (Although this seems to be fixed in the meantime, it is not working in my FastAPI version.)
 #def create_stationmeta_core(stationmeta_core: schemas.StationmetaCoreCreate, db: Session = Depends(get_db)):
 def create_stationmeta_core(stationmeta: schemas.StationmetaCreate = Body(..., embed = True), db: Session = Depends(get_db)):
-    # for the  moment, just check the first code of station's codes
-    db_stationmeta_core= crud.get_stationmeta_core(db, station_code=stationmeta.codes[0])
-    if db_stationmeta_core:
-        raise HTTPException(status_code=400, detail="Station already registered.")
+    for station_code in stationmeta.codes:
+        db_stationmeta_core= crud.get_stationmeta_core(db, station_code=station_code)
+        if db_stationmeta_core:
+            raise HTTPException(status_code=400, detail="Station already registered.")
     return crud.create_stationmeta(db=db, stationmeta=stationmeta)
+
+@router.patch('/stationmeta/', response_model=schemas.StationmetaPatch)
+def patch_stationmeta_core(stationmeta: schemas.StationmetaPatch = Body(..., embed = True), db: Session = Depends(get_db)):
+    found = False
+    for station_code in stationmeta.codes:
+        if not found:
+            db_stationmeta_core= crud.get_stationmeta_core(db, station_code=station_code)
+            if db_stationmeta_core:
+                found = True
+    if found:
+        return crud.patch_stationmeta(db=db, stationmeta_core_id=db_stationmeta_core.id, stationmeta=stationmeta)
+    else:
+        raise HTTPException(status_code=400, detail="Station not found!")