diff --git a/_register_pp.html b/_register_pp.html
index ef92d63..9e221ca 100644
--- a/_register_pp.html
+++ b/_register_pp.html
@@ -36,7 +36,7 @@
 						{{vtIf: {vtGet:bezahlt} .eq. 1 .and. {GutscheinID} .gt. 0 }}
 							{{vtUse: {GutscheinID} }}
 								{{vtIf: {verwendbar} .eq. 1 }}
-									{{vtDo: -act="update", -obj="{GutscheinID}", verwendet="1" }}
+									{{vtDo: -act="update", -obj="{vtId}", verwendet="1" }}
 								{{vtEndIf}}
 							{{vtEndUse}}
 						{{vtEndIf}}
diff --git a/_sitemap.html b/_sitemap.html
new file mode 100644
index 0000000..2e6fdc5
--- /dev/null
+++ b/_sitemap.html
@@ -0,0 +1,62 @@
+<!--{{vtIf: {vtUser:admin} .neq. 1 }}-->{{vtEcho: '<'.'?xml version="1.0" encoding="UTF-8"?'.'>' }}
+<!--{{vtHeader: Content-type: application/xml}}-->
+<!--{{vtHeader: Content-Disposition: attachment; filename="sitemap.xml"}}-->
+<!--{{vtHeader: Pragma: no-cache}}-->
+<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
+	<url>
+		<loc>{{vtLink: -urltype="readable" }}</loc>
+		<lastmod>{{vtModificationDate:Y-m-d}}</lastmod>
+	</url>
+	<!--{{vtDbQuery: SELECT `id`, `modificationTime` FROM {vtDbTable:content}
+		WHERE ( `containerID` = {vtId} OR `path` LIKE '{vtPathIds},%' )
+		AND ( `aliasID` = '0' OR `aliasID` is NULL )
+		AND RIGHT( accessRights, 1 ) > 3 AND inTrash != 1
+		ORDER BY path, name
+	}}-->
+	<!--{{vtDbLoop}}-->
+	<url>
+		<loc>{{vtLink: -pg="{vtDbRow:id}", -urltype="readable" }}</loc>
+		<lastmod>{{vtDbRow:modificationTime|date:Y-m-d}}</lastmod>
+	</url>
+<!--{{vtEndDbLoop}}-->
+<!--{{vtEndDbQuery}}-->
+</urlset>
+<!--{{vtElse}}--><!doctype html>
+<html>
+<head>
+	<title>Sitemap exportieren</title>
+	<meta http-equiv="content-type" content="text/html;charset=utf-8">
+	<link rel="stylesheet" type="text/css" href="resources/internal.css?7">
+</head>
+<body>
+	<div class="content" style="width: 500px;">
+		<form action="{{vtSelf}}" target="_blank" method="GET">
+			<h1>Sitemap exportieren</h1>
+			<p>
+				Umfang:
+				<select name="-pg">
+					<!--{{vtUse:/}}-->
+						<!--{{vtSet: PageId = "{vtId}" }}-->
+						<option value="{{vtId}}">Startseite ({{vtName}}) und untergeordnete Seiten</option>
+					<!--{{vtEndUse}}-->
+					<!--{{vtIf: {vtId} .neq. {vtGet:PageId} }}-->
+						<option value="{{vtId}}">Nur aktuelle Seite und untergeordnete Seiten</option>
+					<!--{{vtEndIf}}-->
+				</select>
+			</p>
+			<p>Es werden in jedem Fall nur Seiten in die Sitemap aufgenommen, die für die Öffentlichkeit
+				freigegeben sind und bei denen die Option "Seite nicht in Menüs und Sitemap anzeigen"
+				deaktiviert ist.
+			</p>
+			<p>&nbsp;</p>
+			<p>
+				<input type="hidden" name="-met" value="{{vtGetValue:-met}}">
+				<input type="submit" name="" value="Sitemap exportieren">
+			</p>
+		</form>
+	</div>
+
+</body>
+</html>
+<!--{{vtEndIf}}-->
+
diff --git a/actions/create_order.html b/actions/create_order.html
index f67d6a5..11ea98e 100644
--- a/actions/create_order.html
+++ b/actions/create_order.html
@@ -92,6 +92,7 @@
 				Language="{vtGet:Language}",
 				Datum="{vtDate|d.m.Y}",
 				Uhrzeit="{vtDate|H:i}",
+				Kommentar="{vtGlobal:pxtcDefaultOrderComment}",
 				Anrede="{vtSession:Anrede}",
 				Vorname="{vtSession:Vorname}",
 				Name="{vtSession:Name}",
@@ -175,4 +176,4 @@ abgeschlossen wurde, erhalten Sie eine gesonderte Nachricht.
 
 	{{vtEndAsAdmin}}
 
-{{vtEndScript}}
\ No newline at end of file
+{{vtEndScript}}
diff --git a/actions/reset_order.html b/actions/reset_order.html
index 2611265..8bce08e 100644
--- a/actions/reset_order.html
+++ b/actions/reset_order.html
@@ -3,6 +3,7 @@
 	{{vtDo: -act="updateSession", 
 		Cart="", 
 		CheckoutOkay="", 
+		OrderProcessed="",
 		Datenlieferung="", 
 		AGB="", 
 		Datenschutz="", 
@@ -53,4 +54,4 @@
 
 	{{vtEndIf}}
 
-{{vtEndScript}}
\ No newline at end of file
+{{vtEndScript}}
diff --git a/ajax/import_image.html b/ajax/import_image.html
index 36bdefc..71cab15 100644
--- a/ajax/import_image.html
+++ b/ajax/import_image.html
@@ -25,6 +25,8 @@
 	{{vtElse}}
 		{{vtUse: {vtResult} }}
 			{{vtSet: Ergebnis='<a href="{vtLink}">{vtGet:Path}</a> importiert'}}
+		{{vtElse}}
+			{{vtSet: Ergebnis="FEHLER: {vtResult}" }}
 		{{vtEndUse}}
 	{{vtEndIf}}
 
diff --git a/ajax/order_dialog.html b/ajax/order_dialog.html
index c7a8498..7891576 100644
--- a/ajax/order_dialog.html
+++ b/ajax/order_dialog.html
@@ -45,6 +45,7 @@
 						<!--
 							{{vtIf: {vtItem:cartQuantity} .gt. 0 }}
 								{{vtSet: CellClass = "table-warning" }}
+								{{vtSet: ShowCartButton = "1" }}
 							{{vtElse}}
 								{{vtSet: CellClass = "" }}
 							{{vtEndIf}}
@@ -113,8 +114,11 @@
 					</button>
 				</form>
 			<!--{{vtElse}}-->
+				<a id="gotoCart" href="{{vtLink: {vtGet:ID_Warenkorb} }}" class="btn btn-primary mx-auto" style="{{vtIf: {vtGet:ShowCartButton} .neq. 1 }}display:none{{vtEndIf}}">
+					{{vtGet:s_btn_cart}}
+				</a>
 				<button type="button" class="btn btn-primary mx-auto" data-dismiss="modal">
-					{{vtGet:s_btn_finished}}
+					{{vtGet:s_btn_continue}}
 				</button>
 			<!--{{vtEndIf}}-->
 		</div>
diff --git a/assortment.vtedit.html b/assortment.vtedit.html
index fa5f902..c2d2762 100644
--- a/assortment.vtedit.html
+++ b/assortment.vtedit.html
@@ -139,7 +139,7 @@
 					<p><a href="{{vtLink: -pg='{vtGet:ID_Produkte}', -met='vtnew', -template='product' }}">Produkt erstellen</a></p>
 				<!--{{vtEndIf}}-->
 				<!--{{vtLoop:product}}-->
-					<tr id="row_{{vtItem:id}}" class="product_row" data-name="{{vtGet:Name}}" data-price="{{vtItem:price|num-en:2}}&nbsp;{{vtGlobal:pxtcCurrency}}" data-type="{{vtItem:type}}" data-quantity="{{vtItem:quantity}}">
+					<tr id="row_{{vtId}}" class="product_row" data-name="{{vtGet:Name}}">
 						<td valign="top" style="width:2em">
 							<input type="checkbox" id="fldProduct_{{vtId}}" data-prodid="{{vtId}}" data-text="{{Bezeichnung}} | {{Preis|num-en:2}} {{vtGlobal:pxtcCurrency}}" value="1">
 						</td>
@@ -229,6 +229,15 @@
 		});
 		
 		$('#btnAddProduct').click( function(){
+			let assigned = [];
+			$('#prodlist .product').each( function(){
+				assigned.push( $(this).data('prodid') );
+			});
+			$('#product_chooser .product_row').show();
+			$('#product_chooser input').prop( 'checked', false );
+			assigned.forEach( (productId) => {
+				$('#product_chooser').find( '#row_'+ productId ).hide();
+			});
 			$('#product_chooser').dialog('open');
 		});
 		
diff --git a/checkout.finish.html b/checkout.finish.html
index f559e5c..a717015 100644
--- a/checkout.finish.html
+++ b/checkout.finish.html
@@ -51,18 +51,23 @@
 			{{vtElse}}
 				{{vtSet: bezahlt="{bezahlt}"}}
 			{{vtEndIf}}
-			{{vtIf: {abgeschlossen} .neq. 1 }}
+			{{vtIf: {abgeschlossen} .neq. 1 .and. {vtGet:CartCount} .gt. 0 }}
+				{{vtIf: {vtGlobal:pxtcLanguageInformal} .eq. 1 }}
+					{{vtSet: Suffix = "_inf" }}
+				{{vtEndIf}}
 				{{vtIf: {vtGet:Language} .eq. en}}
-					{{vtSet: Mailtext="{vtInclude: /config/mails/order_en.txt, mails/order_en.txt}"}}
+					{{vtSet: Mailtext="{vtInclude: /config/mails/order_en{vtGet:Suffix}.txt, mails/order_en{vtGet:Suffix}.txt, /config/mails/order_en.txt, mails/order_en.txt }" }}
 				{{vtElse}}
-					{{vtSet: Mailtext="{vtInclude: /config/mails/order.txt, mails/order.txt}"}}
+					{{vtSet: Mailtext="{vtInclude: /config/mails/order{vtGet:Suffix}.txt, mails/order{vtGet:Suffix}.txt, /config/mails/order.txt, mails/order.txt}"}}
 				{{vtEndIf}}
 			{{vtEndIf}}
 		{{vtEndUse}}
 		
+		{{vtIf: {vtGet:Mailtext} .neq. }}
+			{{vtCalc: sprintf( '{vtGet:s_txt_0006}', '{vtSession:OrderNumber}', '{vtGlobal:siteName,escaped}' )}}
+			{{vtDo: -act="mail", -to="{vtSession:Email}", -bcc="{vtGlobal:mailRecipient}", -subject="{vtResult}", -message="{vtGet:Mailtext,raw}"}}
+		{{vtEndIf}}
 		{{vtDo: -act="update", -obj="{vtSession:OrderPageID}", abgeschlossen="1"}}
-		{{vtCalc: sprintf( '{vtGet:s_txt_0006}', '{vtSession:OrderNumber}', '{vtGlobal:siteName,escaped}' )}}
-		{{vtDo: -act="mail", -to="{vtSession:Email}", -bcc="{vtGlobal:mailRecipient}", -subject="{vtResult}", -message="{vtGet:Mailtext,raw}"}}
 		{{vtSet: Okay="1"}}
 		
 		{{vtUse:{vtSession:OrderPageID} }}
diff --git a/checkout.finish_pp.html b/checkout.finish_pp.html
index e9dd96a..e94e7c3 100644
--- a/checkout.finish_pp.html
+++ b/checkout.finish_pp.html
@@ -47,10 +47,13 @@
 
 		{{vtUse:{vtSession:OrderPageID} }}
 			{{vtIf: {abgeschlossen} .neq. 1 }}
+				{{vtIf: {vtGlobal:pxtcLanguageInformal} .eq. 1 }}
+					{{vtSet: Suffix = "_inf" }}
+				{{vtEndIf}}
 				{{vtIf: {vtGet:Language} .eq. en}}
-					{{vtSet: Mailtext="{vtInclude: /config/mails/order_en.txt, mails/order_en.txt}"}}
++					{{vtSet: Mailtext="{vtInclude: /config/mails/order_en{vtGet:Suffix}.txt, mails/order_en{vtGet:Suffix}.txt, /config/mails/order_en.txt, mails/order_en.txt }" }}
 				{{vtElse}}
