diff --git a/EnvelopeGenerator.Application/Envelopes/Queries/ReadSingleEnvelopeQuery.cs b/EnvelopeGenerator.Application/Envelopes/Queries/ReadSingleEnvelopeQuery.cs
new file mode 100644
index 00000000..feae8002
--- /dev/null
+++ b/EnvelopeGenerator.Application/Envelopes/Queries/ReadSingleEnvelopeQuery.cs
@@ -0,0 +1,71 @@
+using MediatR;
+using EnvelopeGenerator.Application.Common.Query;
+using EnvelopeGenerator.Application.Common.Dto;
+using AutoMapper;
+using DigitalData.Core.Abstraction.Application.Repository;
+using EnvelopeGenerator.Domain.Entities;
+using Microsoft.EntityFrameworkCore;
+
+namespace EnvelopeGenerator.Application.Envelopes.Queries;
+
+///
+/// Repräsentiert eine Abfrage für einen einzelnen Umschlag.
+///
+public record ReadSingleEnvelopeQuery : EnvelopeQueryBase, IRequest
+{
+ ///
+ /// Optionaler Benutzerfilter; wenn gesetzt, werden nur Umschläge des Benutzers geladen.
+ ///
+ public int? UserId { get; init; }
+
+ ///
+ /// Setzt den Benutzerkontext für die Abfrage.
+ ///
+ public ReadSingleEnvelopeQuery Authorize(int userId) => this with { UserId = userId };
+}
+
+///
+/// Verarbeitet und liefert ein einzelnes -Ergebnis.
+///
+public class ReadSingleEnvelopeQueryHandler : IRequestHandler
+{
+ private readonly IRepository _repository;
+ private readonly IMapper _mapper;
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ public ReadSingleEnvelopeQueryHandler(IRepository repository, IMapper mapper)
+ {
+ _repository = repository;
+ _mapper = mapper;
+ }
+
+ ///
+ ///
+ ///
+ ///
+ ///
+ ///
+ public async Task Handle(ReadSingleEnvelopeQuery request, CancellationToken cancel)
+ {
+ var query = _repository.Query;
+
+ if (request.UserId is int userId)
+ query = query.Where(e => e.UserId == userId);
+
+ if (request.Id is int id)
+ query = query.Where(e => e.Id == id);
+
+ if (request.Uuid is string uuid)
+ query = query.Where(e => e.Uuid == uuid);
+
+ var envelope = await query
+ .Include(e => e.Documents)
+ .FirstOrDefaultAsync(cancel);
+
+ return envelope is null ? null : _mapper.Map(envelope);
+ }
+}