diff --git a/fgs/pandoc.py b/fgs/pandoc.py
index 8f17e7652e5e4e5dfe1e311f4d364fe252b249c2..2139783d33e899a1042c050db53ecc67e2e049cc 100644
--- a/fgs/pandoc.py
+++ b/fgs/pandoc.py
@@ -48,6 +48,7 @@ def run_pandoc(source, factories, lang, base="markdown", extensions=[], extra_ar
         if block != None:
             blocks.append(block)
 
+    elementlist = convert_elements_to_list(blocks)
 
     contentmetadata = {}
     contentmetadata["toc_list"] = []
@@ -56,10 +57,33 @@ def run_pandoc(source, factories, lang, base="markdown", extensions=[], extra_ar
     # TODO TOC
     #contentmetadata["toc"] = build_toc(n["toc_list"].copy())
 
+    # Get all images on page
+    images = []
+    for e in elementlist:
+        if e.etype == "image":
+            images.append(e)
+    contentmetadata["images"] = images
+    contentmetadata["has_image"] = (len(images) > 0)
+    if contentmetadata["has_image"]:
+        contentmetadata["image"] = images[0]
+
+
+
     #blocks = json.loads(json.dumps(blocks, cls=ElementEncoder)) # Reduce to 'simple' dict, which can be converted to JSON in Jinja2.
 
     return (blocks, contentmetadata)
 
+
+def convert_elements_to_list(elements):
+    res = []
+    for element in elements:
+        res.append(element)
+        res += convert_elements_to_list(element.children)
+    return res
+
+
+
+
 def parse_from_register(factories, lang, reg: dict, h: dict, custom_syntax_handler):
     t = h['t'] # pandoc type
     if t not in reg:
diff --git a/theme/static/css/main.css b/theme/static/css/main.css
index 8941075c0f39b248cca8c852f869f0debd8fc69f..83a41151bf1f4ea011c14ef548976b2b9a26a360 100644
--- a/theme/static/css/main.css
+++ b/theme/static/css/main.css
@@ -297,10 +297,12 @@ a {
 	text-decoration: none;
 }
 a:focus,
-a:hover {
+a:hover,
+a:focus *,
+a:hover * {
 	text-decoration: underline;
 }
-a.external::after {
+a.external span::after {
 	/* content: '↪'; */
 	/* content: '🡕'; */
 	content: '⤤';
@@ -309,10 +311,10 @@ a.external::after {
 	background-position: center center;
 	background-size: cover;*/
 }
-a.external[href^="mailto:"]::after {
+a.external[href^="mailto:"] span::after {
 	content: '';
 }
-a.external[href^="mailto:"]::before {
+a.external[href^="mailto:"] span::before {
 	content: '📧';
 }
 
@@ -521,7 +523,7 @@ ul.cards li a {
 	display: inline-block;
 	width:  calc(100% - 1.3rem );
 	height: calc(100% - 1.3rem );
-	padding: 0.5rem;
+	/* padding: 0.5rem; */
 	transition: all 0.2s;
 	/* padding: 1rem; */
 	/*width:  var(--card-size);
@@ -530,13 +532,51 @@ ul.cards li a {
 	background-color: var(--category-color);
 	/* text-align: center; */
 	border: 0.2rem solid var(--category-color);
+	line-height: 2rem;
+	/* font-size: large; */
 }
 ul.cards li a:focus,
 ul.cards li a:hover {
 	background-color: var(--category-contrast-color);
 	color: var(--category-color);
 }
+ul.cards li a span {
+	display: inline-block;
+	/*position: relative;
+	top: 0.5rem;
+	left: 0rem;*/
+	padding: 0rem 0.5rem;
+	/*padding-top: 0.5rem;
+	padding-left: 0.5rem;*/
+}
+
+ul.cards li a.has-image {
+	/* background-image: var(--card-image); */
+	background-origin: border-box;
+	background-position: center;
+	background-repeat: no-repeat;
+	background-size: cover;
+	background-blend-mode: normal;
+	/* background-blend-mode: luminosity; */
+	/* background-blend-mode: overlay; */
+	/* background-blend-mode: multiply; */
+}
+ul.cards li a.has-image:focus,
+ul.cards li a.has-image:hover {
+	color: var(--category-contrast-color);
+	background-color: var(--category-color);
+	background-blend-mode: overlay;
+}
 
+ul.cards li a.has-image:focus span,
+ul.cards li a.has-image:hover span {
+	/* border-radius: 0.3rem; */
+	/* font-weight: bold; */
+}
+
+ul.cards li a.has-image span {
+	background-color: var(--category-color);
+}
 
 
 
diff --git a/theme/templates/macros/cards.html b/theme/templates/macros/cards.html
index f6507967c16a0788c3a48cf51e7de2cc7bf076b5..d604956017cc8aaeda46fccc9a3ead2ae063e44b 100644
--- a/theme/templates/macros/cards.html
+++ b/theme/templates/macros/cards.html
@@ -1,6 +1,7 @@
 
-{%- macro open(id = None, classes = None) -%}
-	<ul {%- if id %} id="{{ id|e }}"{% endif %} class="cards {%- if classes %}{% for class in classes %} {{ class|e }}{% endfor %}{% endif %}">
+{%- macro open(id = None, classes = []) -%}
+	{%- set attr = {"id": id, "classes": ["cards"], "extra_classes": classes} -%}
+	<ul {{ common.render_attr(attr, None) }}>
 {%- endmacro -%}
 
 {%- macro close() -%}
@@ -8,7 +9,17 @@
 {%- endmacro -%}
 
 {%- macro card(title, link, catcolor, lang) -%}
-	<li style="--category-color: {{ catcolor }}">{{ common.render_link(link, title, lang) }}</li>
+	{%- set attr = namespace(classes=[], style={"--category-color": catcolor}) -%}
+	{%- set page = link.page -%}
+
+	{%- if page.metadata.has_image -%}
+		{%- set attr.classes = ["has-image"] -%}
+		{%- set imageurl = ["url('", [siteurl, page.metadata.image.link.url]|join("/"), "')"]|join() -%}
+		{#- set imageurl = ["url('", ["http://127.0.0.1:8000/output", page.metadata.image.link.url]|join("/"), "')"]|join() -#}
+		{#- AHHHHHHHHH... Firefox interpretiert relative background-image urls falsch, wenn diese nicht direkt im inline-style sind! -#}
+		{%- set attr.style = {"--category-color": catcolor, "--card-image": imageurl, "background-image": imageurl } -%}
+	{%- endif -%}
+	<li>{{ common.render_link(link, title, lang, attr=attr) }}</li>
 {%- endmacro -%}
 
 {%- macro card_from_link(link, lang) -%}