diff --git a/backend/main.py b/backend/main.py
index 6913f90d84b87fec326325674139ac227460ef54..7a73993c7f70fbe0986d2f01695046a43aa90bb6 100644
--- a/backend/main.py
+++ b/backend/main.py
@@ -116,7 +116,7 @@ def get_delivery_by_uuid(
     check_token(token, delivery_uuid)
     delivery = utils.get_delivery_by_uuid(db, UUID(delivery_uuid))
     if not delivery:
-        raise HTTPException(status_code=404, detail="Item not found")
+        raise HTTPException(status_code=404, detail="Delivery not found")
     return delivery
 
 
@@ -127,6 +127,8 @@ def get_delivery_by_tag(
     db: Session = Depends(get_db),
 ):
     delivery = utils.get_delivery_by_tag(db, delivery_tag)
+    if not delivery:
+        raise HTTPException(status_code=404, detail="Delivery not found")
     check_token(token, delivery.uuid)
     return delivery
 
@@ -139,7 +141,10 @@ def update_delivery(
     db: Session = Depends(get_db),
 ):
     check_token(token, delivery_uuid)
-    delivery = utils.update_delivery_data(db, UUID(delivery_uuid), data)
+    delivery = utils.get_delivery_by_uuid(db, UUID(delivery_uuid))
+    if not delivery:
+        raise HTTPException(status_code=404, detail="Delivery not found")
+    delivery = utils.update_delivery_data(db, delivery, data)
     return delivery
 
 
@@ -151,21 +156,23 @@ def add_item(
 ):
     check_token(token, None)
     delivery = utils.get_delivery_by_uuid(db, item.delivery_uuid)
-    storage = utils.get_storage_by_name(db, item.storage_name)
     if not delivery:
         raise HTTPException(status_code=404, detail="Delivery not found")
+    storage = utils.get_storage_by_name(db, item.storage_name)
     if not storage:
         raise HTTPException(status_code=404, detail="Storage not found")
-    return utils.add_item_for_delivery_at_storage(
-        db, item.delivery_uuid, item.storage_name
-    )
+    return utils.add_item_for_delivery_at_storage(db, delivery, storage)
 
 
 @app.get("/item/{item_uuid}", response_model=schemas.Item)
 def get_item(
     item_uuid: str, token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)
 ):
-    return utils.get_item_by_uuid(db, UUID(item_uuid))
+    check_token(token, item_uuid)
+    item = utils.get_item_by_uuid(db, UUID(item_uuid))
+    if not item:
+        raise HTTPException(status_code=404, detail="Item not found")
+    return item
 
 
 @app.delete("/item/{item_uuid}", response_model=schemas.Item)
@@ -173,7 +180,10 @@ def deploy_item(
     item_uuid: str, token: str = Depends(oauth2_scheme), db: Session = Depends(get_db)
 ):
     check_token(token, None)
-    return utils.deploy_item(db, UUID(item_uuid))
+    item = utils.get_item_by_uuid(db, UUID(item_uuid))
+    if not item:
+        raise HTTPException(status_code=404, detail="Item not found")
+    return utils.deploy_item(db, item)
 
 
 @app.get("/storage/{storage_name}", response_model=schemas.Storage)
@@ -183,6 +193,9 @@ def get_storage(
     db: Session = Depends(get_db),
 ):
     check_token(token, None)
+    storage = utils.get_storage_by_name(db, storage_name)
+    if not storage:
+        raise HTTPException(status_code=404, detail="Storage not found")
     return utils.get_storage_by_name(db, storage_name)
 
 