-					{{vtSet: Mailtext="{vtInclude: /config/mails/order.txt, mails/order.txt}"}}
+					{{vtSet: Mailtext="{vtInclude: /config/mails/order{vtGet:Suffix}.txt, mails/order{vtGet:Suffix}.txt, /config/mails/order.txt, mails/order.txt}"}}
 				{{vtEndIf}}
 			{{vtEndIf}}
 		{{vtEndUse}}
diff --git a/checkout.html b/checkout.html
index ec48f42..e22967b 100644
--- a/checkout.html
+++ b/checkout.html
@@ -243,29 +243,29 @@
 					</div>
 					<div class="form-group col-sm-4">
 						<label for="fldVorname">{{vtGet:s_fld_firstname}}:*</label>
-						<input class="form-control" id="fldVorname" type="text" name="Vorname" value="{{vtSession:Vorname}}" placeholder="{{vtGet:s_fld_firstname}}" required>
+						<input class="form-control" id="fldVorname" type="text" name="Vorname" value="{{vtSession:Vorname}}" placeholder="{{vtGet:s_fld_firstname}}" required autocomplete="given-name">
 					</div>
 					<div class="form-group col-sm-6">
 						<label for="fldName">{{vtGet:s_fld_lastname}}:*</label>
-						<input class="form-control" id="fldName" type="text" name="Name" value="{{vtSession:Name}}" placeholder="{{vtGet:s_fld_lastname}}" required>
+						<input class="form-control" id="fldName" type="text" name="Name" value="{{vtSession:Name}}" placeholder="{{vtGet:s_fld_lastname}}" required autocomplete="family-name">
 					</div>
 				</div>
 				<div class="form-group">
 					<label for="fldFirma">{{vtGet:s_fld_organization}}:</label>
-					<input class="form-control" id="fldFirma" type="text" name="Firma" value="{{vtSession:Firma}}" placeholder="{{vtGet:s_fld_organization}}">
+					<input class="form-control" id="fldFirma" type="text" name="Firma" value="{{vtSession:Firma}}" placeholder="{{vtGet:s_fld_organization}}" autocomplete="organization">
 				</div>
 				<div class="form-group">
 					<label for="fldStrasse">{{vtGet:s_fld_address}}:*</label>
-					<input class="form-control" id="fldStrasse" type="text" name="Strasse" value="{{vtSession:Strasse}}" placeholder="{{vtGet:s_fld_address}}" required>
+					<input class="form-control" id="fldStrasse" type="text" name="Strasse" value="{{vtSession:Strasse}}" placeholder="{{vtGet:s_fld_address}}" required autocomplete="street-address">
 				</div>
 				<div class="form-row">
 					<div class="form-group col-sm-2">
 						<label for="fldPLZ">{{vtGet:s_fld_zip}}:*</label>
-						<input class="form-control" id="fldPLZ" type="text" name="PLZ" value="{{vtSession:PLZ}}" placeholder="{{vtGet:s_fld_zip}}" required>
+						<input class="form-control" id="fldPLZ" type="text" name="PLZ" value="{{vtSession:PLZ}}" placeholder="{{vtGet:s_fld_zip}}" required autocomplete="postal-code">
 					</div>
 					<div class="form-group col-sm-5">
 						<label for="fldOrt">{{vtGet:s_fld_city}}:*</label>
-						<input class="form-control" id="fldOrt" type="text" name="Ort" value="{{vtSession:Ort}}" placeholder="{{vtGet:s_fld_city}}" required>
+						<input class="form-control" id="fldOrt" type="text" name="Ort" value="{{vtSession:Ort}}" placeholder="{{vtGet:s_fld_city}}" required autocomplete="address-level2">
 					</div>
 					<div class="form-group col-sm-5">
 						<input type="hidden" name="Landesname" value="{{vtSession:Landesname}}">
@@ -279,23 +279,23 @@
 						<label for="state_text">{{vtGet:s_fld_state}}:</label>
 						<select class="form-control" id="state_menu" name="Bundesland" style="display:none">
 						</select>
-						<input class="form-control" id="state_text" type="text" name="Bundesland" value="{{vtSession:Bundesland}}" placeholder="{{vtGet:s_fld_state}}">
+						<input class="form-control" id="state_text" type="text" name="Bundesland" value="{{vtSession:Bundesland}}" placeholder="{{vtGet:s_fld_state}}" autocomplete="address-level1">
 					</div>
 					<!--{{vtIf: {vtGlobal:pxtcVatHandling} .neq. .and. {vtGlobal:pxtcVatCountry} .neq. .and. {vtGlobal:pxtcVatCountry} .in. {vtGet:EU_Countries} }}-->
 						<div class="form-group col-sm-5">
 							<label for="fldUStId">{{vtGet:s_fld_vat_id}}:</label>
-							<input class="form-control" id="fldUStId" type="text" name="USt_ID" value="{{vtSession:USt_ID}}" placeholder="{{vtGet:s_fld_vat_id}}">
+							<input class="form-control" id="fldUStId" type="text" name="USt_ID" value="{{vtSession:USt_ID}}" placeholder="{{vtGet:s_fld_vat_id}}" autocomplete="on">
 						</div>
 					<!--{{vtEndIf}}-->
 				</div>
 				<div class="form-row">
 					<div class="form-group col-sm-6">
 						<label for="fldEmail">{{vtGet:s_fld_email}}:*</label>
-						<input class="form-control" id="fldEmail" type="text" name="Email" value="{{vtSession:Email}}" placeholder="{{vtGet:s_fld_email}}" required>
+						<input class="form-control" id="fldEmail" type="text" name="Email" value="{{vtSession:Email}}" placeholder="{{vtGet:s_fld_email}}" required autocomplete="email">
 					</div>
 					<div class="form-group col-sm-6">
 						<label for="fldStrasse">{{vtGet:s_fld_phone}}:</label>
-						<input class="form-control" id="fldTelefon" type="text" name="Telefon" value="{{vtSession:Telefon}}" placeholder="{{vtGet:s_fld_phone}}">
+						<input class="form-control" id="fldTelefon" type="text" name="Telefon" value="{{vtSession:Telefon}}" placeholder="{{vtGet:s_fld_phone}}" autocomplete="tel-national">
 					</div>
 				</div>
 
@@ -343,29 +343,29 @@
 					<div class="form-row">
 						<div class="form-group col-sm-6">
 							<label for="fldVorname2">{{vtGet:s_fld_firstname}}:*</label>
-							<input class="form-control" id="fldVorname2" type="text" name="Vorname2" value="{{vtSession:Vorname2}}" placeholder="{{vtGet:s_fld_firstname}}">
+							<input class="form-control" id="fldVorname2" type="text" name="Vorname2" value="{{vtSession:Vorname2}}" placeholder="{{vtGet:s_fld_firstname}}" autocomplete="shipping given-name">
 						</div>
 						<div class="form-group col-sm-6">
 							<label for="fldName2">{{vtGet:s_fld_lastname}}:*</label>
-							<input class="form-control" id="fldName2" type="text" name="Name2" value="{{vtSession:Name2}}" placeholder="{{vtGet:s_fld_lastname}}">
+							<input class="form-control" id="fldName2" type="text" name="Name2" value="{{vtSession:Name2}}" placeholder="{{vtGet:s_fld_lastname}}" autocomplete="shipping family-name">
 						</div>
 					</div>
 					<div class="form-group">
 						<label for="fldFirma2">{{vtGet:s_fld_organization}}:</label>
-						<input class="form-control" id="fldFirma2" type="text" name="Firma2" value="{{vtSession:Firma2}}" placeholder="{{vtGet:s_fld_organization}}">
+						<input class="form-control" id="fldFirma2" type="text" name="Firma2" value="{{vtSession:Firma2}}" placeholder="{{vtGet:s_fld_organization}}" autocomplete="organization">
 					</div>
 					<div class="form-group">
 						<label for="fldStrasse2">{{vtGet:s_fld_address}}:*</label>
-						<input class="form-control" id="fldStrasse2" type="text" name="Strasse2" value="{{vtSession:Strasse2}}" placeholder="{{vtGet:s_fld_address}}">
+						<input class="form-control" id="fldStrasse2" type="text" name="Strasse2" value="{{vtSession:Strasse2}}" placeholder="{{vtGet:s_fld_address}}" autocomplete="shipping street-address">
 					</div>
 					<div class="form-row">
 						<div class="form-group col-sm-2">
 							<label for="fldPLZ2">{{vtGet:s_fld_zip}}:*</label>
-							<input class="form-control" id="fldPLZ2" type="text" name="PLZ2" value="{{vtSession:PLZ2}}" placeholder="{{vtGet:s_fld_zip}}">
+							<input class="form-control" id="fldPLZ2" type="text" name="PLZ2" value="{{vtSession:PLZ2}}" placeholder="{{vtGet:s_fld_zip}}" autocomplete="shipping postal-code">
 						</div>
 						<div class="form-group col-sm-5">
 							<label for="fldOrt2">{{vtGet:s_fld_city}}:*</label>
-							<input class="form-control" id="fldOrt2" type="text" name="Ort2" value="{{vtSession:Ort2}}" placeholder="{{vtGet:s_fld_city}}">
+							<input class="form-control" id="fldOrt2" type="text" name="Ort2" value="{{vtSession:Ort2}}" placeholder="{{vtGet:s_fld_city}}" autocomplete="shipping address-level2">
 						</div>
 						<div class="form-group col-sm-5">
 							<input type="hidden" name="Landesname2" value="{{vtSession:Landesname2}}">
@@ -378,7 +378,7 @@
 						<label for="state_text">{{vtGet:s_fld_state}}:</label>
 						<select class="form-control" id="state_menu2" name="Bundesland2" style="display:none">
 						</select>
-						<input class="form-control" id="state_text2" type="text" name="Bundesland2" value="{{vtSession:Bundesland2}}" placeholder="{{vtGet:s_fld_state}}">
+						<input class="form-control" id="state_text2" type="text" name="Bundesland2" value="{{vtSession:Bundesland2}}" placeholder="{{vtGet:s_fld_state}}" autocomplete="shipping address-level1">
 					</div>
 				</div>
 			</div>
@@ -461,21 +461,21 @@
 						<div class="form-row">
 							<div class="form-group col-sm-6">
 								<label for="fldSepaIban">{{vtGet:s_fld_sepa_iban}}:*</label>
-								<input class="form-control" type="text" name="SEPA_IBAN" id="fldSepaIban" value="{{vtSession:SEPA_IBAN}}">
+								<input class="form-control" type="text" name="SEPA_IBAN" id="fldSepaIban" value="{{vtSession:SEPA_IBAN}}" autocomplete="on">
 							</div>
 							<div class="form-group col-sm-6">
 								<label for="fldSepaBic">{{vtGet:s_fld_sepa_bic}}:*</label>
-								<input class="form-control" type="text" name="SEPA_BIC" id="fldSepaBic" value="{{vtSession:SEPA_BIC}}">
+								<input class="form-control" type="text" name="SEPA_BIC" id="fldSepaBic" value="{{vtSession:SEPA_BIC}}" autocomplete="on">
 							</div>
 						</div>
 						<div class="form-row">
 							<div class="form-group col-sm-6">
 								<label for="fldSepaHolder">{{vtGet:s_fld_sepa_holder}}:*</label>
-								<input class="form-control" type="text" name="SEPA_Inhaber" id="fldSepaHolder" value="{{vtSession:SEPA_Inhaber}}">
+								<input class="form-control" type="text" name="SEPA_Inhaber" id="fldSepaHolder" value="{{vtSession:SEPA_Inhaber}}" autocomplete="on">
 							</div>
 							<div class="form-group col-sm-6">
 								<label for="fldSepaEmail">{{vtGet:s_fld_sepa_email}}:*</label>
-								<input class="form-control" type="text" name="SEPA_Email" id="fldSepaEmail" value="{{vtSession:SEPA_Email}}">
+								<input class="form-control" type="text" name="SEPA_Email" id="fldSepaEmail" value="{{vtSession:SEPA_Email}}" autocomplete="on">
 							</div>
 						</div>
 					</div>
@@ -548,7 +548,7 @@
 					</div>
 				<!--{{vtEndIf}}-->
 				
-				<button type="submit" class="btn btn-primary btn-lg btn-block">{{vtGet:s_btn_proceed}}</button>
+				<button id="btnSubmit" type="submit" class="btn btn-primary btn-lg btn-block">{{vtGet:s_btn_proceed}}</button>
 
 			</div>
 
@@ -584,28 +584,28 @@
 		<tr>
 			<td>{{vtGet:s_fld_firstname}}:*</td>
 			<td>
