diff --git a/pom.xml b/pom.xml
index 6da03db8e519852461e906b56e32e0ded7e26d1d..30a017911eff03ceaecf9d435b2dad7da69d137a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,6 +22,7 @@
 		<openapi-generator.version>7.10.0</openapi-generator.version>
 		<swagger-parser.version>2.1.23</swagger-parser.version>
 		<wiremock-spring-boot.version>3.6.0</wiremock-spring-boot.version>
+		<jsoup.version>1.18.3</jsoup.version>
 	</properties>
 	<dependencies>
 		<!-- OZG-Cloud -->
@@ -59,6 +60,11 @@
 			<artifactId>swagger-parser</artifactId>
 			<version>${swagger-parser.version}</version>
 		</dependency>
+		<dependency>
+			<groupId>org.jsoup</groupId>
+			<artifactId>jsoup</artifactId>
+			<version>${jsoup.version}</version>
+		</dependency>
 
 		<!-- test -->
 		<dependency>
diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocument.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocument.java
new file mode 100644
index 0000000000000000000000000000000000000000..5273da376784ad394b91bd8b8527f125573edd83
--- /dev/null
+++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocument.java
@@ -0,0 +1,55 @@
+package de.ozgcloud.nachrichten.postfach.osiv2.transfer;
+
+import java.util.List;
+import java.util.function.Function;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Document;
+import org.jsoup.nodes.Element;
+
+public record Osi2HtmlDocument(String html) {
+
+	private record SpanRendering(String tag, Function<Element, String> markdownReplacement) {
+		static SpanRendering of(String tag, Function<Element, String> markdownReplacement) {
+			return new SpanRendering(tag, markdownReplacement);
+		}
+
+		void replaceElementsWithMarkdownSpansIn(Document document) {
+			document.body()
+					.select(tag)
+					.replaceAll(anchor -> new Element("span")
+							.text(markdownReplacement.apply(anchor))
+					);
+		}
+	}
+
+	static final List<SpanRendering> SPAN_RENDERINGS = List.of(
+			SpanRendering.of("a", anchor -> "[" + anchor.text() + "](" + anchor.attr("href") + ")"),
+			SpanRendering.of("img", image -> "![" + image.attr("alt") + "](" + image.attr("src") + ")"),
+			SpanRendering.of("i", italic -> "_" + italic.text() + "_"),
+			SpanRendering.of("em", italic -> "_" + italic.text() + "_"),
+			SpanRendering.of("b", bold -> "__" + bold.text() + "__"),
+			SpanRendering.of("strong", bold -> "__" + bold.text() + "__"),
+			SpanRendering.of("h1", heading -> "# " + heading.text()),
+			SpanRendering.of("h2", heading -> "## " + heading.text()),
+			SpanRendering.of("h3", heading -> "### " + heading.text()),
+			SpanRendering.of("blockquote", bold -> "> " + bold.text())
+	);
+
+	public String renderToPlainText() {
+		var document = Jsoup.parse(html);
+		applySpanRenderings(document);
+		return document.wholeText();
+	}
+
+	private void applySpanRenderings(Document document) {
+		for (var entry : SPAN_RENDERINGS) {
+			entry.replaceElementsWithMarkdownSpansIn(document);
+		}
+	}
+
+	public static String renderToPlainText(String html) {
+		return new Osi2HtmlDocument(html).renderToPlainText();
+	}
+
+}
diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java
index f5acb80a874aed8cf323aca797cbc5488f7846f5..aef50b4e3ceb8f8a8f989571411ec4a8200eba56 100644
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java
+++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapper.java
@@ -2,6 +2,7 @@ package de.ozgcloud.nachrichten.postfach.osiv2.transfer;
 
 import java.time.ZoneOffset;
 
+import org.jsoup.Jsoup;
 import org.mapstruct.Mapper;
 import org.mapstruct.Mapping;
 import org.mapstruct.ReportingPolicy;
@@ -15,7 +16,7 @@ import de.ozgcloud.nachrichten.postfach.osiv2.gen.model.V1ReplyMessage;
 import lombok.Builder;
 import lombok.Getter;
 