@@ -195,12 +208,16 @@ def get_storages(
     return utils.get_storages(db)
 
 
-@app.post("/item/register", response_model=schemas.Delivery)
+@app.post("/item/register", response_model=schemas.Item)
 def add_item_with_image(
     image: UploadFile,
+    storage_name: str,
     token: str = Depends(oauth2_scheme),
     db: Session = Depends(get_db),
 ):
     check_token(token, None)
     print(image.file)
-    return False  # utils.add_item_with_image(db, image)
+    storage = utils.get_storage_by_name(db, storage_name)
+    if not storage:
+        raise HTTPException(status_code=404, detail="Storage not found")
+    return utils.add_item_with_image_at_storage(db, image, storage)
diff --git a/backend/utils.py b/backend/utils.py
index 90bbd9a6669b38b96ae357642ee05c798e69cdc1..e6ec19925536690d6c7c98c9ebedb512ffe3fd03 100644
--- a/backend/utils.py
+++ b/backend/utils.py
@@ -1,9 +1,9 @@
 from datetime import datetime
 from html import escape
 from random import choices
-
-# from shutil import copyfileobj
+from shutil import copyfileobj
 from string import digits
+from tempfile import SpooledTemporaryFile
 
 from cryptography.exceptions import InvalidSignature
 from cryptography.hazmat.primitives.asymmetric.ed448 import Ed448PublicKey
@@ -13,8 +13,6 @@ from sqlalchemy.orm import Session
 from . import models, schemas
 from .config import settings
 
-# from tempfile import SpooledTemporaryFile
-
 
 # helpers
 def generate_tag():
@@ -91,79 +89,54 @@ def prepare_delivery(db: Session, verification: str):
 
 
 def update_delivery_data(
-    db: Session, delivery_uuid: UUID4, update_data: schemas.DeliveryUpdate
+    db: Session, delivery: models.Delivery, update_data: schemas.DeliveryUpdate
 ):
-    delivery = db.get(models.Delivery, delivery_uuid)
-    if delivery:
-        if update_data.addressee:
-            delivery.addressee = escape(update_data.addressee)
-        if update_data.team:
-            delivery.team = escape(update_data.team)
-        db.commit()
-        db.refresh(delivery)
-        delivery.amount = len(delivery.items)
-        delivery.items = [
-            item for item in delivery.items if item.deployed_at == None  # noqa: E711
-        ]
-        return delivery
+    if update_data.addressee:
+        delivery.addressee = escape(update_data.addressee)
+    if update_data.team:
+        delivery.team = escape(update_data.team)
+    db.commit()
+    db.refresh(delivery)
+    delivery.amount = len(delivery.items)
+    delivery.items = [
+        item for item in delivery.items if item.deployed_at == None  # noqa: E711
+    ]
+    return delivery
 
 
 def add_item_for_delivery_at_storage(
-    db: Session, delivery_uuid: UUID4, storage_name: str
+    db: Session, delivery: models.Delivery, storage: models.Storage
 ):
-    delivery = db.get(models.Delivery, delivery_uuid)
-    storage = db.get(models.Storage, storage_name)
-    item = models.Item(storage_name=storage_name, stored_at=storage, part_of=delivery)
+    item = models.Item(storage_name=storage.name, stored_at=storage, part_of=delivery)
     db.add(item)
     db.commit()
     db.refresh(item)
     return item
 
 
-def deploy_item(db: Session, item_uuid: UUID4):
-    item = db.get(models.Item, item_uuid)
+def deploy_item(db: Session, item: models.Item):
     item.deployed_at = datetime.now()
     db.commit()
     db.refresh(item)
     return item
 
 
-# def add_item_with_image(db: Session, image: SpooledTemporaryFile):
-#    db_item = models.Delivery()
-#    db.add(db_item)
-#    db.commit()
-#    db_image = models.Image(item_uuid=db_item.uuid)
-#    db.add(db_image)
-#    db.commit()
-#    db.refresh(db_image)
-#    print(db_item.uuid)
-#    print(db_image.uuid)
-#    with open(f"./images/{ db_image.uuid }", "wb") as destination:
-#        try:
-#            copyfileobj(image.file, destination)
-#        finally:
-#            image.file.close
-#    return db_item
-#
-#
-#
-# def update_item(db: Session, item: schemas.Delivery, data: schemas.ItemUpdate):
-#    if data.addressee:
-#        item.addressee = escape(data.addressee)
-#    if data.team:
-#        item.team = escape(data.team)
-#    if data.amount:
-#        item.amount = data.amount
-#    db.commit()
-#    db.refresh(item)
-#    return item
-#
-#
-# def receive_item_with_image(db: Session, item: schemas.ItemCreateByImageAtStorage):
-#    new_item = models.Delivery(storage_uuid=item.storage_uuid)
-#    db.add(new_item)
-#    db.commit()
-#    db.refresh(new_item)
-#    new_image = models.Image(item_uuid=new_item.uuid)
-#    db.add(new_image)
-#    db.commit()
+def add_item_with_image_at_storage(
+    db: Session, upload_image: SpooledTemporaryFile, storage: str
+):
+    delivery = prepare_delivery(db, None)
+    print(delivery.tag)
+    item = add_item_for_delivery_at_storage(db, delivery, storage)
+    print(item)
+    print(item.uuid)
+    image = models.Image(item_uuid=item.uuid)
+    print(image)
+    db.add(image)
+    db.commit()
+    db.refresh(image)
+    with open(f"./images/{ image.uuid }", "wb") as destination:
+        try:
+            copyfileobj(upload_image.file, destination)
+        except Exception:
+            pass
+    return item