-				<input id="vorname" type="text" name="Vorname" value="{{vtSession:Vorname}}" size="40">
+				<input id="vorname" type="text" name="Vorname" value="{{vtSession:Vorname}}" size="40" autocomplete="given-name">
 			</td>
 		</tr>
 		<tr>
 			<td>{{vtGet:s_fld_lastname}}:*</td>
 			<td>
-				<input type="text" name="Name" value="{{vtSession:Name}}" size="40">
+				<input type="text" name="Name" value="{{vtSession:Name}}" size="40" autocomplete="family-name">
 			</td>
 		</tr>
 		<tr>
 			<td>{{vtGet:s_fld_organization}}:</td>
-			<td><input type="text" name="Firma" value="{{vtSession:Firma}}" size="40"></td>
+			<td><input type="text" name="Firma" value="{{vtSession:Firma}}" size="40" autocomplete="organization"></td>
 		</tr>
 		<tr>
 			<td>{{vtGet:s_fld_address}}:*</td>
-			<td><input type="text" name="Strasse" value="{{vtSession:Strasse}}" size="40"></td>
+			<td><input type="text" name="Strasse" value="{{vtSession:Strasse}}" size="40" autocomplete="street-address"></td>
 		</tr>
 		<tr>
 			<td>{{vtGet:s_fld_city}}:*</td>
 			<td>
-				<input type="text" name="PLZ" value="{{vtSession:PLZ}}" size="5">
-				<input type="text" name="Ort" value="{{vtSession:Ort}}" size="35">
+				<input type="text" name="PLZ" value="{{vtSession:PLZ}}" size="5" autocomplete="postal-code">
+				<input type="text" name="Ort" value="{{vtSession:Ort}}" size="35" autocomplete="address-level2">
 			</td>
 		</tr>
 		<tr>
@@ -620,7 +620,7 @@
 		<tr id="vat_id" style="{{vtIf: {vtSession:Land} .eq. {vtGlobal:pxtcVatCountry} .or. {vtSession:Land} .nin. {vtGet:EU_Countries} }}display:none{{vtEndIf}}">
 			<td>{{vtGet:s_fld_vat_id}}:</td>
 			<td>
-				<input type="text" name="USt_ID" value="{{vtSession:USt_ID}}" size="40">
+				<input type="text" name="USt_ID" value="{{vtSession:USt_ID}}" size="40" autocomplete="on">
 			</td>
 		</tr>
 		<!--{{vtEndIf}}-->
@@ -634,11 +634,11 @@
 		</tr>
 		<tr>
 			<td>{{vtGet:s_fld_phone}}:</td>
-			<td><input type="text" name="Telefon" value="{{vtSession:Telefon}}" size="40"></td>
+			<td><input type="text" name="Telefon" value="{{vtSession:Telefon}}" size="40" autocomplete="tel-national"></td>
 		</tr>
 		<tr>
 			<td>{{vtGet:s_fld_email}}:*</td>
-			<td><input type="text" name="Email" value="{{vtSession:Email}}" size="40"></td>
+			<td><input type="text" name="Email" value="{{vtSession:Email}}" size="40" autocomplete="email"></td>
 		</tr>
 	</table>
 	<!--{{vtIf: {Text_Registrierung} .neq.}}-->
@@ -677,28 +677,28 @@
 		<tr>
 			<td>{{vtGet:s_fld_firstname}}:*</td>
 			<td>
-				<input type="text" name="Vorname2" value="{{vtSession:Vorname2}}" size="40">
+				<input type="text" name="Vorname2" value="{{vtSession:Vorname2}}" size="40" autocomplete="shipping given-name">
 			</td>
 		</tr>
 		<tr>
 			<td>{{vtGet:s_fld_lastname}}:*</td>
 			<td>
-				<input type="text" name="Name2" value="{{vtSession:Name2}}" size="40">
+				<input type="text" name="Name2" value="{{vtSession:Name2}}" size="40" autocomplete="shipping family-name">
 			</td>
 		</tr>
 			<tr>
 				<td>{{vtGet:s_fld_organization}}:</td>
-				<td><input type="text" name="Firma2" value="{{vtSession:Firma2}}" size="40"></td>
+				<td><input type="text" name="Firma2" value="{{vtSession:Firma2}}" size="40" autocomplete="shipping organization"></td>
 			</tr>
 			<tr>
 				<td>{{vtGet:s_fld_address}}:*</td>
-				<td><input type="text" name="Strasse2" value="{{vtSession:Strasse2}}" size="40"></td>
+				<td><input type="text" name="Strasse2" value="{{vtSession:Strasse2}}" size="40" autocomplete="shipping street-address"></td>
 			</tr>
 			<tr>
 				<td>{{vtGet:s_fld_city}}:*</td>
 				<td>
-					<input type="text" name="PLZ2" value="{{vtSession:PLZ2}}" size="5">
-					<input type="text" name="Ort2" value="{{vtSession:Ort2}}" size="35">
+					<input type="text" name="PLZ2" value="{{vtSession:PLZ2}}" size="5" autocomplete="shipping postal-code">
+					<input type="text" name="Ort2" value="{{vtSession:Ort2}}" size="35" autocomplete="shipping address-level2">
 				</td>
 			</tr>
 			<tr>
@@ -787,15 +787,15 @@
 	<table id="bankverbindung_sepa" style="display:{{vtIf: {vtSession:Bezahlmethode} .neq. sepa}}none{{vtElse}}block{{vtEndIf}}">
 		<tr>
 			<td>{{vtGet:s_fld_sepa_iban}}:*&nbsp;</td>
-			<td><input type="text" name="SEPA_IBAN" value="{{vtSession:SEPA_IBAN}}" size="15">&nbsp;&nbsp;</td>
+			<td><input type="text" name="SEPA_IBAN" value="{{vtSession:SEPA_IBAN}}" size="15" autocomplete="on">&nbsp;&nbsp;</td>
 			<td>{{vtGet:s_fld_sepa_holder}}:*&nbsp;</td>
-			<td><input type="text" name="SEPA_Inhaber" value="{{vtSession:SEPA_Inhaber}}" size="20"></td>
+			<td><input type="text" name="SEPA_Inhaber" value="{{vtSession:SEPA_Inhaber}}" size="20" autocomplete="on"></td>
 		</tr>
 		<tr>
 			<td>{{vtGet:s_fld_sepa_bic}}:*&nbsp;</td>
-			<td><input type="text" name="SEPA_BIC" value="{{vtSession:SEPA_BIC}}" size="15">&nbsp;&nbsp;</td>
+			<td><input type="text" name="SEPA_BIC" value="{{vtSession:SEPA_BIC}}" size="15" autocomplete="on">&nbsp;&nbsp;</td>
 			<td>{{vtGet:s_fld_sepa_email}}:*&nbsp;</td>
-			<td><input type="text" name="SEPA_Email" value="{{vtSession:SEPA_Email}}" size="20"></td>
+			<td><input type="text" name="SEPA_Email" value="{{vtSession:SEPA_Email}}" size="20" autocomplete="on"></td>
 		</tr>
 	</table>
 	<p>{{vtGet:s_fld_message}}:<br>
@@ -998,9 +998,11 @@
 
 		function handleSubmit( f )
 		{
+			$('#btnSubmit').prop( 'disabled', true );
 			if ( f.Vorname.value == '' || f.Name.value == '' || f.Strasse.value == '' || f.PLZ.value == '' || f.Ort.value == '' || f.Email.value == '' )
 			{
 				my_dialog('{{vtGet:s_msg_0015,escaped}}');
+				$('#btnSubmit').prop( 'disabled', false );
 				return false;
 			}
 			
@@ -1016,6 +1018,7 @@
 						f.USt_ID.focus();
 						f.USt_ID.select();
 					});
+					$('#btnSubmit').prop( 'disabled', false );
 					return false;
 				}
 			}
@@ -1032,6 +1035,7 @@
 					if ( f.Vorname2.value == '' || f.Name2.value == '' || f.Strasse2.value == '' || f.PLZ2.value == '' || f.Ort2.value == '' )
 					{
 						my_dialog( '{{vtGet:s_msg_0015,escaped}}');
+						$('#btnSubmit').prop( 'disabled', false );
 						return false;
 					}
 				}
@@ -1050,6 +1054,7 @@
 					if ( f.SEPA_IBAN.value == '' || f.SEPA_BIC.value == '' || f.SEPA_Inhaber.value == '' || f.SEPA_Email.value == '' )
 					{
 						my_dialog( '{{vtGet:s_msg_0015,escaped}}' );
+						$('#btnSubmit').prop( 'disabled', false );
 						return false;
 					}
 					
@@ -1059,6 +1064,7 @@
 							f.SEPA_IBAN.focus();
 							f.SEPA_IBAN.select();
 						});
+						$('#btnSubmit').prop( 'disabled', false );
 						return false;
 					}
 
@@ -1070,18 +1076,21 @@
 			if ( ! f.AGB[1].checked )
 			{
 				my_dialog( '{{vtGet:s_msg_0016,escaped}}' );
+				$('#btnSubmit').prop( 'disabled', false );
 				return false;
 			}
 			
 			if ( f.Datenschutz && ! f.Datenschutz[1].checked )
 			{
 				my_dialog( '{{vtGet:s_msg_0055,escaped}}' );
+				$('#btnSubmit').prop( 'disabled', false );
 				return false;
 			}
 			
 			if ( f.Widerrufsverzicht && ! f.Widerrufsverzicht[1].checked )
 			{
 				my_dialog( '{{vtGet:s_msg_0056,escaped}}' );
+				$('#btnSubmit').prop( 'disabled', false );
 				return false;
 			}
 			
diff --git a/checkout.summary.html b/checkout.summary.html
index 330e16b..3061fca 100644
--- a/checkout.summary.html
+++ b/checkout.summary.html
@@ -163,12 +163,17 @@
 			{{vtSet: Rabatt_netto="{vtGet:Gutscheinwert}"}}
 		{{vtEndIf}}
 	{{vtElseIf: {vtGet:Gutscheintyp} .eq. 2 .and. {vtGet:MindestbestellwertErreicht} .eq. 1 }}
-		{{vtCalc: round( {vtGet:Warenwert_netto} / 100 * {vtGet:Gutscheinwert}, 2 ) }}
-		{{vtSet: Rabatt_netto }}
-		{{vtIf: {vtGet:VatRate} .gt. 0 }}
-			{{vtCalc: round( {vtResult} * ( 1 + {vtGet:VatRate}/100 ), 2 ) }}
+		{{vtIf: {vtGet:Gutscheinwert} .eq. 100 }}
+			{{vtSet: Rabatt_netto = "{vtGet:Warenwert_netto}" }}
+			{{vtSet: Rabatt_brutto = "{vtGet:Warenwert_brutto}" }}
+		{{vtElse}}
+			{{vtCalc: round( {vtGet:Warenwert_netto} / 100 * {vtGet:Gutscheinwert}, 2 ) }}
+			{{vtSet: Rabatt_netto }}
+			{{vtIf: {vtGet:VatRate} .gt. 0 }}
+				{{vtCalc: round( {vtGet:Rabatt_netto} * ( 1 + {vtGet:VatRate}/100 ), 2 ) }}
+			{{vtEndIf}}
+			{{vtSet: Rabatt_brutto}}
 		{{vtEndIf}}
-		{{vtSet: Rabatt_brutto}}
 	{{vtEndIf}}
 
 	{{vtIf: {vtGet:Rabatt_netto|num-en} .gt. {vtGet:Warenwert_netto|num-en} .or. {vtGet:Rabatt_brutto|num-en} .gt. {vtGet:Warenwert_brutto|num-en} }}
@@ -611,7 +616,7 @@
 					<input type="hidden" name="cbt" value="Weiter zu {{vtGlobal:siteName}}"> 
 					<input type="hidden" name="cancel_return" value="{{vtLink:-met='summary'}}">
 					<input type="hidden" name="shopping_url" value="{{vtLink:{vtGet:ID_Bilder} }}">
-					<input type="hidden" name="notify_url" value="{{vtSelf}}?-met=register_pp">
+					<input type="hidden" name="notify_url" value="{{vtSelf}}?-met=register_pp{{vtIf: {vtGet:Language} .neq. de }}&-lg=en{{vtEndIf}}">
 					<input type="hidden" name="no_note" value="1">
 					<input type="hidden" name="no_ird" value="1">
 					<input type="hidden" name="currency_code" value="{{vtSession:Currency}}">
