diff --git a/Elwig/Documents/CreditNote.cs b/Elwig/Documents/CreditNote.cs
index b9c11fa..71a5a1f 100644
--- a/Elwig/Documents/CreditNote.cs
+++ b/Elwig/Documents/CreditNote.cs
@@ -5,6 +5,7 @@ using Elwig.Models.Entities;
 namespace Elwig.Documents {
     public class CreditNote : BusinessDocument {
 
+        public PaymentMember? Payment;
         public Credit? Credit;
         public CreditNoteData Data;
         public string? Text;
@@ -16,6 +17,7 @@ namespace Elwig.Documents {
             UseBillingAddress = true;
             ShowDateAndLocation = true;
             Data = data;
+            Payment = p;
             Credit = p.Credit;
             Aside = Aside.Replace("</table>", "") +
                 $"<thead><tr><th colspan='2'>Gutschrift</th></tr></thead><tbody>" +
diff --git a/Elwig/Documents/CreditNote.cshtml b/Elwig/Documents/CreditNote.cshtml
index da19de7..3d7fec9 100644
--- a/Elwig/Documents/CreditNote.cshtml
+++ b/Elwig/Documents/CreditNote.cshtml
@@ -1,3 +1,4 @@
+@using Elwig.Helpers
 @using RazorLight
 @inherits TemplatePage<Elwig.Documents.CreditNote>
 @model Elwig.Documents.CreditNote
@@ -8,84 +9,89 @@
     <table class="credit">
         <colgroup>
             <col style="width: 25mm;"/>
-            <col style="width: 5mm;"/>
+            <col style="width:  5mm;"/>
+            <col style="width: 20mm;"/>
             <col style="width: 20mm;"/>
-            <col style="width: 18mm;"/>
             <col style="width: 10mm;"/>
             <col style="width: 10mm;"/>
             <col style="width: 15mm;"/>
             <col style="width: 12mm;"/>
             <col style="width: 15mm;"/>
-            <col style="width: 10mm;"/>
-            <col style="width: 10mm;"/>
-            <col style="width: 15mm;"/>
+            <col style="width: 17mm;"/>
+            <col style="width: 16mm;"/>
         </colgroup>
         <thead>
             <tr>
-                <th rowspan="3" style="text-align: left;">Lieferschein-Nr.</th>
-                <th rowspan="3">Pos.</th>
-                <th rowspan="3" style="text-align: left;">Sorte</th>
-                <th rowspan="3" style="text-align: left;">Attribut</th>
-                <th rowspan="2" colspan="2">Gradation</th>
-                <th rowspan="2" colspan="2">Flächenbindung</th>
-                <th rowspan="2">Preis</th>
-                <th colspan="2">Zu-/Abschläge</th>
-                <th rowspan="2">Betrag</th>
+                <th rowspan="2" style="text-align: left;">Lieferschein-Nr.</th>
+                <th rowspan="2" class="narrow">Pos.</th>
+                <th rowspan="2" style="text-align: left;">Sorte</th>
+                <th rowspan="2" style="text-align: left;">Attribut</th>
+                <th colspan="2">Gradation</th>
+                <th colspan="2">Flächenbindung</th>
+                <th>Preis</th>
+                <th class="narrow">Zu-/Abschläge</th>
+                <th>Betrag</th>
             </tr>
             <tr>
-                <th>Rel.</th>
-                <th>Abs.</th>
-            </tr>
-            <tr>
-                <th>[°Oe]</th>
-                <th>[°KMW]</th>
-                <th colspan="2">[kg]</th>
-                <th>[@Model.CurrencySymbol/kg]</th>
-                <th>[%]</th>
-                <th>[@Model.CurrencySymbol/kg]</th>
-                <th>[@Model.CurrencySymbol]</th>
+                <th class="unit">[°Oe]</th>
+                <th class="unit narrow">[°KMW]</th>
+                <th class="unit" colspan="2">[kg]</th>
+                <th class="unit">[@Model.CurrencySymbol/kg]</th>
+                <th class="unit">[@Model.CurrencySymbol]</th>
+                <th class="unit">[@Model.CurrencySymbol]</th>
             </tr>
         </thead>
         <tbody>
             @foreach (var p in Model.Data.Rows) {
                 var rows = Math.Max(p.Buckets.Length, p.Modifiers.Length + 1);
                 var first = true;
-                //var pmt = p.Payment;
-                var abs = 0; // pmt?.ModAbs == null || pmt?.ModAbs == 0 ? "-" : pmt?.ModAbs.ToString("0." + string.Concat(Enumerable.Repeat('0', Model.Precision)));
-                var rel = 0; // pmt?.ModRel == null || pmt?.ModRel == 0 ? "-" : $"{pmt?.ModRel * 100:0.00##}";
                 @for (int i = 0; i < rows; i++) {
-                    <tr class="@(first ? "first" : "") @(rows > i + 1 ? "trailing" : "")">
+                    <tr class="@(first ? "first" : "") @(rows > i + 1 ? "last" : "")">
                         @if (first) {
-                            <td rowspan="@rows" class="lsnr">@p.LsNr</td>
-                            <td rowspan="@rows" class="dpnr">@p.DPNr</td>
-                            <td class="variant small">@p.Variant</td>
-                            <td class="attribute small">@p.Attribute</td>
-                            <td rowspan="@rows" class="oe">@($"{p.Gradation.Oe:N0}")</td>
-                            <td rowspan="@rows" class="kmw">@($"{p.Gradation.Kmw:N1}")</td>
+                            <td rowspan="@rows">@p.LsNr</td>
+                            <td rowspan="@rows">@p.DPNr</td>
+                            <td class="small">@p.Variant</td>
+                            <td class="small">@p.Attribute</td>
+                            <td rowspan="@rows" class="center">@($"{p.Gradation.Oe:N0}")</td>
+                            <td rowspan="@rows" class="center">@($"{p.Gradation.Kmw:N1}")</td>
                         }
                         @if (i > 0 && i <= p.Modifiers.Length) {
-                            <td colspan="2" class="mod">@(p.Modifiers[i - 1])</td>
+                            <td colspan="2" class="small mod">@p.Modifiers[i - 1]</td>
                         } else if (i > 0) {
                             <td colspan="2"></td>
                         }
                         @if (i < p.Buckets.Length) {
                             var bucket = p.Buckets[i];
-                            <td class="geb small">@bucket.Name:</td>
-                            <td class="weight">@($"{bucket.Value:N0}")</td>
-                            <td class="price">@($"{bucket.Price:N4}")</td>
+                            <td class="small">@bucket.Name:</td>
+                            <td class="number">@($"{bucket.Value:N0}")</td>
+                            <td class="number">@($"{bucket.Price:N4}")</td>
                         } else {
                             <td colspan="3"></td>
                         }
-                        @if (first) {
-                            <td rowspan="@rows" class="rel">@rel</td>
-                            <td rowspan="@rows" class="abs">@abs</td>
-                            <!-- FIXME rel/abs mods -->
-                            <td rowspan="@rows" class="amount">@($"{p.Buckets.Sum(b => b.Amount):N2}")</td>
-                            first = false;
+                        @if (i == p.Buckets.Length - 1) {
+                            var totalMod = p.TotalModifiers ?? 0;
+                            <td class="number@(totalMod == 0 ? " center" : "")">@(totalMod == 0 ? "-" : Utils.GetSign(totalMod) + $"{Math.Abs(totalMod):N2}")</td>
+                            <td class="number">@($"{p.Amount:N2}")</td>
+                        } else {
+                            <td colspan="2"></td>
                         }
                     </tr>
+                    first = false;
                 }
             }
+            @if (Model.Payment == null) {
+            <tr class="sum">
+                <td colspan="7"></td>
+                <td colspan="2">Gesamt:</td>
+                <td colspan="2" class="number">@($"{Model.Data.Rows.Sum(p => p.Amount):N2}")</td>
+            </tr>
+            } else {
+            <tr class="sum">
+                <td colspan="7"></td>
+                <td colspan="2">Gesamt:</td>
+                <td colspan="2" class="number">@($"{Model.Payment.NetAmount:N2}")</td>
+            </tr>
+            }
         </tbody>
     </table>
 </main>
diff --git a/Elwig/Documents/CreditNote.css b/Elwig/Documents/CreditNote.css
index 47088b9..adc096b 100644
--- a/Elwig/Documents/CreditNote.css
+++ b/Elwig/Documents/CreditNote.css
@@ -1,6 +1,7 @@
 
-table.credit .amount.sum {
-    padding-bottom: 1mm;
+
+table.credit .mod {
+    padding-left: 5mm;
 }
 
 table.credit tbody tr:not(.first):not(.last) {
@@ -8,10 +9,18 @@ table.credit tbody tr:not(.first):not(.last) {
     break-after: avoid;
 }
 
-table.credit tbody tr.first td {
-    padding-top: 1mm;
+table.credit tr:not(.first) td {
+    padding-top: 0;
 }
 
-table.credit tbody tr.last td {
-    padding-bottom: 1mm;
+table.credit tr.last td {
+    padding-bottom: 0;
+}
+
+table.credit tr.sum {
+    font-size: 12pt;
+}
+
+table.credit tr.sum td {
+    padding-top: 1mm;
 }
diff --git a/Elwig/Documents/DeliveryConfirmation.cshtml b/Elwig/Documents/DeliveryConfirmation.cshtml
index 503b5a7..bdc724e 100644
--- a/Elwig/Documents/DeliveryConfirmation.cshtml
+++ b/Elwig/Documents/DeliveryConfirmation.cshtml
@@ -9,7 +9,7 @@
     <table class="delivery-confirmation">
         <colgroup>
             <col style="width: 25mm;"/>
-            <col style="width: 5mm;"/>
+            <col style="width:  5mm;"/>
             <col style="width: 20mm;"/>
             <col style="width: 21mm;"/>
             <col style="width: 19mm;"/>
@@ -35,7 +35,7 @@
             <tr>
                 <th class="unit">[°Oe]</th>
                 <th class="unit narrow">[°KMW]</th>
-                <th class="unit"colspan="2">[kg]</th>
+                <th class="unit" colspan="2">[kg]</th>
                 <th class="unit">[kg]</th>
                 <th class="unit">[kg]</th>
             </tr>
@@ -48,7 +48,7 @@
                 var rows = Math.Max(p.Buckets.Length, p.Modifiers.Length + 1);
                 var first = true;
                 @for (int i = 0; i < rows; i++) {
-                    <tr class="@(first ? "first" : "") @(p.Variant != lastVariant && lastVariant != "" ? "new": "") @(rows > i + 1 ? "trailing" : "")">
+                    <tr class="@(first ? "first" : "") @(p.Variant != lastVariant && lastVariant != "" ? "new": "") @(rows > i + 1 ? "last" : "")">
                         @if (first) {
                             <td rowspan="@rows">@p.LsNr</td>
                             <td rowspan="@rows">@p.DPNr</td>
diff --git a/Elwig/Documents/DeliveryConfirmation.css b/Elwig/Documents/DeliveryConfirmation.css
index eb356e3..23d074c 100644
--- a/Elwig/Documents/DeliveryConfirmation.css
+++ b/Elwig/Documents/DeliveryConfirmation.css
@@ -11,7 +11,7 @@ table.delivery-confirmation tr:not(.first) td {
     padding-top: 0;
 }
 
-table.delivery-confirmation tr.trailing td {
+table.delivery-confirmation tr.last td {
     padding-bottom: 0;
 }
 
diff --git a/Elwig/Helpers/AppDbUpdater.cs b/Elwig/Helpers/AppDbUpdater.cs
index 4d192db..42407b8 100644
--- a/Elwig/Helpers/AppDbUpdater.cs
+++ b/Elwig/Helpers/AppDbUpdater.cs
@@ -1,17 +1,16 @@
 using Microsoft.Data.Sqlite;
 using System;
-using System.Windows;
 
 namespace Elwig.Helpers {
     public static class AppDbUpdater {
 
-        public static readonly int RequiredSchemaVersion = 10;
+        public static readonly int RequiredSchemaVersion = 11;
 
         private static int _versionOffset = 0;
         private static readonly Action<SqliteConnection>[] _updaters = new[] {
             UpdateDbSchema_1_To_2, UpdateDbSchema_2_To_3, UpdateDbSchema_3_To_4, UpdateDbSchema_4_To_5,
             UpdateDbSchema_5_To_6, UpdateDBSchema_6_To_7, UpdateDbSchema_7_To_8, UpdateDbSchema_8_To_9,
-            UpdateDbSchema_9_To_10,
+            UpdateDbSchema_9_To_10, UpdateDbSchema_10_To_11
         };
 
         private static void ExecuteNonQuery(SqliteConnection cnx, string sql) {
@@ -47,8 +46,7 @@ namespace Elwig.Helpers {
 
             if (App.VersionMajor > major ||
                 (App.VersionMajor == major && App.VersionMinor > minor) ||
-                (App.VersionMajor == major && App.VersionMinor == minor && App.VersionPatch > patch))
-            {
+                (App.VersionMajor == major && App.VersionMinor == minor && App.VersionPatch > patch)) {
                 long vers = (App.VersionMajor << 24) | (App.VersionMinor << 16) | App.VersionPatch;
                 ExecuteNonQuery(cnx, $"PRAGMA user_version = {vers}");
             }
@@ -736,5 +734,71 @@ namespace Elwig.Helpers {
                 ORDER BY year, mgnr, bucket;
                 """);
         }
+
+        private static void UpdateDbSchema_10_To_11(SqliteConnection cnx) {
+            // Drop columns, if they exist...
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_1");
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_2");
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_3");
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_4");
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_5");
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_6");
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_7");
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_8");
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_delivery_part DROP COLUMN price_9");
+
+            ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_i");
+            ExecuteNonQuery(cnx, """
+                CREATE TRIGGER t_payment_delivery_part_i
+                    AFTER INSERT ON payment_delivery_part FOR EACH ROW
+                BEGIN
+                    INSERT INTO payment_member (year, avnr, mgnr, net_amount)
+                    SELECT year, NEW.avnr, mgnr, NEW.amount FROM delivery WHERE (year, did) = (NEW.year, NEW.did)
+                    ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount;
+                END;
+                """);
+
+            ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_u");
+            ExecuteNonQuery(cnx, """
+                CREATE TRIGGER t_payment_delivery_part_u
+                    AFTER UPDATE ON payment_delivery_part FOR EACH ROW
+                BEGIN
+                    UPDATE payment_member
+                    SET net_amount = net_amount - OLD.amount
+                    WHERE (year, avnr, mgnr) IN (SELECT year, OLD.avnr, mgnr FROM delivery WHERE (year, did) = (OLD.year, OLD.did));
+                    INSERT INTO payment_member (year, avnr, mgnr, net_amount)
+                    SELECT year, NEW.avnr, mgnr, NEW.amount FROM delivery WHERE (year, did) = (NEW.year, NEW.did)
+                    ON CONFLICT DO UPDATE SET net_amount = net_amount + excluded.net_amount;
+                END;
+                """);
+
+            ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_d");
+            ExecuteNonQuery(cnx, """
+                CREATE TRIGGER t_payment_delivery_part_d
+                    AFTER DELETE ON payment_delivery_part FOR EACH ROW
+                BEGIN
+                    UPDATE payment_member
+                    SET net_amount = net_amount - OLD.amount
+                    WHERE (year, avnr, mgnr) IN (SELECT year, OLD.avnr, mgnr FROM delivery WHERE (year, did) = (OLD.year, OLD.did));
+                END;
+                """);
+
+            ExecuteNonQuery(cnx, "DROP TRIGGER t_payment_delivery_part_bucket_u");
+            ExecuteNonQuery(cnx, """
+                CREATE TRIGGER t_payment_delivery_part_bucket_u
+                    AFTER UPDATE ON payment_delivery_part_bucket FOR EACH ROW
+                BEGIN
+                    UPDATE payment_delivery_part
+                    SET net_amount = net_amount - OLD.amount
+                    WHERE (year, did, dpnr, avnr) = (OLD.year, OLD.did, OLD.dpnr, OLD.avnr);
+                    UPDATE payment_delivery_part
+                    SET net_amount = net_amount + NEW.amount
+                    WHERE (year, did, dpnr, avnr) = (NEW.year, NEW.did, NEW.dpnr, NEW.avnr);
+                END;
+                """);
+
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_member DROP COLUMN amount");
+            ExecuteNonQuery(cnx, "ALTER TABLE payment_member ADD COLUMN amount INTEGER NOT NULL GENERATED ALWAYS AS (ROUND(net_amount * (1 + mod_rel) + mod_abs)) VIRTUAL");
+        }
     }
 }
diff --git a/Elwig/Helpers/Billing/BillingVariant.cs b/Elwig/Helpers/Billing/BillingVariant.cs
index 6a0b477..cf0beac 100644
--- a/Elwig/Helpers/Billing/BillingVariant.cs
+++ b/Elwig/Helpers/Billing/BillingVariant.cs
@@ -11,6 +11,12 @@ namespace Elwig.Helpers.Billing {
             AvNr = avnr;
         }
 
+        public async Task Calculate() {
+            await DeleteInDb();
+            await CalculatePrices();
+            await CalculateModifiers();
+        }
+
         protected async Task DeleteInDb() {
             using var cnx = await AppDbContext.ConnectAsync();
             using (var cmd = cnx.CreateCommand()) {
@@ -27,8 +33,7 @@ namespace Elwig.Helpers.Billing {
             }
         }
 
-        public async Task CalculatePrices() {
-            await DeleteInDb();
+        protected async Task CalculatePrices() {
             using var cnx = await AppDbContext.ConnectAsync();
 
             var parts = new List<(int Year, int DId, int DPNr, int BktNr, string SortId, string Discr, int Value, bool MinQuw, double Oe, double Kmw)>();
@@ -65,5 +70,20 @@ namespace Elwig.Helpers.Billing {
                 await cmd.ExecuteNonQueryAsync();
             }
         }
+
+        protected async Task CalculateModifiers() {
+            using var cnx = await AppDbContext.ConnectAsync();
+            using var cmd = cnx.CreateCommand();
+            cmd.CommandText = $"""
+                INSERT INTO payment_delivery_part (year, did, dpnr, avnr, net_amount, mod_abs, mod_rel)
+                SELECT d.year, d.did, d.dpnr, {AvNr}, 0, COALESCE(m.abs, 0), COALESCE(m.rel, 0)
+                FROM delivery_part d
+                    LEFT JOIN delivery_part_modifier p ON (p.year, p.did, p.dpnr) = (d.year, d.did, d.dpnr)
+                    LEFT JOIN modifier m ON m.modid = p.modid
+                WHERE d.year = {Year}
+                ON CONFLICT DO UPDATE SET mod_abs = mod_abs + excluded.mod_abs, mod_rel = mod_rel + excluded.mod_rel;
+                """;
+            await cmd.ExecuteNonQueryAsync();
+        }
     }
 }
diff --git a/Elwig/Models/Dtos/CreditNoteData.cs b/Elwig/Models/Dtos/CreditNoteData.cs
index addff16..09a88d2 100644
--- a/Elwig/Models/Dtos/CreditNoteData.cs
+++ b/Elwig/Models/Dtos/CreditNoteData.cs
@@ -1,4 +1,5 @@
 using Elwig.Helpers;
+using Elwig.Helpers.Billing;
 using Elwig.Models.Entities;
 using Microsoft.EntityFrameworkCore;
 using System;
@@ -27,11 +28,11 @@ namespace Elwig.Models.Dtos {
             MgNr = mgnr;
         }
 
-        public static async Task<IDictionary<int, CreditNoteData>> ForPaymentVariant(DbSet<CreditNoteRowSingle> table, int year, int avnr) {
+        public static async Task<IDictionary<int, CreditNoteData>> ForPaymentVariant(DbSet<CreditNoteRowSingle> table, DbSet<Season> seasons, int year, int avnr) {
             return (await FromDbSet(table, year, avnr))
                 .GroupBy(
                     r => new { r.Year, r.AvNr, r.MgNr, r.TgNr, r.DId, r.DPNr },
-                    (k, g) => new CreditNoteRow(g))
+                    (k, g) => new CreditNoteRow(g, seasons))
                 .GroupBy(
                     r => new { r.Year, r.AvNr, r.MgNr, r.TgNr },
                     (k, g) => new CreditNoteData(g, k.Year, k.TgNr, mgnr: k.MgNr))
@@ -43,17 +44,20 @@ namespace Elwig.Models.Dtos {
             var v = avnr?.ToString() ?? "NULL";
             var m = mgnr?.ToString() ?? "NULL";
             return await table.FromSqlRaw($"""
-                SELECT d.year, c.tgnr, p.avnr, d.mgnr, d.did, d.lsnr, d.dpnr, b.bktnr, d.sortid, b.discr, b.value, p.price, p.amount,
-                       v.name AS variant, a.name AS attribute, q.name AS quality_level, d.oe, d.kmw
+                SELECT d.year, c.tgnr, v.avnr, d.mgnr, d.did, d.lsnr, d.dpnr, d.weight, d.modifiers,
+                       b.bktnr, d.sortid, b.discr, b.value, pb.price, pb.amount, p.net_amount, p.amount AS total_amount,
+                       s.name AS variant, a.name AS attribute, q.name AS quality_level, d.oe, d.kmw
                 FROM v_delivery d
-                    JOIN wine_variety v ON d.sortid = v.sortid
+                    JOIN wine_variety s ON s.sortid = d.sortid
                     LEFT JOIN wine_attribute a ON a.attrid = d.attrid
                     JOIN wine_quality_level q ON q.qualid = d.qualid
                     LEFT JOIN delivery_part_bucket b ON (b.year, b.did, b.dpnr) = (d.year, d.did, d.dpnr)
-                    LEFT JOIN payment_delivery_part_bucket p ON (p.year, p.did, p.dpnr, p.bktnr) = (b.year, b.did, b.dpnr, b.bktnr)
-                    LEFT JOIN credit c ON (c.year, c.avnr, c.mgnr) = (d.year, p.avnr, d.mgnr)
-                WHERE b.value > 0 AND (d.year = {y} OR {y} IS NULL) AND (p.avnr = {v} OR {v} IS NULL OR p.avnr IS NULL) AND (d.mgnr = {m} OR {m} IS NULL)
-                ORDER BY d.year, p.avnr, d.mgnr, d.lsnr, d.dpnr
+                    LEFT JOIN payment_variant v ON v.year = d.year
+                    LEFT JOIN payment_delivery_part p ON (p.year, p.did, p.dpnr, p.avnr) = (d.year, d.did, d.dpnr, v.avnr)
+                    LEFT JOIN payment_delivery_part_bucket pb ON (pb.year, pb.did, pb.dpnr, pb.bktnr) = (b.year, b.did, b.dpnr, b.bktnr)
+                    LEFT JOIN credit c ON (c.year, c.avnr, c.mgnr) = (d.year, v.avnr, d.mgnr)
+                WHERE b.value > 0 AND (d.year = {y} OR {y} IS NULL) AND (v.avnr = {v} OR {v} IS NULL) AND (d.mgnr = {m} OR {m} IS NULL)
+                ORDER BY d.year, v.avnr, d.mgnr, d.lsnr, d.dpnr
                 """).ToListAsync();
         }
     }
@@ -73,28 +77,38 @@ namespace Elwig.Models.Dtos {
         public string QualityLevel;
         public (double Oe, double Kmw) Gradation;
         public (string Name, int Value, decimal? Price, decimal? Amount)[] Buckets;
+        public decimal? TotalModifiers;
+        public decimal? Amount;
 
-        public CreditNoteRow(IEnumerable<CreditNoteRowSingle> rows) {
+        public CreditNoteRow(IEnumerable<CreditNoteRowSingle> rows, DbSet<Season> seasons) {
             var f = rows.First();
             Year = f.Year;
             TgNr = f.TgNr;
             MgNr = f.MgNr;
+            var season = seasons.Find(Year);
 
             LsNr = f.LsNr;
             DPNr = f.DPNr;
             Variant = f.Variant;
             Attribute = f.Attribute;
-            Modifiers = Array.Empty<string>();  // TODO
+            var modifiers = (IEnumerable<Modifier>)(f.Modifiers ?? "").Split(',')
+                .Select(m => season?.Modifiers.FirstOrDefault(s => s.ModId == m))
+                .Where(m => m != null)
+                .OrderBy(m => m.Ordering)
+                .ToList();
+            Modifiers = modifiers.Select(m => m.Name).ToArray();
             QualityLevel = f.QualityLevel;
             Gradation = (f.Oe, f.Kmw);
             Buckets = rows
                 .Where(b => b.Value > 0)
                 .OrderByDescending(b => b.BktNr)
-                // FIXME precision
                 .Select(b => (b.Discr == "_" ? "ungeb." : $"geb. {f.SortId}{b.Discr}", b.Value,
-                              b.Price != null ? (decimal?)Utils.DecFromDb((long)b.Price, 4) : null,
-                              b.Amount != null ? (decimal?)Utils.DecFromDb((long)b.Amount, 4) : null))
+                              b.Price != null ? season?.DecFromDb((long)b.Price) : null,
+                              b.Amount != null ? season?.DecFromDb((long)b.Amount) : null))
                 .ToArray();
+            Amount = f.TotalAmount != null ? season?.DecFromDb((long)f.TotalAmount) : null;
+            var netAmount = f.NetAmount != null ? season?.DecFromDb((long)f.NetAmount) : null;
+            TotalModifiers = Amount - netAmount;
         }
     }
 
@@ -114,6 +128,10 @@ namespace Elwig.Models.Dtos {
         public string LsNr { get; set; }
         [Column("dpnr")]
         public int DPNr { get; set; }
+        [Column("weight")]
+        public int Weight { get; set; }
+        [Column("modifiers")]
+        public string? Modifiers { get; set; }
         [Column("bktnr")]
         public int BktNr { get; set; }
         [Column("sortid")]
@@ -126,6 +144,10 @@ namespace Elwig.Models.Dtos {
         public long? Price { get; set; }
         [Column("amount")]
         public long? Amount { get; set; }
+        [Column("net_amount")]
+        public long? NetAmount { get; set; }
+        [Column("total_amount")]
+        public long? TotalAmount { get; set; }
         [Column("variant")]
         public string Variant { get; set; }
         [Column("attribute")]
diff --git a/Elwig/Models/Entities/PaymentMember.cs b/Elwig/Models/Entities/PaymentMember.cs
index 063cc86..3bda987 100644
--- a/Elwig/Models/Entities/PaymentMember.cs
+++ b/Elwig/Models/Entities/PaymentMember.cs
@@ -13,9 +13,33 @@ namespace Elwig.Models.Entities {
         [Column("mgnr")]
         public int MgNr { get; set; }
 
+
+        [Column("net_amount")]
+        public long NetAmountValue { get; set; }
+        [NotMapped]
+        public decimal NetAmount {
+            get => Variant.Season.DecFromDb(NetAmountValue);
+            set => NetAmountValue = Variant.Season.DecToDb(value);
+        }
+
+        [Column("mod_abs")]
+        public long ModAbsValue { get; set; }
+        [NotMapped]
+        public decimal ModAbs {
+            get => Variant.Season.DecFromDb(ModAbsValue);
+            set => ModAbsValue = Variant.Season.DecToDb(value);
+        }
+
+        [Column("mod_rel")]
+        public double ModRelValue { get; set; }
+        [NotMapped]
+        public decimal ModRel {
+            get => (decimal)ModRelValue;
+            set => ModRelValue = (double)value;
+        }
+
         [Column("amount")]
         public long AmountValue { get; set; }
-
         [NotMapped]
         public decimal Amount {
             get => Variant.Season.DecFromDb(AmountValue);
diff --git a/Elwig/Windows/PaymentVariantsWindow.xaml.cs b/Elwig/Windows/PaymentVariantsWindow.xaml.cs
index ee48187..94e8abb 100644
--- a/Elwig/Windows/PaymentVariantsWindow.xaml.cs
+++ b/Elwig/Windows/PaymentVariantsWindow.xaml.cs
@@ -75,7 +75,7 @@ namespace Elwig.Windows {
             CalculateButton.IsEnabled = false;
             Mouse.OverrideCursor = Cursors.AppStarting;
             var b = new BillingVariant(v.Year, v.AvNr);
-            await b.CalculatePrices();
+            await b.Calculate();
             Mouse.OverrideCursor = null;
             CalculateButton.IsEnabled = true;
         }
@@ -110,7 +110,7 @@ namespace Elwig.Windows {
             members = members.OrderBy(m => m.MgNr);
 
             IEnumerable<Member> list = await members.ToListAsync();
-            var data = await CreditNoteData.ForPaymentVariant(Context.CreditNoteRows, v.Year, v.AvNr);
+            var data = await CreditNoteData.ForPaymentVariant(Context.CreditNoteRows, Context.Seasons, v.Year, v.AvNr);
             var payments = await Context.MemberPayments.Where(p => p.Year == v.Year && p.AvNr == v.AvNr).ToDictionaryAsync(c => c.MgNr);
             using var doc = Document.Merge(list.Select(m =>
                 new CreditNote(Context, payments[m.MgNr], data[m.MgNr])