-@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, imports = ZoneOffset.class)
+@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR, imports = { ZoneOffset.class, Osi2HtmlDocument.class })
 public interface Osi2ResponseMapper {
 
 	String POSTFACH_ADDRESS_VERSION = "2.0";
@@ -32,7 +33,7 @@ public interface Osi2ResponseMapper {
 	@Mapping(target = "direction", constant = "IN")
 	@Mapping(target = "vorgangId", source = "sequencenumber")
 	@Mapping(target = "referencedNachricht", ignore = true)
-	@Mapping(target = "mailBody", source = "body")
+	@Mapping(target = "mailBody", expression = "java( message.getIsHtml() ? Osi2HtmlDocument.renderToPlainText(message.getBody()) : message.getBody() )")
 	@Mapping(target = "replyOption", source = "replyAction")
 	@Mapping(target = "attachments", ignore = true)
 	PostfachNachricht toPostfachNachricht(V1ReplyMessage message);
diff --git a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java
index d11c556369fb8c3a892d1be7c46476c0b7298ca6..b4012fd71ce827623b2204ac56a62ab82ca530bf 100644
--- a/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java
+++ b/src/main/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/PostfachApiFacadeService.java
@@ -49,6 +49,5 @@ public class PostfachApiFacadeService {
 
 	public void deleteMessage(final String messageId) {
 		messageExchangeApi.deleteMessage(UUID.fromString(messageId));
-
 	}
 }
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java
index 244a643d6f68160ea2243e9e868bf589f20291f3..e51f5ef25d7e5cae8a4d4ded107828e3e6b45052 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/factory/V1ReplyMessageTestFactory.java
@@ -11,8 +11,13 @@ public class V1ReplyMessageTestFactory {
 
 	private static final String SEQUENCE_NUMMER = "OZG-Cloud-VorgangId";
 	private static final String SUBJECT = "Das ist das Subject";
-	private static final String BODY = """
-			Das ist das Multiline
+	public static final String HTML_REPLY_BODY = """
+			Das ist das Multiline&amp;&lt;b&gt;a&lt;/b&gt<br><br/>
+			Body""";
+	public static final String REPLY_BODY = """
+			Das ist das Multiline&<b>a</b>
+			
+			
 			Body""";
 	private static final String DISPLAY_NAME = "Das ist der Absender";
 	private static final String ORIGIN_SENDER = "das ist der original Sender";
@@ -28,7 +33,7 @@ public class V1ReplyMessageTestFactory {
 		return new V1ReplyMessage()
 				.sequencenumber(SEQUENCE_NUMMER)
 				.subject(SUBJECT)
-				.body(BODY)
+				.body(REPLY_BODY)
 				.displayName(DISPLAY_NAME)
 				.originSender(ORIGIN_SENDER)
 				.replyAction(V1ReplyBehavior.fromValue(REPLAY_ACTION))
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocumentTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocumentTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4a928abf75810ef29d5213a6bce9a0efa43d10e
--- /dev/null
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2HtmlDocumentTest.java
@@ -0,0 +1,90 @@
+package de.ozgcloud.nachrichten.postfach.osiv2.transfer;
+
+import static org.assertj.core.api.AssertionsForInterfaceTypes.*;
+
+import org.junit.jupiter.api.DisplayName;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.ValueSource;
+
+class Osi2HtmlDocumentTest {
+
+	@DisplayName("should render anchor link")
+	@Test
+	void shouldRenderAnchorLink() {
+		var plainText = renderPlainText("<a href=\"https://www.example.com\">Example</a>");
+
+		assertThat("[Example](https://www.example.com)").isEqualTo(plainText);
+	}
+
+	@DisplayName("should render h1 heading")
+	@Test
+	void shouldRenderH1Heading() {
+		var plainText = renderPlainText("<h1>Example</h1>");
+
+		assertThat(plainText).isEqualTo("# Example");
+	}
+
+	@DisplayName("should render h2 heading")
+	@Test
+	void shouldRenderH2Heading() {
+		var plainText = renderPlainText("<h2>Example</h2>");
+
+		assertThat(plainText).isEqualTo("## Example");
+	}
+
+	@DisplayName("should render h3  heading")
+	@Test
+	void shouldRenderH3Heading() {
+		var plainText = renderPlainText("<h3>Example</h3>");
+
+		assertThat(plainText ).isEqualTo("### Example");
+	}
+
+
+	@DisplayName("should render italic")
+	@ParameterizedTest
+	@ValueSource(strings = { "<i>Example</i>", "<em>Example</em>" })
+	void shouldRenderItalic(String italicExample) {
+		var plainText = renderPlainText(italicExample);
+
+		assertThat(plainText).isEqualTo("_Example_");
+	}
+
+	@DisplayName("should render bold")
+	@ParameterizedTest
+	@ValueSource(strings = { "<b>Example</b>", "<strong>Example</strong>" })
+	void shouldRenderBold(String boldExample) {
+		var plainText = renderPlainText(boldExample);
+
+		assertThat(plainText).isEqualTo("__Example__");
+	}
+
+	@DisplayName("should render image")
+	@Test
+	void shouldRenderImage() {
+		var plainText = renderPlainText("<img src=\"https://www.example.com/image.jpg\" alt=\"Example\">");
+
+		assertThat(plainText).isEqualTo("![Example](https://www.example.com/image.jpg)");
+	}
+
+	@DisplayName("should render blockquote")
+	@Test
+	void shouldRenderBlockquote() {
+		var plainText = renderPlainText("<blockquote><p>Example</p>\n<p>Example2</p></blockquote>");
+
+		assertThat(plainText).isEqualTo("> Example Example2");
+	}
+
+	@DisplayName("should render html")
+	@Test
+	void shouldRenderHtml() {
+		var plainText = renderPlainText("<p>Example&#128566;</p><br/><p>Example2</p><b>");
+
+		assertThat(plainText).isEqualTo("Example\uD83D\uDE36\nExample2____");
+	}
+	
+	private String renderPlainText(String html) {
+		return new Osi2HtmlDocument(html).renderToPlainText();
+	}
+}
\ No newline at end of file
diff --git a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java
index 54586de660f6dacc6967dff94bdf70e6f3871d79..1c417e577b9134818309cc5a0ecdc9b976d8423a 100644
--- a/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java
+++ b/src/test/java/de/ozgcloud/nachrichten/postfach/osiv2/transfer/Osi2ResponseMapperTest.java
@@ -1,5 +1,6 @@
 package de.ozgcloud.nachrichten.postfach.osiv2.transfer;
 
+import static de.ozgcloud.nachrichten.postfach.osiv2.factory.V1ReplyMessageTestFactory.*;
 import static org.assertj.core.api.Assertions.*;
 
 import java.time.ZonedDateTime;
@@ -20,27 +21,27 @@ class Osi2ResponseMapperTest {
 
 	@InjectMocks
 	private Osi2ResponseMapper mapper = Mappers.getMapper(Osi2ResponseMapper.class);
-	private V1ReplyMessage message = V1ReplyMessageTestFactory.create();
+	private final V1ReplyMessage message = V1ReplyMessageTestFactory.create();
 
 	@DisplayName("map V1ReplyMessage to PostfachNachricht")
 	@Nested
 	class V1ReplyMessageToPostfachNachricht {
 		@Test
-		void shouldHaveId(){
+		void shouldHaveId() {
 			var postfachNachricht = mapper.toPostfachNachricht(message);
 
 			assertThat(postfachNachricht.getId()).isEqualTo(UUID.nameUUIDFromBytes("123-guid-456".getBytes()).toString());
 		}
 
 		@Test
-		void shouldHaveVorgangId(){
+		void shouldHaveVorgangId() {
 			var postfachNachricht = mapper.toPostfachNachricht(message);
 
 			assertThat(postfachNachricht.getVorgangId()).isEqualTo("OZG-Cloud-VorgangId");
 		}
 
 		@Test
-		void shouldHavePostfachAddress(){
+		void shouldHavePostfachAddress() {
 			var postfachNachricht = mapper.toPostfachNachricht(message);
 
 			assertThat(postfachNachricht.getPostfachAddress().getIdentifier().toString())
@@ -48,56 +49,63 @@ class Osi2ResponseMapperTest {
 		}
 
 		@Test
-		void shouldHaveCreatedAt(){
+		void shouldHaveCreatedAt() {
 			var postfachNachricht = mapper.toPostfachNachricht(message);
 
 			assertThat(postfachNachricht.getCreatedAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(5, ChronoUnit.SECONDS));
 		}
 
 		@Test
-		void shouldHaveCreatedBy(){
+		void shouldHaveCreatedBy() {
 			var postfachNachricht = mapper.toPostfachNachricht(message);
 
 			assertThat(postfachNachricht.getCreatedBy()).isEqualTo("Das ist der Absender");
 		}
 
 		@Test
-		void shouldHaveSentAt(){
+		void shouldHaveSentAt() {
 			var postfachNachricht = mapper.toPostfachNachricht(message);
 
 			assertThat(postfachNachricht.getSentAt()).isNotNull().isCloseTo(ZonedDateTime.now(), within(5, ChronoUnit.SECONDS));
 		}
 
 		@Test
-		void shouldHaveDirection(){
+		void shouldHaveDirection() {
 			var postfachNachricht = mapper.toPostfachNachricht(message);
 
 			assertThat(postfachNachricht.getDirection()).isEqualTo(PostfachNachricht.Direction.IN);
 		}
 
 		@Test
-		void shouldHaveSubject(){
+		void shouldHaveSubject() {
 			var postfachNachricht = mapper.toPostfachNachricht(message);
 
 			assertThat(postfachNachricht.getSubject()).isEqualTo("Das ist das Subject");
 		}
 
 		@Test
-		void shouldHaveBody(){
+		void shouldHaveBody() {
 			var postfachNachricht = mapper.toPostfachNachricht(message);
 
-			assertThat(postfachNachricht.getMailBody()).isEqualTo("""
-			Das ist das Multiline
-			Body""");
+			assertThat(postfachNachricht.getMailBody()).isEqualTo(REPLY_BODY);
 		}
 
 		@Test
-		void shouldHaveReplyOption(){
+		void shouldMapHTMLBody() {
+			var postfachNachricht = mapper.toPostfachNachricht(message
+					.body(HTML_REPLY_BODY)
+					.isHtml(true));
+
+			assertThat(postfachNachricht.getMailBody()).isEqualTo(REPLY_BODY);
+		}
+
+		@Test
+		void shouldHaveReplyOption() {
 			var postfachNachricht = mapper.toPostfachNachricht(message);
 
 			assertThat(postfachNachricht.getReplyOption()).isEqualTo(PostfachNachricht.ReplyOption.POSSIBLE);
 		}
 
-//		TODO:prüfen das Attachments in der PostfachNachricht enthalten sind
+		//		TODO:prüfen das Attachments in der PostfachNachricht enthalten sind
 	}
 }