diff --git a/contact.html b/contact.html
index c2467f1..0e53dad 100644
--- a/contact.html
+++ b/contact.html
@@ -147,7 +147,7 @@
 								<!--{{vtEndRepeat}}-->
 							</select>
 						<!--{{vtElse}}-->
-							<input type="text" class="form-control" id="fld-{{vtItem:value}}" name="{{vtItem:value}}" value="{{vtSession:{vtItem:value} }}" placeholder="{{vtItem:value}}" {{vtIf: {vtItem:value} .in. {Mandatory_Fields:raw} }}required{{vtEndIf}}>
+							<input type="text" class="form-control" id="fld-{{vtItem:value}}" name="{{vtItem:value}}" value="{{vtSession:{vtItem:value} }}" placeholder="{{vtItem:label}}" {{vtIf: {vtItem:value} .in. {Mandatory_Fields:raw} }}required{{vtEndIf}} autocomplete="on">
 						<!--{{vtEndIf}}-->
 					</div>
 				</div>
@@ -190,7 +190,7 @@
 			<div class="form-group row important">
 				<label for="fld-Blindfeld" class="col-sm-4 col-form-label">Blindfeld</label>
 				<div class="col-sm-8">
-					<input type="text" class="form-control" id="fld-Blindfeld" name="mail2">
+					<input type="text" class="form-control" id="fld-Blindfeld" name="mail2" autocomplete="off">
 				</div>
 			</div>
 
@@ -231,7 +231,7 @@
 								<!--{{vtEndRepeat}}-->
 							</select>
 						<!--{{vtElse}}-->
-							<input type="text" class="field" name="{{vtItem:value}}" value="{{vtSession:{vtItem:value} }}">
+							<input type="text" class="field" name="{{vtItem:value}}" value="{{vtSession:{vtItem:value} }}" autocomplete="on">
 						<!--{{vtEndIf}}-->
 					</td>
 				</tr>
@@ -275,7 +275,7 @@
 			<tr class="important">
 				<td>Blindfeld:</td>
 				<td>
-					<input type="text" class="field" name="mail2">
+					<input type="text" class="field" name="mail2" autocomplete="off">
 				</td>
 			</tr>
 			<tr>
diff --git a/image.html b/image.html
index 72082e3..f3e3855 100644
--- a/image.html
+++ b/image.html
@@ -84,7 +84,10 @@
 					{{vtSet: Target = "" }}
 				{{vtEndIf}}
 				{{vtCalc: mb_encode_numericentity( '{vtItem:title,escaped}', array( 0x000000, 0x10ffff, 0, 0xffffff ), 'UTF-8' ) }}
-				{{vtCalc: preg_replace( '/\\b({vtItem:word,escaped})\\b/{vtGet:Flag}', '<a href="{vtGet:Link}" title="{vtResult}" target="{vtGet:Target}">\1</a>', '{vtGet:ImageCaption,escaped}' ) }}
+				{{vtSet: Title }}
+				{{vtCalc: html_entity_decode( '{vtGet:ImageCaption}', ENT_COMPAT | ENT_HTML401, 'UTF-8' ) }}
+				{{vtSet: ImageCaption }}
+				{{vtCalc: preg_replace( '/(^|[^ÄÖÜäöüß\w])({vtItem:word,escaped})($|[^ÄÖÜäöüß\w])/{vtGet:Flag}', '\1<a href="{vtGet:Link}" title="{vtGet:Title}" target="{vtGet:Target}">\2</a>\3', '{vtGet:ImageCaption}' ) }}
 				{{vtSet: ImageCaption }}
 			{{vtEndRepeat}}
 		{{vtEndIf}}
@@ -271,7 +274,7 @@
 				{{vtSet: File[type] = "hires" }}
 				{{vtIf: {vtItem:directory} .eq.}}
 					{{vtSet: File[class] = "dl_btn_{vtItem:extension}" }}
-					{{vtCapture}}{{vtGet:s_txt_0017}}: {{vtItem:extension}}, {{vtItem:resolution}}, {{vtItem:size}}{{vtEndCapture}}
+					{{vtCapture}}{{vtGet:s_txt_0017}}: {{vtItem:extension}}{{vtIf:{vtItem:resolution} .neq.}}, {{vtItem:resolution}}{{vtEndIf}}, {{vtItem:size}}{{vtEndCapture}}
 				{{vtElse}}
 					{{vtSet: File[class] = "dl_btn_{vtItem:directory}" }}
 					{{vtCapture}}{{vtGet:s_txt_0017}}: »{{vtItem:directory}}«; ({{vtItem:extension}}{{vtIf:{vtItem:resolution} .neq.}}, {{vtItem:resolution}}{{vtEndIf}}, {{vtItem:size}}){{vtEndCapture}}
@@ -292,7 +295,7 @@
 			{{vtSet: OriginalResolution }}
 		{{vtEndIf}}
 		{{vtRepeat: {vtGlobal:pxtcImagingRules} }}
