Index: src/services/ArchiveImportService.js
===================================================================
--- src/services/ArchiveImportService.js	(revision e9ec5e4db7a301dfef1e2b514c04b6f0c6d35459)
+++ src/services/ArchiveImportService.js	(revision fbfd7a199340cd773cd153df2388d88f2084eea2)
@@ -26,4 +26,5 @@
 import { MEDIA_ROOT } from '../config/paths.js';
 import { FORMAT_VERSION, parseFollowingCsv } from './ArchiveExportService.js';
+import * as Migration from './MigrationService.js';
 
 const sha256 = (buf) => crypto.createHash('sha256').update(buf).digest('hex');
@@ -255,5 +256,5 @@
     }
 
-    schrijf.push({ soort: 'post', id: nieuwId, oudId, obj: o });
+    schrijf.push({ soort: 'post', id: nieuwId, oudId, obj: o, oudeUri: o.id || null });
     rapport.posts += 1;
   }
@@ -360,4 +361,24 @@
       }
     }
+
+    // FEP-1580: een import uit een export is GEEN apart geval. De spec zegt
+    // met zoveel woorden dat objecten uit een geëxporteerde collectie net zo
+    // behandeld moeten worden als objecten die van de bron zijn opgehaald.
+    // Dus vult ook deze weg de vertaaltabel, en werkt de reactie van een derde
+    // op een verhuisd bericht straks net zo goed bij als bij een live ingest.
+    //
+    // Alleen zinnig als de ids VERANDERD zijn: bleven ze gelijk, dan wijst de
+    // oude URI al naar het goede object en valt er niets te vertalen.
+    if (!idsBehouden && eigenOrigin) {
+      for (const s of schrijf) {
+        if (s.soort !== 'post' || !s.oudeUri) continue;
+        Migration.recordMigrated(site.slug, {
+          origin: s.oudeUri,
+          target: `${eigenOrigin}/ap/notes/${encodeURIComponent(s.id)}`,
+          sourceActor: manifest.actor || '',
+          isPublic: !(s.obj && (s.obj['shaer:fanOnly'] || s.obj['shaer:apVisibility'] === 'direct')),
+        });
+      }
+    }
   })();
 
