diff --git a/datastore/migrations.go b/datastore/migrations.go
index 85ea48a75bef4c13c3bcb994b422a91a2617aec4..aff787e117983989d4a0be5bc6ef30616b0e232e 100644
--- a/datastore/migrations.go
+++ b/datastore/migrations.go
@@ -44,7 +44,7 @@ INSERT INTO sequence (seq) VALUES (0);
 `, `
 CREATE TABLE active_sessions (
   peer_public_key SMALLTEXT,
-  begin_timestamp DATETIME
+  begin_timestamp DATETIME,
   end_timestamp DATETIME,
   last_handshake DATETIME,
   active BOOL,
@@ -67,5 +67,18 @@ CREATE TABLE tokens (
   secret TEXT NOT NULL,
   roles TEXT
 )
+`),
+	sqlite.Statement(`
+ALTER TABLE active_sessions ADD COLUMN src_as_num SMALLTEXT
+`, `
+ALTER TABLE active_sessions ADD COLUMN src_as_org SMALLTEXT
+`, `
+ALTER TABLE active_sessions DROP COLUMN src_as
+`, `
+ALTER TABLE sessions ADD COLUMN src_as_num SMALLTEXT
+`, `
+ALTER TABLE sessions ADD COLUMN src_as_org SMALLTEXT
+`, `
+ALTER TABLE sessions DROP COLUMN src_as
 `),
 }
diff --git a/datastore/sessions/sessions_test.go b/datastore/sessions/sessions_test.go
index 02524b50a7946be75605c2697fb82ebe88995127..fab4c7787fc437bca5d9bc702ead6d146428b353 100644
--- a/datastore/sessions/sessions_test.go
+++ b/datastore/sessions/sessions_test.go
@@ -72,3 +72,35 @@ func TestSessionFinder(t *testing.T) {
 		t.Fatalf("there are %d active sessions, expected 0", n)
 	}
 }
+
+func TestSessionDumper(t *testing.T) {
+	dir, err := os.MkdirTemp("", "")
+	if err != nil {
+		t.Fatal(err)
+	}
+	db, err := sqlite.OpenDB(dir+"/sf.sql", datastore.Migrations)
+	if err != nil {
+		t.Fatal(err)
+	}
+	defer db.Close()
+
+	sf, _ := NewSessionFinder(db)
+
+	t0 := time.Now()
+	processStats(t, sf, []testData{
+		{
+			PeerStats: gateway.PeerStats{
+				PublicKey:         "pk1",
+				LastHandshakeTime: t0,
+			},
+			t: t0,
+		},
+	})
+
+	err = WithTx(db, func(tx Tx) error {
+		return tx.DumpActiveSessions(sf.ActiveSessions())
+	})
+	if err != nil {
+		t.Fatalf("DumpActiveSessions: %v", err)
+	}
+}