-			{{vtIf: {vtUser:admin} .eq. 1 .or. {vtItem:privilege} .eq. 1 .or. {vtGet:HiresDownloadAllowed} .eq. 1
+			{{vtIf: {vtUser:admin} .eq. 1 .or. {vtItem:privilege} .eq. 1
 					.or. {vtItem:privilege} .eq. 2 .and. {vtUser:name} .gt. 0 
 					.or. {vtItem:privilege} .eq. 3 .and. {vtItem:groups} .cn1of. {vtUser:groups} 
 			}}
diff --git a/imagelist.html b/imagelist.html
index dc30e6b..f187fb8 100644
--- a/imagelist.html
+++ b/imagelist.html
@@ -506,7 +506,7 @@
 				{{vtCalc: file_exists( '{vtGlobal:pxtcPathHires}{Verzeichnis:escaped}' ) ? 1 : 0 }}
 				{{vtIf: {vtResult} .eq. 1 }}
 					{{vtRepeat: {vtGlobal:pxtcImagingRules} }}
-						{{vtIf: {vtUser:admin} .eq. 1 .or. {vtItem:privilege} .eq. 1 .or. {vtGet:HiresDownloadAllowed} .eq. 1 
+						{{vtIf: {vtUser:admin} .eq. 1 .or. {vtItem:privilege} .eq. 1
 								.or. {vtItem:privilege} .eq. 1 .and. {vtUser:name} .gt. 0 
 								.or. {vtItem:privilege} .eq. 3 .and. {vtItem:groups} .cn1of. {vtUser:groups} 
 						}}
diff --git a/includes/initialize.html b/includes/initialize.html
index adb1cfa..61b0c52 100644
--- a/includes/initialize.html
+++ b/includes/initialize.html
@@ -228,12 +228,16 @@
 		{{vtEndIf}}	
 	{{vtEndIf}}
 
-	{{vtCalc: str_replace( ',', '|', '{vtGet:Lightbox}' ) }}
-	{{vtAsAdmin}}
-	{{vtSelect: -origin="{vtGet:ID_Bilder}", -type="image", -filter="{vtID} .in. {vtResult}" }}
-		{{vtSet: LightboxCount="{vtCountSelection}"}}
-	{{vtEndSelect}}
-	{{vtEndAsAdmin}}
+	{{vtIf: {vtGet:Lightbox} .eq. }}
+		{{vtSet: LightboxCount="0"}}
+	{{vtElse}}
+		{{vtCalc: str_replace( ',', '|', '{vtGet:Lightbox}' ) }}
+		{{vtAsAdmin}}
+		{{vtSelect: -origin="{vtGet:ID_Bilder}", -type="image", -filter="{vtID} .in. {vtResult}" }}
+			{{vtSet: LightboxCount="{vtCountSelection}"}}
+		{{vtEndSelect}}
+		{{vtEndAsAdmin}}
+	{{vtEndIf}}
 
 
 	## Flags initialisieren
diff --git a/languages/de.txt b/languages/de.txt
index 7f44cab..c31880d 100644
--- a/languages/de.txt
+++ b/languages/de.txt
@@ -12,11 +12,13 @@
 {{vtSet: s_btn_buy_lb         = "Bilder kaufen..."}}
 {{vtSet: s_btn_buy_short      = "kaufen"}}
 {{vtSet: s_btn_cancel         = "Abbrechen"}}
+{{vtSet: s_btn_cart           = "Warenkorb/Kasse"}}
 {{vtSet: s_btn_change         = "ändern"}}
 {{vtSet: s_btn_change_pw      = "Passwort ändern"}}
 {{vtSet: s_btn_checkout       = "Zur Kasse gehen"}}
 {{vtSet: s_btn_close          = "schließen" }}
 {{vtSet: s_btn_contact        = "Kontakt"}}
+{{vtSet: s_btn_continue       = "Weiter einkaufen"}}
 {{vtSet: s_btn_details        = "Details"}}
 {{vtSet: s_btn_download       = "gekaufte Dateien herunterladen"}}
 {{vtSet: s_btn_download_all   = "Alle Dateien herunterladen"}}
diff --git a/languages/en.txt b/languages/en.txt
index c79a667..8cf7e37 100644
--- a/languages/en.txt
+++ b/languages/en.txt
@@ -12,11 +12,13 @@
 {{vtSet: s_btn_buy_lb         = "Buy images..."}}
 {{vtSet: s_btn_buy_short      = "Buy"}}
 {{vtSet: s_btn_cancel         = "Cancel"}}
+{{vtSet: s_btn_cart           = "Cart/checkout"}}
 {{vtSet: s_btn_change         = "Change"}}
 {{vtSet: s_btn_change_pw      = "Change password"}}
 {{vtSet: s_btn_checkout       = "Checkout"}}
 {{vtSet: s_btn_close          = "Close" }}
 {{vtSet: s_btn_contact        = "Contact"}}
+{{vtSet: s_btn_continue       = "Continue shopping"}}
 {{vtSet: s_btn_details        = "Details"}}
 {{vtSet: s_btn_download       = "Download purchased files"}}
 {{vtSet: s_btn_download_all   = "Download all files"}}
diff --git a/lib/image_processor.class.php b/lib/image_processor.class.php
index 0c59ed1..349714e 100644
--- a/lib/image_processor.class.php
+++ b/lib/image_processor.class.php
@@ -461,7 +461,7 @@ class Image_Processor {
 		}
 
 		$unit = strtolower( substr( $value, -1 ) );
-		$value1 = $value ? $value * pow( 1024, strpos( '*kmgt', $unit ) ) : 0;
+		$value1 = $value ? substr( $value, 0, -1 ) * pow( 1024, strpos( '*kmgt', $unit ) ) : 0;
 		$value = trim( ini_get( 'se_memory_limit' ) );
 
 		if ( $value == '-1' )
@@ -470,7 +470,7 @@ class Image_Processor {
 		}
 
 		$unit = strtolower( substr( $value, -1 ) );
-		$value2 = $value ? $value * pow( 1024, strpos( '*kmgt', $unit ) ) : 0;
+		$value2 = $value ? substr( $value, 0, -1 ) * pow( 1024, strpos( '*kmgt', $unit ) ) : 0;
 		return max( $value1, $value2 );
 	}
 
diff --git a/lightbox.html b/lightbox.html
index 256ce64..2c207fe 100644
--- a/lightbox.html
+++ b/lightbox.html
@@ -119,45 +119,41 @@
 
 	{{vtSet: Bildinfos_verbergen="{Bildinfos_verbergen}"}}
 
-	{{vtCalc: str_replace( ',', '|', '{vtGet:Lightbox}' ) }}
-	{{vtSet: LightboxListe}}
-
-	{{vtAsAdmin}}
-		{{vtSelect: -origin="{vtGet:ID_Bilder}", -type="image", -filter="{vtID} .in. {vtGet:LightboxListe}", -sortfield="vtName" }}
-			{{vtSet: LightboxCount="{vtCountSelection}"}}
-		{{vtEndSelect}}
-	{{vtEndAsAdmin}}
-
 	{{vtInclude: includes/get_products_lb.html }}
 
-	{{vtSelect: -origin="{vtGet:ID_Bilder}", -type="image", -filter="{vtID} .in. {vtGet:LightboxListe}", -sortfield="vtName" }}
-	{{vtSet: Anzahl="{vtCountSelection}"}}
-
-	{{vtIf: {vtCountSelection} .gt. 0 .and. {vtEcho:isZipAvailable()} .gt. 0 .and. {vtGlobal:pxtcGalleryShowDownload} .eq. 1 }}
-		{{vtInclude: includes/checkdownloadallowed_global.html}}
-		{{vtIf: {vtGet:LoresDownloadAllowed} .eq. 1 .and. {vtGet:HiresDownloadAllowed} .eq. 1 }}
-			{{vtSet: Button[id] = "download_button" }}
-			{{vtSet: Button[label] = "{vtGet:s_btn_download_short} ..." }}
-			{{vtSet: Button[href] = "#" }}
-			{{vtSet: Button[onclick] = "$('#dlg_download').dialog('open'); return false;" }}
-			{{vtSet: Buttons[] = "{vtGet:Button}" }}
-			{{vtSet: ShowDownloadDialog = "1" }}
-		{{vtElseIf: {vtGet:LoresDownloadAllowed} .eq. 1 }}
-			{{vtSet: Button[id] = "download_button" }}
-			{{vtSet: Button[label] = "{vtGet:s_btn_download_short}" }}
-			{{vtSet: Button[href] = "{vtLink:-met='download'}" }}
-			{{vtSet: Button[onclick] = "" }}
-			{{vtSet: Buttons[] = "{vtGet:Button}" }}
-		{{vtElseIf: {vtGet:HiresDownloadAllowed} .eq. 1 }}
-			{{vtSet: Button[id] = "download_button" }}
-			{{vtSet: Button[label] = "{vtGet:s_btn_download_short}" }}
-			{{vtSet: Button[href] = "{vtLink:-met='download', v='*'}" }}
-			{{vtSet: Button[onclick] = "" }}
-			{{vtSet: Buttons[] = "{vtGet:Button}" }}
+	{{vtIf: {vtGet:LightboxCount} .eq. 0 }}
+		{{vtSet: Anzahl = "0" }}
+	{{vtElse}}
+		{{vtCalc: str_replace( ',', '|', '{vtGet:Lightbox}' ) }}
+		{{vtSelect: -origin="{vtGet:ID_Bilder}", -type="image", -filter="{vtID} .in. {vtResult}", -sortfield="vtName" }}
+		{{vtSet: Anzahl="{vtCountSelection}"}}
+
+		{{vtIf: {vtCountSelection} .gt. 0 .and. {vtEcho:isZipAvailable()} .gt. 0 .and. {vtGlobal:pxtcGalleryShowDownload} .eq. 1 }}
+			{{vtInclude: includes/checkdownloadallowed_global.html}}
+			{{vtIf: {vtGet:LoresDownloadAllowed} .eq. 1 .and. {vtGet:HiresDownloadAllowed} .eq. 1 }}
+				{{vtSet: Button[id] = "download_button" }}
+				{{vtSet: Button[label] = "{vtGet:s_btn_download_short} ..." }}
+				{{vtSet: Button[href] = "#" }}
+				{{vtSet: Button[onclick] = "$('#dlg_download').dialog('open'); return false;" }}
+				{{vtSet: Buttons[] = "{vtGet:Button}" }}
+				{{vtSet: ShowDownloadDialog = "1" }}
+			{{vtElseIf: {vtGet:LoresDownloadAllowed} .eq. 1 }}
+				{{vtSet: Button[id] = "download_button" }}
+				{{vtSet: Button[label] = "{vtGet:s_btn_download_short}" }}
+				{{vtSet: Button[href] = "{vtLink:-met='download'}" }}
+				{{vtSet: Button[onclick] = "" }}
+				{{vtSet: Buttons[] = "{vtGet:Button}" }}
+			{{vtElseIf: {vtGet:HiresDownloadAllowed} .eq. 1 }}
+				{{vtSet: Button[id] = "download_button" }}
+				{{vtSet: Button[label] = "{vtGet:s_btn_download_short}" }}
+				{{vtSet: Button[href] = "{vtLink:-met='download', v='*'}" }}
+				{{vtSet: Button[onclick] = "" }}
+				{{vtSet: Buttons[] = "{vtGet:Button}" }}
+			{{vtEndIf}}
+			{{vtCalc: getImageInfo( '{vtConfig:pathToMedia}' . basename( '{vtGlobal:siteLogo,escaped}') ) }}
+			{{vtSet: Info = "{vtResult}" }}
+			{{vtSet: LogoWidth = "{vtGet:Info[width]}" }}
 		{{vtEndIf}}
-		{{vtCalc: getImageInfo( '{vtConfig:pathToMedia}' . basename( '{vtGlobal:siteLogo,escaped}') ) }}
-		{{vtSet: Info = "{vtResult}" }}
-		{{vtSet: LogoWidth = "{vtGet:Info[width]}" }}
 	{{vtEndIf}}
 -->
 
diff --git a/mails/notify_delivery_inf.txt b/mails/notify_delivery_inf.txt
new file mode 100644
index 0000000..f587653
--- /dev/null
+++ b/mails/notify_delivery_inf.txt
@@ -0,0 +1,13 @@
+{{vtGet:Anredezeile}}
+
+die von Dir bestellten Bilddateien stehen jetzt zum Herunterladen
+bereit. Bitte klicke auf den folgenden Link, um die Downloadseite
+aufzurufen:
+
+{{vtSelf}}?_&-pg=/Download&o={{vtID}}&t={{Token}}
+
+Diese Benachrichtigung bezieht sich auf Deine Bestellung vom {{vtCreationDate}}
+mit der Bestellnummer {{Nummer}}.
+
+Vielen Dank für Deinen Auftrag!
+{{vtGet:pixtacyTitel}}
diff --git a/mails/order_inf.txt b/mails/order_inf.txt
new file mode 100644
index 0000000..456d7d2
--- /dev/null
+++ b/mails/order_inf.txt
@@ -0,0 +1,133 @@
+{{vtIf: {vtGet:Anredezeile} .neq. }}{{vtGet:Anredezeile}}
+
+{{vtEndIf}}{{vtGet:Text_Anfang,raw}}
+
+{{vtIf: {Bezahlmethode} .eq. barzahlung .or. {Rechnungsbetrag} .eq. 0 }}
+{{vtElseIf: {Bezahlmethode} .eq. vorkasse}}
+Du hast als Zahlungsart "Vorkasse" gewählt. Wir werden Deine
+Bestellung daher ausführen, sobald Du den Rechnungsbetrag an uns
+überwiesen habst. Bitte nutze dazu die folgende Bankverbindung:
+
+{{vtRepeat:{vtGlobal:pxtcPrepayAccount,raw} }}{{vtItem}}
+{{vtEndRepeat}}
+Betrag: {{Rechnungsbetrag|num-en:2}} {{Waehrung}}
+Verwendungszweck: Bestell-Nr. {{Nummer}}
+
+{{vtElseIf: {Bezahlmethode} .eq. sepa}}
+Du hast als Zahlungsart "SEPA-Lastschrift" gewählt. Wir werden
+Deine Bestellung daher umgehend ausführen und den Rechnungsbetrag von
+folgendem Konto abbuchen:
+
+ IBAN:            {{SEPA_IBAN}}
+ BIC:             {{SEPA_BIC}}
+ Inhaber:         {{SEPA_Inhaber:raw}}
+ E-Mail:          {{SEPA_Email}}
+
+ Mandatsreferenz: {{SEPA_Ref}}
+ Gläubiger-ID:    {{vtGlobal:pxtcSepaCreditorId}}
+
+{{vtElseIf: {Bezahlmethode} .eq. rechnung}}
+Bitte überweise uns noch kein Geld. Wir werden Deine Bestellung
+umgehend ausführen und Dir eine Rechnung senden, in der Du unsere
+Bankverbindung und weitere Einzelheiten zur Bezahlung findest.
+
+{{vtElse}}
+Du hast den Rechnungsbetrag bereits online bezahlt. Deine Bestellung
+wird umgehend ausgeführt.
+{{vtEndIf}}
+
+
+=====================================================================
+Auftragsdaten
+---------------------------------------------------------------------
+Bestell-Nr.: {{Nummer}}{{vtIf: {Gutscheincode} .neq. }}
+Gutschein: {{Gutscheincode}} {{vtEndIf}}{{vtIf: {Liefermethode} .neq.}} 
+Lieferung: {{Liefermethode}}{{vtEndIf}}
+Rechnungsbetrag: {{Rechnungsbetrag|num-en:2}} {{Waehrung}} {{vtIf: {Rechnungsbetrag} .gt. 0 }}
+Zahlungsart: {{vtIf: {Bezahlmethode} .eq. barzahlung}}bei Lieferung/Abholung{{vtElse}}{{vtGet: s_payment_{Bezahlmethode} }}{{vtEndIf}}
+{{vtIf: {USt_ID} .neq.}}{{vtGet:s_fld_vat_id}}: {{USt_ID}}
+{{vtEndIf}}{{vtEndIf}}
+
+=====================================================================
+Kontaktdaten
+---------------------------------------------------------------------
+{{Anrede:raw|list:Salutations}} {{Vorname:raw}} {{Name:raw}}
+{{vtIf:{Firma} .neq.}}{{Firma:raw}}
+{{vtEndIf}}{{Strasse:raw}}
+{{PLZ:raw}} {{Ort:raw}}
+{{Landesname:raw}} {{vtIf:{Bundesland}.neq.}}/ {{Bundesland:raw}}{{vtEndIf}}
+
+{{vtIf: {Telefon} .neq. }}Tel.: {{Telefon}}
+{{vtEndIf}}E-Mail: {{Email}} {{vtIf: {Registrierung}.eq.ja}}
+[x] Aufnahme in Verteiler erwünscht{{vtEndIf}}
+{{vtIf:{Lieferanschrift} .eq. 1}}
+=====================================================================
+Lieferanschrift
+---------------------------------------------------------------------
+{{Vorname2:raw}} {{Name2}}
+{{vtIf: {Firma2} .neq. }}{{Firma2}}
+{{vtEndIf}}{{Strasse2}}
+{{PLZ2:raw}} {{Ort2}}
+{{Landesname2:raw}} {{vtIf:{Bundesland2}.neq.}}/ {{Bundesland2:raw}}{{vtEndIf}}
+{{vtEndIf}}{{vtIf:{Bemerkungen} .neq.}}
+=====================================================================
+Deine Nachricht an uns
+---------------------------------------------------------------------
+{{Bemerkungen:raw}}
+{{vtEndIf}}
+{{vtIf: {Anzahl_Prints} .gt. 0}}
+=====================================================================
+Bestellte Prints {{vtRepeat:{Warenkorb:raw} }}{{vtIf:{vtItem:type}.eq.print}}
+---------------------------------------------------------------------
+Dateiname: {{vtItem:filename}}
+Bild-URL: {{vtSelf}}?{{vtItem:image}}
+{{vtItem:title,raw}} {{vtIf:{vtGlobal:pxtcVatHandling} .bw. excl .or. {nicht_steuerbar} .eq. 1 }}
+Einzelpreis: {{vtItem:netprice|num-en:2}} {{Waehrung}}
+Anzahl: {{vtItem:quantity}}
+Gesamtpreis: {{vtItem:nettotal|num-en:2}} {{Waehrung}} {{vtIf: {nicht_steuerbar} .neq. 1}}
+zzgl. {{vtItem:vatrate}}% MwSt.{{vtEndIf}} {{vtElse}}
+Einzelpreis: {{vtItem:price|num-en:2}} {{Waehrung}}
+Anzahl: {{vtItem:quantity}}
+Gesamtpreis: {{vtItem:total|num-en:2}} {{Waehrung}} {{vtIf:{vtGlobal:pxtcVatHandling} .bw. incl .and. {nicht_steuerbar} .neq. 1 }}
+inkl. {{vtItem:vatrate}}% MwSt. {{vtEndIf}}
+{{vtEndIf}}{{vtEndIf}}{{vtEndRepeat}}{{vtEndIf}}
+{{vtIf: {Anzahl_Files} .gt. 0}}
+=====================================================================
+Bestellte Dateien {{vtRepeat:{Warenkorb:raw} }}{{vtIf:{vtItem:type}.eq.file}}
+---------------------------------------------------------------------
+Dateiname: {{vtItem:filename}}
+Bild-URL: {{vtSelf}}?{{vtItem:image}}
+{{vtItem:title,raw}} {{vtIf: {nicht_steuerbar} .eq. 1 }}
+Preis: {{vtItem:netprice|num-en:2}} {{Waehrung}}  {{vtElseIf: {vtGlobal:pxtcVatHandling} .bw. excl }}
+Preis: {{vtItem:netprice|num-en:2}} {{Waehrung}}
+zzgl. {{vtItem:vatrate}}% MwSt. {{vtElse}}
+Preis: {{vtItem:price|num-en:2}} {{Waehrung}} {{vtIf:{vtGlobal:pxtcVatHandling} .bw. incl }}
+inkl. {{vtItem:vatrate}}% MwSt. {{vtEndIf}}
+{{vtEndIf}}{{vtEndIf}}{{vtEndRepeat}}{{vtEndIf}}
+
+=====================================================================
+GESAMT
+---------------------------------------------------------------------
+Warenwert: {{Warenwert|num-en:2}} {{Waehrung}} {{vtIf: {Mehrwertsteuer} .gt. 0 }}{{vtCalc: evalList('{Warenkorb:escaped}','total','sum') }}({{vtResult|num-en:2}} {{Waehrung}}) {{vtIf: {Rabatt_netto} .gt. 0 }}
+Rabatt: -{{Rabatt_netto|num-en:2}} {{Waehrung}} ({{Rabatt|num-en:2}} {{Waehrung}}) {{vtEndIf}} {{vtIf: {CD_Versand_netto} .gt. 0 }}
+{{vtGlobal:pxtcDeliveryDownloadablesText2de}}: {{CD_Versand_netto|num-en:2}} {{Waehrung}} ({{CD_Versand|num-en:2}} {{Waehrung}}) {{vtEndIf}} {{vtIf: {Auftragspauschale_netto} .gt. 0 }}
+{{vtGet:s_fld_lumpsum}}: {{Auftragspauschale_netto|num-en:2}} {{Waehrung}} ({{Auftragspauschale|num-en:2}} {{Waehrung}}) {{vtEndIf}}
+Versandkosten: {{Versandkosten_netto|num-en:2}} {{Waehrung}} ({{Versandkosten|num-en:2}} {{Waehrung}})
+Mehrwertsteuer: {{Mehrwertsteuer|num-en:2}} {{Waehrung}} {{vtElse}} {{vtIf: {Rabatt} .gt. 0 }}
+Rabatt: -{{Rabatt|num-en:2}} {{Waehrung}} {{vtEndIf}} {{vtIf: {CD_Versand} .gt. 0 }}-
+{{vtGlobal:pxtcDeliveryDownloadablesText2de}}: {{CD_Versand|num-en:2}} {{Waehrung}} {{vtEndIf}} {{vtIf: {Auftragspauschale} .gt. 0 }}
+{{vtGet:s_fld_lumpsum}}: {{Auftragspauschale|num-en:2}} {{Waehrung}} {{vtEndIf}}
+Versandkosten: {{Versandkosten|num-en:2}} {{Waehrung}} {{vtEndIf}}
+
+Rechnungsbetrag: {{Rechnungsbetrag|num-en:2}} {{Waehrung}}
+
+====================================================================={{vtIf:{vtGet:ContainsHiresLinks}.eq.1 .and. {Datenlieferung}.neq.1}}{{vtIf: {Bezahlmethode} .eq. vorkasse .and. {Rechnungsbetrag} .gt. 0 }}
+Sobald Dein Zahlungseingang in unserem System verbucht ist, erhältst
+Du automatisch einen Link zu den bestellten Bilddateien per E-Mail
+zugesendet.
+{{vtElse}}
+Du kannst die bestellten Bilddateien hier herunterladen:
+{{vtSelf}}?_&-pg={{vtGet:ID_Download}}&o={{vtID}}&t={{Token}}
+{{vtEndIf}}{{vtEndIf}}
+
+{{vtGet:Text_Ende,raw}}
diff --git a/mails/pwreset.txt b/mails/pwreset.txt
deleted file mode 100644
index 7a8c963..0000000
--- a/mails/pwreset.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-Für Ihr Benutzerkonto bei {{vtGlobal:siteName}} wurde
-ein neues Passwort angefordert.
-
-Ihr neues Passwort lautet: {vtGet:pwresetPassword}
-
-Ihr altes Passwort ist ab sofort nicht mehr gültig.
-
-Diese Nachricht wurde automatisch erzeugt.
diff --git a/order._onchange.html b/order._onchange.html
index 8ca6119..fb23515 100644
--- a/order._onchange.html
+++ b/order._onchange.html
@@ -55,10 +55,13 @@
 		{{vtCalc: sprintf( '{vtGet:s_txt_0073,escaped}', '{Vorname:escaped}', '{Name:escaped}' ) }}
 	{{vtEndIf}}
 	{{vtSet: Anredezeile }}
+	{{vtIf: {vtGlobal:pxtcLanguageInformal} .eq. 1 }}
+		{{vtSet: Suffix = "_inf" }}
+	{{vtEndIf}}
 	{{vtIf: {vtGet:Language} .eq. en}}
-		{{vtSet: Mailtext="{vtInclude: /config/mails/notify_delivery_en.txt, mails/notify_delivery_en.txt }"}}
+		{{vtSet: Mailtext="{vtInclude: /config/mails/notify_delivery_en{vtGetSuffix}.txt, mails/notify_delivery_en{vtGet:Suffix}.txt, /config/mails/notify_delivery_en.txt, mails/notify_delivery_en.txt }"}}
 	{{vtElse}}
-		{{vtSet: Mailtext="{vtInclude: /config/mails/notify_delivery.txt, mails/notify_delivery.txt}"}}
+		{{vtSet: Mailtext="{vtInclude: /config/mails/notify_delivery{vtGet:Suffix}.txt, mails/notify_delivery{vtGet:Suffix}.txt, /config/mails/notify_delivery.txt, mails/notify_delivery.txt }"}}
 	{{vtEndIf}}
 	{{vtDo: -act="mail", -to="{Email}", -subject="{vtGet:s_txt_0061}", -message="{vtGet:Mailtext,raw}"}}
 	{{vtDo: -act="update", -obj="{vtID}", DeliveryNotificationSent="{vtDate|d.m.Y H:i}"}}
diff --git a/order.html b/order.html
index 1931ad0..3dad9ef 100644
--- a/order.html
+++ b/order.html
@@ -4,7 +4,7 @@
 <html>
 <head>
 	<!--{{vtInclude: includes/initialize.html}}-->
-	<!--{{vtScript}} {{Nummer:short}} {{Rechnungsnummer:short}} {{Token:short}} {{abgeschlossen:checkbox,[{"value":"1","text":"ja"}] }} {{bezahlt:checkbox,[{"value":"1","text":"ja"}] }} {{erledigt:checkbox,[{"value":"1","text":"ja"}] }} {{Datum:short}} {{Uhrzeit:short}} {{Kommentar}} {{Anrede:short}} {{Vorname:short}} {{Name:short}} {{Firma:short}} {{USt_ID:short}} {{Strasse:short}} {{PLZ:short}} {{Ort:short}} {{Land:short}} {{Landesname:short}} {{Bundesland:short}} {{Telefon:short}} {{Email:short}} {{Registrierung:select,["ja","nein"] }} {{Bemerkungen}} {{Lieferanschrift:checkbox,[{"value":"1","text":"ja"}] }} {{Vorname2:short}} {{Name2:short}} {{Firma2:short}} {{Strasse2:short}} {{Plz2:short}} {{Ort2:short}} {{Land2:short}} {{Landesname2:short}} {{Bundesland2:short}} {{Datenlieferung:checkbox,[{"value":"1","text":"ja"}] }} {{Liefermethode:short}} {{Liefermethode_en:short}} {{Bezahlmethode:select,["vorkasse","rechnung","lastschrift","sepa","paypal","payrexx","sofortueberweisung","barzahlung"] }} {{SEPA_IBAN:short}} {{SEPA_BIC:short}} {{SEPA_Inhaber:short}} {{SEPA_Email:short}} {{SEPA_Ref:short}} {{Payment_TAN:short}} {{Payment_Date:short}} {{Payment_Value:short}} {{Payment_Comment:short}} {{Warenkorb}} {{Anzahl_Files:short}} {{Anzahl_Prints:short}} {{Warenwert_netto:short}} {{Warenwert:short}} {{Rabatt_netto:short}} {{Rabatt:short}} {{CD_Versand_netto:short}} {{CD_Versand:short}} {{Auftragspauschale_netto:short}} {{Auftragspauschale:short}} {{Versandkosten_netto:short}} {{Versandkosten:short}} {{Mehrwertsteuer:short}} {{nicht_steuerbar:checkbox,[{"value":"1","text":"ja"}] }} {{Rechnungsbetrag:short}} {{Waehrung:short}} {{pxprint_Order_ID:short}} {{pxprint_Order_TS:short}} {{pxprint_Error:short}} {{Easybill_Number:short}} {{Easybill_ID:short}} {{Easybill_TS:short}} {{Easybill_Error:short}} {{Gutscheincode:short}} {{GutscheinID:short}} {{Language:short}} {{Session:non_editable}} {{Userid:non_editable}} {{Zwischensumme:non_editable}} {{DeliveryNotificationSent:non_editable}} {{vtEndScript}}-->
+	<!--{{vtScript}} {{Nummer:short}} {{Rechnungsnummer:short}} {{Token:short}} {{abgeschlossen:checkbox,[{"value":"1","text":"ja"}] }} {{bezahlt:checkbox,[{"value":"1","text":"ja"}] }} {{erledigt:checkbox,[{"value":"1","text":"ja"}] }} {{Datum:short}} {{Uhrzeit:short}} {{Kommentar:styled}} {{Anrede:short}} {{Vorname:short}} {{Name:short}} {{Firma:short}} {{USt_ID:short}} {{Strasse:short}} {{PLZ:short}} {{Ort:short}} {{Land:short}} {{Landesname:short}} {{Bundesland:short}} {{Telefon:short}} {{Email:short}} {{Registrierung:select,["ja","nein"] }} {{Bemerkungen}} {{Lieferanschrift:checkbox,[{"value":"1","text":"ja"}] }} {{Vorname2:short}} {{Name2:short}} {{Firma2:short}} {{Strasse2:short}} {{Plz2:short}} {{Ort2:short}} {{Land2:short}} {{Landesname2:short}} {{Bundesland2:short}} {{Datenlieferung:checkbox,[{"value":"1","text":"ja"}] }} {{Liefermethode:short}} {{Liefermethode_en:short}} {{Bezahlmethode:select,["vorkasse","rechnung","lastschrift","sepa","paypal","payrexx","sofortueberweisung","barzahlung"] }} {{SEPA_IBAN:short}} {{SEPA_BIC:short}} {{SEPA_Inhaber:short}} {{SEPA_Email:short}} {{SEPA_Ref:short}} {{Payment_TAN:short}} {{Payment_Date:short}} {{Payment_Value:short}} {{Payment_Comment:short}} {{Warenkorb}} {{Anzahl_Files:short}} {{Anzahl_Prints:short}} {{Warenwert_netto:short}} {{Warenwert:short}} {{Rabatt_netto:short}} {{Rabatt:short}} {{CD_Versand_netto:short}} {{CD_Versand:short}} {{Auftragspauschale_netto:short}} {{Auftragspauschale:short}} {{Versandkosten_netto:short}} {{Versandkosten:short}} {{Mehrwertsteuer:short}} {{nicht_steuerbar:checkbox,[{"value":"1","text":"ja"}] }} {{Rechnungsbetrag:short}} {{Waehrung:short}} {{pxprint_Order_ID:short}} {{pxprint_Order_TS:short}} {{pxprint_Error:short}} {{Easybill_Number:short}} {{Easybill_ID:short}} {{Easybill_TS:short}} {{Easybill_Error:short}} {{Gutscheincode:short}} {{GutscheinID:short}} {{Language:short}} {{Session:non_editable}} {{Userid:non_editable}} {{Zwischensumme:non_editable}} {{DeliveryNotificationSent:non_editable}} {{vtEndScript}}-->
 	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
 	<title>Bestellung {{Nummer}} | {{vtGlobal:siteName}}</title>
 	{{vtInclude: includes/html_headers_internal.html }}
@@ -184,7 +184,7 @@
 			<!--{{vtIf: {Kommentar} .neq.}}-->
 			<tr>
 				<td class="fieldHeading">Eigener Kommentar</td>
-				<td class="fieldContent" style="color:#4BB559">{{Kommentar}}</td>
+				<td class="fieldContent" style="color:#4BB559">{{Kommentar:styled}}</td>
 			</tr>
 			<!--{{vtEndIf}}-->
 			<!--{{vtIf: {Payment_TAN} .neq. }}-->
diff --git a/order.invoice.html b/order.invoice.html
index ffb6759..37239d0 100644
--- a/order.invoice.html
+++ b/order.invoice.html
@@ -20,4 +20,4 @@
 	{{vtSet: MaxAnzahl = "{vtGlobal:pxtcInvoiceMaxItems}" }}
 	
 	{{vtTemplate: /config/views/invoice.html, views/invoice.html }}
--->
+
diff --git a/order.pxprint.html b/order.pxprint.html
index a3a05c9..6b4cf34 100644
--- a/order.pxprint.html
+++ b/order.pxprint.html
@@ -104,6 +104,7 @@ function getPreferredProduct( $pxprintIds ){
 							{{vtSet: Delivery[country]="{Land}"}}
 							{{vtSet: Delivery[state]="{Bundesland}"}}
 						{{vtEndIf}}
+						{{vtSet: Delivery = "{vtEcho: addcslashes( v::vtget('Delivery'), '\\\'') }" }}
 						{{vtSet: Subject = "Pixtacy-Bestell-Nr. {Nummer}" }}
 					{{vtElse}}
 						{{vtSet: Delivery="SHOP"}}
diff --git a/product.vtedit.html b/product.vtedit.html
index d426219..c5d3d8a 100644
--- a/product.vtedit.html
+++ b/product.vtedit.html
@@ -165,6 +165,10 @@
 				}
 			}
 			
+			if( $('input[name=Typ]:checked').val() != 'Print' ){
+				f.pxprint_id.value = '';
+			}
+
 			if( f.pxprint_id.value != '' && ! f.elements['-hires_switch'].checked ){
 				if( !confirm( 'Sie haben eine pxprint.net-Produkt-ID eingetragen, aber nicht die Option "Produkt wird nur Bildern zugeordnet, bei denen High-Res-Datei vorliegt" aktiviert.\r\rDas bedeutet, dass Sie Ihre Bilddaten vorab beim Lieferanten hinterlegen müssen, damit die automatische Bestellabwicklung funktioniert.\r\rTrotzdem fortfahren?' ) ){
 					return false;
diff --git a/request.html b/request.html
index 5c544b5..b88cb2c 100644
--- a/request.html
+++ b/request.html
@@ -35,16 +35,13 @@
 				<td width="150" class="fieldHeading">Bemerkungen</td>
 				<td width="250" class="fieldContent">{{Bemerkungen}}</td>
 			</tr>
+			<!--{{vtIf: {Registrierung} .eq. 1 }}-->
 			<tr>
 				<td width="150" class="fieldHeading">Registrierung</td>
-				<td width="250" class="fieldContent">
-					<!--{{vtIf: {Registrierung} .eq. 1}}-->
-						ja
-					<!--{{vtElse}}-->
-						nein
-					<!--{{vtEndIf}}-->
-				</td>
+				<td width="250" class="fieldContent">ja</td>
 			</tr>
+			<!--{{vtEndIf}}-->
+			<!--{{vtIf: {Lightbox} .neq. }}-->
 			<tr>
 				<td width="150" class="fieldHeading">Bildauswahl</td>
 				<td width="250" class="fieldContent">
@@ -66,6 +63,7 @@
 					<!--{{vtEndSelect}}-->
 				</td>
 			</tr>
+			<!--{{vtEndIf}}-->
 		</table>
 	</div>
 </body>
diff --git a/requestlist.html b/requestlist.html
index ad60fab..17da2f9 100644
--- a/requestlist.html
+++ b/requestlist.html
@@ -149,8 +149,17 @@
 					<th width="150" class="{{vtIf: {vtSession:RequestlistSortfield} .eq. name}}active{{vtEndIf}}">
 						<a href="{{vtLink:sort='name'}}">Name</a>
 					</th>
+					<!--
+						{{vtSet: Label="Firma" }}
+						{{vtRepeat: {vtGet:RequestFields} }}
+							{{vtIf: {vtItem:value} .eq. Firma }}
+								{{vtSet: Label="{vtItem:label}" }}
+								{{vtExit}}
+							{{vtEndIf}}
+						{{vtEndRepeat}}
+					-->
 					<th width="250" class="{{vtIf: {vtSession:RequestlistSortfield} .eq. firma}}active{{vtEndIf}}">
-						<a href="{{vtLink:sort='firma'}}">Firma</a>
+						<a href="{{vtLink:sort='firma'}}">{{vtGet:Label}}</a>
 					</th>
 				</tr>
 				<!--{{vtLoop:-size="20"}}-->
diff --git a/resources/functions.php b/resources/functions.php
index 1c6473b..557bdec 100644
--- a/resources/functions.php
+++ b/resources/functions.php
@@ -1107,12 +1107,13 @@ function getHiresFiles( $image )
 			foreach ( $filelist as $file )
 			{
 				$filepath = $path . $folder . '/' . $file;
+				$imagesize = getimagesize( $filepath );
 				$result[] = array (
 					'name' => $file,
 					'directory' => $folder == '/' ? '' : $folder,
 					'size' => getFileSize( $filepath ),
 					'extension' => strtolower( pathinfo( $filepath, PATHINFO_EXTENSION ) ),
-					'resolution' => implode( ' x ', array_slice( getimagesize( $filepath ), 0, 2 ) )
+					'resolution' => $imagesize ? implode( ' x ', array_slice( $imagesize, 0, 2 ) ) : ''
 				);
 			}
 		}
@@ -1339,16 +1340,7 @@ function createEasybillInvoice( $customer_id,  $customer_number )
 	$items = json_decode( v::vtpage( 'Warenkorb' ), TRUE );
 	$products = array ();
 	$max_vat_rate = 0;
-	if ( v::vtglobal('pxtcVatHandling') == 'excluded' )
-	{
-		$priceLabel = 'singlePriceNetto';
-		$priceField = 'netprice';
-	}
-	else
-	{
-		$priceLabel = 'singlePriceBrutto';
-		$priceField = 'price';
-	}
+	$vatExcluded = v::vtglobal('pxtcVatHandling') == 'excluded';
 	foreach ( $items as $item )
 	{
 		if ( isset( $products[ $item['product'] ] ) )
@@ -1364,7 +1356,7 @@ function createEasybillInvoice( $customer_id,  $customer_number )
 					'itemDescription' => $item['title'],
 					'count' => $item['quantity'],
 					'unit' => '',
-					$priceLabel => 100 * $item[ $priceField ],
+					'singlePriceNetto' => 100 * ( $vatExcluded ? $item['netprice'] : $item['price'] / ( 1 + $item['vatrate']/100 ) ),
 					'ustPercent' => $item['vatrate']
 				);
 		}
@@ -2408,8 +2400,6 @@ function image_is_buyable( $imagePath, $imageAssortment, $imageProducts, $return
 
 	// Prüfe Bild individuell
 
-	$imageProducts = array ();
-
 	if ( $imageAssortment == -1 || ! isset( $assortmentCodes[ $imageAssortment ] ) ) {
 		// kein Sortiment zugeordnet
 		// prüfe automat. zugeordnete Produkte
diff --git a/resources/lg-cart.js b/resources/lg-cart.js
index f4753ca..cf04540 100644
--- a/resources/lg-cart.js
+++ b/resources/lg-cart.js
@@ -134,10 +134,11 @@
 		}
 
 		Cart.prototype.adjustBoxPosition = function(){
+			var outerPos = this.core.outer.offset();
 			var pos = this.core.outer.find('.lg-current .lg-image').offset();
 			var toolbarHeight = this.core.$toolbar.firstElement.offsetHeight;
 			if ( pos ){
-				this.cartbox.css( 'top', '' + ( pos.top - toolbarHeight ) + 'px' );
+				this.cartbox.css( 'top', '' + ( pos.top - outerPos.top - toolbarHeight ) + 'px' );
 				this.cartbox.css( 'right', '' + pos.left + 'px' );
 			}
 		}
diff --git a/resources/lg-flagging.js b/resources/lg-flagging.js
index 28f784f..1e5aa49 100644
--- a/resources/lg-flagging.js
+++ b/resources/lg-flagging.js
@@ -143,10 +143,11 @@
 		}
 
 		Flagging.prototype.adjustBoxPosition = function(){
+			var outerPos = this.core.outer.offset();
 			var pos = this.core.outer.find('.lg-current .lg-image').offset();
 			var toolbarHeight = this.core.$toolbar.firstElement.offsetHeight;
 			if ( pos ){
-				this.flaggingbox.css( 'top', '' + ( pos.top - toolbarHeight ) + 'px' );
+				this.flaggingbox.css( 'top', '' + ( pos.top - outerPos.top - toolbarHeight ) + 'px' );
 				this.flaggingbox.css( 'left', '' + pos.left + 'px' );
 			}
 		}
diff --git a/resources/order_dialog.js b/resources/order_dialog.js
index dcbb6da..d3a2725 100644
--- a/resources/order_dialog.js
+++ b/resources/order_dialog.js
@@ -24,6 +24,7 @@ function update_order_row( row, count, price, netprice ){
 	row.find('.quantity').text( count );
 	price ? row.find('.price').text( price ) : null;
 	netprice ? row.find('.netprice').text( netprice ) : null;
+	$('#gotoCart').toggle( $('#add-to-cart .table-warning').length > 0 );
 }
 
 $(document).ready( function(){
diff --git a/resources/simple_http.class.php b/resources/simple_http.class.php
index 971277a..195607d 100644
--- a/resources/simple_http.class.php
+++ b/resources/simple_http.class.php
@@ -1,105 +1,100 @@
 <?php
 
+/*
+	A simple class for sending HTTP requests
+	Copyright (C) 2024 Martin Wandelt
+
+	This program is free software: you can redistribute it and/or modify
+	it under the terms of the GNU General Public License as published by
+	the Free Software Foundation, either version 3 of the License, or
+	(at your option) any later version.
+
+	This program is distributed in the hope that it will be useful,
+	but WITHOUT ANY WARRANTY; without even the implied warranty of
+	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+	GNU General Public License for more details.
+
+	You should have received a copy of the GNU General Public License
+	along with this program.  If not, see <https://www.gnu.org/licenses/>.
+*/
+
+
 class Simple_HTTP
 {
 	public $host;
 	public $port;
 	public $useSsl;
 	public $useCurl = FALSE;	
+	public $ignoreResponse = FALSE;
+	public $lastRequest;
+	public $lastResponse;
 
-	public function __construct( $host, $useSsl = FALSE, $port = NULL )
-	{
+	public function __construct( $host, $useSsl = FALSE, $port = NULL ){
 		$this->host = $host;
 		$this->useSsl = $useSsl;
 		$this->port = $port ? $port : ( $useSsl ? 443 : 80 );
 	}
 
 
-	public function send( $method, $path, $content = '', $contentType = '', $headers = array () )
-	{
-		if ( ! empty( $content ) && empty( $contentType ) )
-		{
+	public function send( $method, $path, $content = '', $contentType = '', $headers = array () ){
+		if ( $content && ! $contentType ){
 			$contentType = 'text/plain; charset=utf-8';
 		}
-		
 		$method = strtoupper( $method );
 		$path = ltrim( $path, '/' );
-		
-		if ( $this->useCurl )
-		{
-			$response = $this->send_via_curl( $method, $path, $content, $contentType, $headers );
+		$function = $this->useCurl ? 'send_via_curl' : 'send_via_socket';
+		$response = call_user_func( [ $this, $function ], $method, $path, $content, $contentType, $headers );
+		if ( ! $response ){
+			return FALSE; // connection error
 		}
-		else
-		{
-			$response = $this->send_via_socket( $method, $path, $content, $contentType, $headers );
-		}
-
-		if ( empty( $response ) )
-		{
-			return FALSE;
-		}
-		
-		$headEnd = strpos( $response, "\r\n\r\n" );
-		$head = substr( $response, 0, $headEnd );
-		$body = substr( $response, $headEnd + 2 );
+		$this->lastResponse = $response;
+		list ( $head, $body ) = explode( "\r\n\r\n", $response, 2 ) + ['',''];
 		$status = (int) substr( $head, strpos( $head, ' ' ) + 1, 3 );
-		
-		if ( strpos( $head, "\r\nTransfer-Encoding: chunked\r\n" ) )
-		{
+		if ( strpos( strtolower( $head ), "\r\ntransfer-encoding: chunked\r\n" ) ){
 			$body = '';
-			$markerPos = $headEnd + 4;
+			$markerPos = strlen( $head ) + 4;
 			$markerLength = strpos( $response, "\r\n", $markerPos ) - $markerPos;
 			$dataSize = hexdec( trim( substr( $response, $markerPos, $markerLength ) ) );
-
-			while ( $dataSize > 0 )
-			{
+			while ( $dataSize > 0 ){
 				$body .= substr( $response, $markerPos + $markerLength + 2, $dataSize );
 				$markerPos =  $markerPos + $markerLength + 2 + $dataSize + 2;
 				$markerLength = strpos( $response, "\r\n", $markerPos ) - $markerPos;
 				$dataSize = hexdec( trim( substr( $response, $markerPos, $markerLength ) ) );
 			}
 		}
-
 		return compact( 'status', 'head', 'body' );
 	}
 
 
-	private function send_via_socket( $method, $path, $content, $contentType, $headers )
-	{
+	private function send_via_socket( $method, $path, $content, $contentType, $headers ){
 		$connection = fsockopen( ( $this->useSsl ? 'ssl://' : '' ) . $this->host, $this->port );
-		
-		if ( ! $connection )
-		{
+		if ( ! $connection ){
 			return FALSE;
 		}
-
 		$request = $method . ' /' . $path . ' HTTP/1.1' . "\r\n"
 			. 'Host: ' . $this->host . ( $this->port != 80 ? ':' . $this->port : '' ) . "\r\n" 
 			. ( empty( $headers ) ? '' : implode( "\r\n", $headers ) . "\r\n" )
 			. 'Connection: close' . "\r\n";
-
-		if ( ! empty( $content ) )
-		{
+		if ( $content ){
 			$request .= 'Content-Type: ' . $contentType . "\r\n"
 						.  'Content-Length: ' . strlen( $content ) . "\r\n";
 		}
-
 		$request .= "\r\n" . $content;
+		$this->lastRequest = $request;
 		fwrite( $connection, $request );
 		$response = '';
-		
-		while ( $data = fgets( $connection ) )
-		{
-			$response .= $data;
+		if ( ! $this->ignoreResponse ){
+			while ( $data = fgets( $connection ) ){
+				$response .= $data;
+			}
 		}
-	
 		fclose( $connection );
+		$this->lastResponse = $response;
 		return $response;
 	}
 
 
-	private function send_via_curl( $method, $path, $content, $contentType, $headers )
-	{
+	private function send_via_curl( $method, $path, $content, $contentType, $headers ){
 		$protocol = $this->useSsl ? 'https' : 'http';
 		$curl = curl_init();
 		curl_setopt( $curl, CURLOPT_URL, "{$protocol}://{$this->host}/{$path}" );
@@ -108,32 +103,28 @@ class Simple_HTTP
 		curl_setopt( $curl, CURLOPT_RETURNTRANSFER, TRUE );
 		curl_setopt( $curl, CURLOPT_SSL_VERIFYPEER, FALSE );
 		curl_setopt( $curl, CURLOPT_HEADER, TRUE );
-
-		if ( ! empty( $content ) )
-		{
+		curl_setopt( $curl, CURLINFO_HEADER_OUT, TRUE );
+		if ( $content ){
 			$headers[] = 'Content-Type: ' . $contentType;
 	      $headers[] = 'Content-Length: ' . strlen( $content );
 			curl_setopt( $curl, CURLOPT_POSTFIELDS, $content );
 		}
-
-		if ( ! empty( $headers ) )
-		{
+		if ( ! empty( $headers ) ){
 			curl_setopt( $curl, CURLOPT_HTTPHEADER, $headers );
 		}
-
-		if ( $method == 'POST' )
-		{
+		if ( $method == 'POST' ){
 			curl_setopt( $curl, CURLOPT_POST, TRUE );
 		}
-		elseif ( $method != 'GET' )
-		{
+		elseif ( $method != 'GET' ){
 			curl_setopt( $curl, CURLOPT_CUSTOMREQUEST, $method );
 		}
-
 		$response = curl_exec( $curl );
+		$this->lastRequest = implode( "\n", curl_getinfo( $curl, CURLINFO_HEADER_OUT ) )
+			. "\n{$content}";
 		curl_close( $curl );
 		return $response;
 	}
 }
 
 // end of file simple_http.class.php
+
diff --git a/setup_interfaces.html b/setup_interfaces.html
index 99feba0..43f9008 100644
--- a/setup_interfaces.html
+++ b/setup_interfaces.html
@@ -211,31 +211,23 @@
 			</tr>
 			<tr><td colspan="2">&nbsp;</td></tr>
 			<!--{{vtEndIf}}-->
+			<!--{{vtIf: {pxtcApiKey} .neq. }}-->
 			<tr>
 				<td colspan="2">
 					<h2 class="box">Wer-hat-Fotos.net</h2>
 				</td>
 			</tr>
-			<!--{{vtIf: {pxtcApiKey} .eq. }}-->
-			<tr>
-				<td colspan="2">
-					Eine Bildsuchmaschine, die Ihnen neue Kunden bringen kann.&nbsp;&nbsp;
-					<a class="text_link" title="Gehe zu Wer-hat-Fotos.net" href="http://wer-hat-fotos.net" target="_blank">Mehr Infos</a>
-				</td>
-			</tr>
-			<tr><td colspan="2">&nbsp;</td></tr>
-			<!--{{vtElse}}-->
 			<tr>
 				<td style="width:15em">API-Schlüssel</td>
 				<td>{{pxtcApiKey}}</td>
 			</tr>
 			<tr><td colspan="2">&nbsp;</td></tr>
-			<!--{{vtEndIf}}-->
 			<tr>
 				<td colspan="2">
 					<a href="{{vtLink:-met='vtedit'}}" class="text_link">Einstellungen ändern</a>
 				</td>
 			</tr>
+			<!--{{vtEndIf}}-->
 		</table>
 		<p>&nbsp;</p>
 		<p>&nbsp;</p>
diff --git a/setup_interfaces.vtedit.html b/setup_interfaces.vtedit.html
index e19a4e4..191cb4b 100644
--- a/setup_interfaces.vtedit.html
+++ b/setup_interfaces.vtedit.html
@@ -222,6 +222,7 @@
 			</tr>
 			<tr><td colspan="2">&nbsp;</td></tr>
 			<tr><td colspan="2">&nbsp;</td></tr>
+			<!--{{vtIf: {pxtcApiKey} .neq. }}-->
 			<tr>
 				<td colspan="2">
 					<h2 class="box">Wer-hat-Fotos.net</h2>
@@ -237,6 +238,7 @@
 			</tr>
 			<tr><td colspan="2">&nbsp;</td></tr>
 			<tr><td colspan="2">&nbsp;</td></tr>
+			<!--{{vtEndIf}}-->
 			<tr>
 				<td align="right" class="normal" valign="top">&nbsp;</td>
 				<td class="normal" id="buttontd" colspan="2">
diff --git a/setup_payment.html b/setup_payment.html
index 59a06a0..e49368d 100644
--- a/setup_payment.html
+++ b/setup_payment.html
@@ -78,6 +78,7 @@
 				</td>
 			</tr>
 			<tr><td colspan="2">&nbsp;</td></tr>
+			<!--{{vtIf: {pxtcSofubUserID} .neq.}}-->
 			<tr>
 				<td style="width:12em">sofortüberweisung.de</td>
 				<td>
@@ -104,6 +105,7 @@
 				</td>
 			</tr>
 			<tr><td colspan="2">&nbsp;</td></tr>
+			<!--{{vtEndIf}}-->
 			<tr>
 				<td style="width:12em">PayPal</td>
 				<td>
diff --git a/setup_payment.vtedit.html b/setup_payment.vtedit.html
index a87e8ee..de09d27 100644
--- a/setup_payment.vtedit.html
+++ b/setup_payment.vtedit.html
@@ -319,6 +319,7 @@
 			<tr><td colspan="2">&nbsp;</td></tr>
 			<tr><td colspan="2"><hr></td></tr>
 			<tr><td colspan="2">&nbsp;</td></tr>
+			<!--{{vtIf: {pxtcPaymentSofub} .neq. .or. {pxtcSofubUserID} .neq.}}-->
 			<tr>
 				<td>sofortüberweisung.de</td>
 				<td>
@@ -373,6 +374,7 @@
 			<tr><td colspan="2">&nbsp;</td></tr>
 			<tr><td colspan="2"><hr></td></tr>
 			<tr><td colspan="2">&nbsp;</td></tr>
+			<!--{{vtEndIf}}-->
 			<tr>
 				<td>PayPal</td>
 				<td>
diff --git a/setup_privileges.vtedit.html b/setup_privileges.vtedit.html
index 505e9bb..15f39b6 100644
--- a/setup_privileges.vtedit.html
+++ b/setup_privileges.vtedit.html
@@ -96,19 +96,20 @@
 		
 		function serialize_rules()
 		{
-			var theList = new Array();
+			var theList = JSON.parse( $('input[name=pxtcImagingRules]').val() );
 
 			$('td.rule').each( function(){
-				theList.push({ 
-					name: $(this).data('name'), 
-					size: $(this).data('size'), 
-					minimum: $(this).data('minimum'), 
-					quality: $(this).data('quality'),
-					privilege: $(this).find('select[name=rulePrivilege]').val(),
-					groups: $(this).find('input[name=ruleGroups]:checked').map(function(){ return this.value; }).get().join(),
-					notify: $(this).find('input[name=ruleNotify]:checked').length ? '1' : '',
-					log: $(this).find('input[name=ruleLog]:checked').length ? '1' : ''
-				});
+				var idx = $(this).data('index');
+				theList[idx]['privilege'] = $(this).find('select[name=rulePrivilege]').val();
+				theList[idx]['notify'] = $(this).find('input[name=ruleNotify]:checked').length ? '1' : '';
+				theList[idx]['log'] = $(this).find('input[name=ruleLog]:checked').length ? '1' : '';
+				if ( theList[idx]['privilege'] == 3 ){
+					theList[idx]['groups'] = $(this).find('input[name=ruleGroups]:checked')
+						.map(function(){ return this.value; }).get().join();
+				}
+				else {
+					theList[idx]['groups'] = '';
+				}
 			});
 
 			return JSON.stringify( theList ).replace( /\\\\/g, '\\' );
@@ -147,7 +148,7 @@
 		-->
 
 		<form name="formular" id="formular" action="{{vtLink:-act='update',-obj='{vtID}'}}" method="post" onsubmit="return handleSubmit()">
-		<input type="hidden" name="pxtcImagingRules" value="">
+		<input type="hidden" name="pxtcImagingRules" value="{{pxtcImagingRules}}">
 		<table width="100%" border="0" cellpadding="0" cellspacing="0"> 
 			<tr>
 				<td style="width:20em">Low-res-Download</td>
@@ -210,7 +211,7 @@
 				<tr><td colspan="2">&nbsp;</td></tr>
 				<tr>
 					<td style="width:20em">Download »{{vtItem:name}}«</td>
-					<td class="rule" data-name="{{vtItem:name}}" data-size="{{vtItem:size}}" data-minimum="{{vtItem:minimum}}" data-quality="{{vtItem:quality}}">
+					<td class="rule" data-index="{{vtCount: 0}}">
 						<select name="rulePrivilege" onchange="handleChangeHires()">
 							<option value="">keine generelle Erlaubnis</option>
 							<option value="1" {{vtIf:{vtItem:privilege} .eq. 1}}selected{{vtEndIf}}>für alle Benutzer erlaubt</option>
diff --git a/views/image_r.html b/views/image_r.html
index 3ea43aa..b4bfc14 100644
--- a/views/image_r.html
+++ b/views/image_r.html
@@ -59,6 +59,28 @@
 		#load-page { z-index:9251; }
 
 	</style>
+	<!--{{vtRepeat: {vtGet:ProductList} }}-->
+	<!--{{vtIf: {vtItem:type} .eq. Datei }}-->
+		<script type="application/ld+json">
+		{
+			"@context": "https://schema.org/",
+			"@type": "Product",
+			"name": "{{vtGet:ImageNameOrTitle}}",
+			"image": "{{vtGet:ImageSource}}",
+			"description": "{{vtGet:PageDescription}}",
+			"sku": "{{vtName}}",
+			"offers": {
+				"@type": "Offer",
+				"url": "{{vtGet:CanonicalUrl}}",
+				"priceCurrency": "{{vtGlobal:pxtcCurrency}}",
+				"price": "{{vtItem:price}}",
+				"availability": "https://schema.org/OnlineOnly"
+			}
+		}
+		</script>
+		<!--{{vtExit}}-->
+	<!--{{vtEndIf}}-->
+	<!--{{vtEndRepeat}}-->
 </head>
 <body id="{{vtGet:PageBodyId}}" class="{{vtGet:PageBodyClass}} {{vtIf: {vtGet:ImageIsInLightbox} .eq. 1 }}flagged{{vtEndIf}} {{vtIf: {vtGet:ImageIsInCart} .eq. 1 }}in-cart{{vtEndIf}}">
 
