diff --git a/Elwig/Documents/Document.cs b/Elwig/Documents/Document.cs
index 40aad77..b6b65b3 100644
--- a/Elwig/Documents/Document.cs
+++ b/Elwig/Documents/Document.cs
@@ -109,7 +109,7 @@ namespace Elwig.Documents {
                     var tmpHtml = new TempFile("html");
                     await File.WriteAllTextAsync(tmpHtml.FilePath, await doc.Render(), Utils.UTF8);
                     tmpHtmls.Add(tmpHtml);
-                    tmpFiles.Add(tmpHtml.FileName);
+                    tmpFiles.Add((doc is Letterhead ? "#" : "") + tmpHtml.FileName);
                     i++;
                     progress?.Report(GenerationProportion * 100 * i / n);
                 }
diff --git a/Elwig/Helpers/Printing/Pdf.cs b/Elwig/Helpers/Printing/Pdf.cs
index d52bfe1..f56a967 100644
--- a/Elwig/Helpers/Printing/Pdf.cs
+++ b/Elwig/Helpers/Printing/Pdf.cs
@@ -54,14 +54,13 @@ namespace Elwig.Helpers.Printing {
             while (true) {
                 var line = await WinziPrintProc.StandardOutput.ReadLineAsync() ?? throw new IOException("Invalid response from WinziPrint");
                 if (line.StartsWith("error:")) {
-                    MessageBox.Show(line[6..].Trim(), "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
-                    return Array.Empty<int>();
+                    throw new IOException($"WinziPrint: {line[6..].Trim()}");
                 } else if (line.StartsWith("progress:")) {
                     var parts = line[9..].Trim().Split('/').Select(int.Parse).ToArray();
                     progress?.Report(100.0 * parts[0] / parts[1]);
                 } else if (line.StartsWith("success:")) {
                     var m = Regex.Match(line, @"\(([0-9, ]+)\)");
-                    return m.Groups[1].Value.Split(", ").Select(int.Parse);
+                    return m.Groups[1].Value.Split(", ").Select(int.Parse).ToList();
                 }
             }
         }
diff --git a/Elwig/Windows/DeliveryAdminWindow.xaml.cs b/Elwig/Windows/DeliveryAdminWindow.xaml.cs
index 1eae738..f34a4c3 100644
--- a/Elwig/Windows/DeliveryAdminWindow.xaml.cs
+++ b/Elwig/Windows/DeliveryAdminWindow.xaml.cs
@@ -126,19 +126,27 @@ namespace Elwig.Windows {
         private async void Menu_Print_ShowDeliveryNote_Click(object sender, RoutedEventArgs evt) {
             if (DeliveryList.SelectedItem is not Delivery d) return;
             Mouse.OverrideCursor = Cursors.AppStarting;
-            using var doc = new DeliveryNote(d, Context);
-            await doc.Generate();
+            try {
+                using var doc = new DeliveryNote(d, Context);
+                await doc.Generate();
+                doc.Show();
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
             Mouse.OverrideCursor = null;
-            doc.Show();
         }
 
         private async void Menu_Print_PrintDeliveryNote_Click(object sender, RoutedEventArgs evt) {
             if (DeliveryList.SelectedItem is not Delivery d) return;
             Mouse.OverrideCursor = Cursors.AppStarting;
-            using var doc = new DeliveryNote(d, Context);
-            await doc.Generate();
+            try {
+                using var doc = new DeliveryNote(d, Context);
+                await doc.Generate();
+                await doc.Print();
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
             Mouse.OverrideCursor = null;
-            await doc.Print();
         }
 
         private async void Menu_Export_Bki_Click(object sender, RoutedEventArgs evt) {
@@ -160,36 +168,52 @@ namespace Elwig.Windows {
 
         private async void Menu_Print_DeliveryJournal_ShowToday_Click(object sender, RoutedEventArgs evt) {
             Mouse.OverrideCursor = Cursors.AppStarting;
-            var doc = new DeliveryJournal(Context, DateOnly.FromDateTime(Utils.Today));
-            await doc.Generate();
+            try {
+                var doc = new DeliveryJournal(Context, DateOnly.FromDateTime(Utils.Today));
+                await doc.Generate();
+                doc.Show();
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
             Mouse.OverrideCursor = null;
-            doc.Show();
         }
 
         private async void Menu_Print_DeliveryJournal_PrintToday_Click(object sender, RoutedEventArgs evt) {
             Mouse.OverrideCursor = Cursors.AppStarting;
-            var doc = new DeliveryJournal(Context, DateOnly.FromDateTime(Utils.Today));
-            await doc.Generate();
+            try {
+                var doc = new DeliveryJournal(Context, DateOnly.FromDateTime(Utils.Today));
+                await doc.Generate();
+                await doc.Print();
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
             Mouse.OverrideCursor = null;
-            await doc.Print();
         }
 
         private async void Menu_Print_DeliveryJournal_ShowFilter_Click(object sender, RoutedEventArgs evt) {
             Mouse.OverrideCursor = Cursors.AppStarting;
-            var (f, _, d, _, _) = await GetFilters();
-            var doc = new DeliveryJournal(string.Join(" / ", f), d);
-            await doc.Generate();
+            try {
+                var (f, _, d, _, _) = await GetFilters();
+                var doc = new DeliveryJournal(string.Join(" / ", f), d);
+                await doc.Generate();
+                doc.Show();
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
             Mouse.OverrideCursor = null;
-            doc.Show();
         }
 
         private async void Menu_Print_DeliveryJournal_PrintFilter_Click(object sender, RoutedEventArgs evt) {
             Mouse.OverrideCursor = Cursors.AppStarting;
-            var (f, _, d, _, _) = await GetFilters();
-            var doc = new DeliveryJournal(string.Join(" / ", f), d);
-            await doc.Generate();
+            try {
+                var (f, _, d, _, _) = await GetFilters();
+                var doc = new DeliveryJournal(string.Join(" / ", f), d);
+                await doc.Generate();
+                doc.Show();
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
             Mouse.OverrideCursor = null;
-            doc.Show();
         }
 
         private void Menu_Settings_EnableFreeEditing_Checked(object sender, RoutedEventArgs evt) {
@@ -1153,14 +1177,18 @@ namespace Elwig.Windows {
             await RefreshDeliveryParts();
             if (p?.Delivery != null) {
                 Mouse.OverrideCursor = Cursors.AppStarting;
-                using var doc = new DeliveryNote(p.Delivery, Context);
-                await doc.Generate();
-                Mouse.OverrideCursor = null;
-                if (App.Config.Debug) {
-                    doc.Show();
-                } else {
-                    await doc.Print(2);
+                try {
+                    using var doc = new DeliveryNote(p.Delivery, Context);
+                    await doc.Generate();
+                    if (App.Config.Debug) {
+                        doc.Show();
+                    } else {
+                        await doc.Print(2);
+                    }
+                } catch (Exception exc) {
+                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
                 }
+                Mouse.OverrideCursor = null;
             }
             FinishButton.Cursor = null;
             DeliveryList.SelectedItem = null;
diff --git a/Elwig/Windows/MailWindow.xaml.cs b/Elwig/Windows/MailWindow.xaml.cs
index 8dc18e7..3107db8 100644
--- a/Elwig/Windows/MailWindow.xaml.cs
+++ b/Elwig/Windows/MailWindow.xaml.cs
@@ -487,12 +487,17 @@ namespace Elwig.Windows {
                     return docs;
                 });
             var emailRecipients = email.Select(d => d.Key.MgNr).ToHashSet();
-            foreach (var item1 in email.Select((e, i) => new { Index = i, e.Key, e.Value })) {
-                foreach (var item2 in item1.Value.Select((d, i) => new { Index = i, Doc = d})) {
-                    await item2.Doc.Generate(new Progress<double>(v => {
-                        ProgressBar.Value = v * (item2.Index + 1) / item1.Value.Count / totalNum + 100.0 * item1.Index / totalNum;
-                    }));
+            try {
+                foreach (var item1 in email.Select((e, i) => new { Index = i, e.Key, e.Value })) {
+                    foreach (var item2 in item1.Value.Select((d, i) => new { Index = i, Doc = d })) {
+                        await item2.Doc.Generate(new Progress<double>(v => {
+                            ProgressBar.Value = v * (item2.Index + 1) / item1.Value.Count / totalNum + 100.0 * item1.Index / totalNum;
+                        }));
+                    }
                 }
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+                return;
             }
             if (email.Count > 0) {
                 EmailDocuments = email;
@@ -516,12 +521,17 @@ namespace Elwig.Windows {
                 .ToList();
 
             if (printDocs.Count > 0) {
-                var print = Document.Merge(printDocs);
-                print.DoubleSided = doublePaged;
-                await print.Generate(new Progress<double>(v => {
-                    ProgressBar.Value = 100.0 * emailNum / totalNum + v * printNum / totalNum;
-                }));
-                PrintDocument = print;
+                try {
+                    var print = Document.Merge(printDocs);
+                    print.DoubleSided = doublePaged;
+                    await print.Generate(new Progress<double>(v => {
+                        ProgressBar.Value = 100.0 * emailNum / totalNum + v * printNum / totalNum;
+                    }));
+                    PrintDocument = print;
+                } catch (Exception exc) {
+                    MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+                    return;
+                }
             }
             ProgressBar.Value = 100.0;
 
diff --git a/Elwig/Windows/MemberAdminWindow.xaml.cs b/Elwig/Windows/MemberAdminWindow.xaml.cs
index 3ecf1ea..3ba9e3d 100644
--- a/Elwig/Windows/MemberAdminWindow.xaml.cs
+++ b/Elwig/Windows/MemberAdminWindow.xaml.cs
@@ -432,14 +432,18 @@ namespace Elwig.Windows {
             if (MemberList.SelectedItem is not Member m)
                 return;
             Mouse.OverrideCursor = Cursors.AppStarting;
-            using var doc = new Letterhead(m);
-            await doc.Generate();
-            Mouse.OverrideCursor = null;
-            if (App.Config.Debug) {
-                doc.Show();
-            } else {
-                await doc.Print();
+            try {
+                using var doc = new Letterhead(m);
+                await doc.Generate();
+                if (App.Config.Debug) {
+                    doc.Show();
+                } else {
+                    await doc.Print();
+                }
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
             }
+            Mouse.OverrideCursor = null;
         }
 
         private async Task PrintLetterheads(int ordering) {
@@ -468,14 +472,18 @@ namespace Elwig.Windows {
                         .ThenBy(m => m.MgNr);
                     break;
             }
-            using var doc = Document.Merge((await members.ToListAsync()).Select(m => new Letterhead(m)));
-            await doc.Generate();
-            Mouse.OverrideCursor = null;
-            if (App.Config.Debug) {
-                doc.Show();
-            } else {
-                await doc.Print();
+            try {
+                using var doc = Document.Merge((await members.ToListAsync()).Select(m => new Letterhead(m)));
+                await doc.Generate();
+                if (App.Config.Debug) {
+                    doc.Show();
+                } else {
+                    await doc.Print();
+                }
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
             }
+            Mouse.OverrideCursor = null;
         }
 
         private async void Menu_Print_Letterheads_MgNr_Click(object sender, RoutedEventArgs evt) {
@@ -494,24 +502,32 @@ namespace Elwig.Windows {
             if (MemberList.SelectedItem is not Member m)
                 return;
             Mouse.OverrideCursor = Cursors.AppStarting;
-            using var doc = new MemberDataSheet(m, Context);
-            await doc.Generate();
-            Mouse.OverrideCursor = null;
-            if (App.Config.Debug) {
-                doc.Show();
-            } else {
-                await doc.Print();
+            try {
+                using var doc = new MemberDataSheet(m, Context);
+                await doc.Generate();
+                if (App.Config.Debug) {
+                    doc.Show();
+                } else {
+                    await doc.Print();
+                }
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
             }
+            Mouse.OverrideCursor = null;
         }
 
         private async void Menu_Show_MemberDataSheet_Click(object sender, RoutedEventArgs evt) {
             if (MemberList.SelectedItem is not Member m)
                 return;
             Mouse.OverrideCursor = Cursors.AppStarting;
-            using var doc = new MemberDataSheet(m, Context);
-            await doc.Generate();
+            try {
+                using var doc = new MemberDataSheet(m, Context);
+                await doc.Generate();
+                doc.Show();
+            } catch (Exception exc) {
+                MessageBox.Show(exc.Message, "Fehler", MessageBoxButton.OK, MessageBoxImage.Error);
+            }
             Mouse.OverrideCursor = null;
-            doc.Show();
         }
 
         private void FocusSearchInput(object sender, RoutedEventArgs evt) {
diff --git a/Installer/Files/WinziPrint.exe b/Installer/Files/WinziPrint.exe
index 1747602..09009af 100644
Binary files a/Installer/Files/WinziPrint.exe and b/Installer/Files/WinziPrint.exe differ