From d143f9f83b9fb7094957069e2003d5cd58d5b8b6 Mon Sep 17 00:00:00 2001
From: Lukas Vogel <lukedirtwalker@gmail.com>
Date: Fri, 20 Sep 2019 16:26:05 +0200
Subject: [PATCH 1/4] Use serrors.New instead of common.NewBasicError

for simple errors without additional wrapping/context.

This PR was generated by replacing `common.NewBasicError\(("[^"]+"), nil\)`
with `serrors.New($1)` and running goimports afterwards.
---
 go/beacon_srv/internal/beacon/store.go        |  3 ++-
 go/beacon_srv/internal/beaconing/extender.go  |  9 +++++----
 .../internal/beaconing/extender_config.go     |  8 ++++----
 go/beacon_srv/internal/beaconing/handler.go   |  3 ++-
 .../internal/beaconing/handler_test.go        |  5 +++--
 .../internal/beaconing/originator.go          |  3 ++-
 .../internal/beaconstorage/config.go          |  3 ++-
 go/beacon_srv/internal/config/config.go       | 19 ++++++++++---------
 go/beacon_srv/internal/ifstate/ifstate.go     |  3 ++-
 .../internal/ifstate/mock_ifstate/ifstate.go  |  3 ++-
 go/beacon_srv/main.go                         |  3 ++-
 go/border/main.go                             |  3 ++-
 go/border/rpkt/extns.go                       |  3 ++-
 go/border/rpkt/path.go                        |  7 ++++---
 go/border/rpkt/route.go                       |  3 ++-
 go/cert_srv/internal/config/config.go         | 10 +++++-----
 go/cert_srv/internal/reiss/corepush_test.go   |  3 ++-
 go/cert_srv/internal/reiss/handler.go         |  9 +++++----
 go/cert_srv/setup.go                          |  3 ++-
 go/examples/discovery_client/client.go        |  5 +++--
 go/godispatcher/internal/config/config.go     | 10 +++++-----
 .../internal/registration/scmp_table.go       |  3 ++-
 go/godispatcher/internal/respool/packet.go    |  3 ++-
 go/godispatcher/main.go                       |  3 ++-
 go/godispatcher/network/scmp.go               |  5 +++--
 go/integration/cert_req/main.go               |  5 +++--
 go/integration/end2end/main.go                |  3 ++-
 go/lib/ctrl/seg/seg.go                        |  5 +++--
 go/lib/discovery/discovery.go                 |  3 ++-
 go/lib/discovery/discoverypool/pool.go        |  5 +++--
 go/lib/discovery/topofetcher/fetcher.go       |  3 ++-
 go/lib/env/env.go                             |  5 +++--
 go/lib/healthpool/pool.go                     |  3 ++-
 go/lib/hpkt/write.go                          |  3 ++-
 go/lib/infra/disp/common_test.go              |  3 ++-
 go/lib/infra/disp/wtable.go                   |  9 +++++----
 go/lib/infra/messenger/addr.go                |  7 ++++---
 .../infra/messenger/quic_response_writer.go   |  4 ++--
 go/lib/infra/modules/db/sqlite.go             |  3 ++-
 go/lib/infra/modules/idiscovery/config.go     |  7 ++++---
 go/lib/infra/modules/idiscovery/idiscovery.go |  5 +++--
 go/lib/infra/modules/itopo/itopo.go           |  7 ++++---
 go/lib/infra/modules/itopo/validate.go        |  3 ++-
 .../modules/seghandler/seghandler_test.go     | 14 +++++++-------
 go/lib/infra/modules/trust/signhelper.go      |  3 ++-
 go/lib/infra/modules/trust/trust.go           |  4 ++--
 go/lib/infra/modules/trust/trust_test.go      | 10 +++++-----
 .../modules/trust/trustdb/trustdbsqlite/db.go |  7 ++++---
 go/lib/infra/rpc/rpc.go                       |  4 ++--
 go/lib/layers/extensions_layer.go             |  3 ++-
 go/lib/log/flags.go                           |  4 ++--
 go/lib/overlay/addr.go                        |  3 ++-
 go/lib/overlay/conn/conn.go                   |  3 ++-
 go/lib/pathdb/sqlite/sqlite.go                | 13 +++++++------
 go/lib/pathpol/hop_pred.go                    |  3 ++-
 go/lib/pathstorage/pathstorage.go             |  9 +++++----
 go/lib/pktcls/json.go                         |  5 +++--
 go/lib/revcache/util_test.go                  |  7 ++++---
 go/lib/sciond/pathprobe/paths.go              |  3 ++-
 go/lib/scmp/info.go                           |  3 ++-
 go/lib/scmp/info_traceroute.go                |  3 ++-
 go/lib/scrypto/asym.go                        |  3 ++-
 go/lib/snet/conn.go                           | 10 +++++-----
 go/lib/snet/reader.go                         |  3 ++-
 go/lib/snet/router.go                         |  3 ++-
 go/lib/snet/snet.go                           | 13 +++++++------
 go/lib/snet/squic/squic.go                    |  3 ++-
 go/lib/sock/reliable/reconnect/main_test.go   |  6 +++---
 .../sock/reliable/reconnect/network_test.go   |  4 ++--
 go/lib/sock/reliable/reliable.go              |  5 +++--
 go/lib/spath/path.go                          |  9 +++++----
 go/lib/svc/svc_test.go                        |  3 ++-
 go/lib/topology/topology.go                   |  7 ++++---
 go/lib/truststorage/truststorage.go           |  3 ++-
 go/path_srv/internal/config/config.go         |  4 ++--
 go/path_srv/internal/handlers/common_test.go  |  3 ++-
 go/path_srv/internal/segreq/provider.go       |  3 ++-
 go/path_srv/internal/segsyncer/segsyncer.go   |  3 ++-
 go/proto/cert_mgmt.capnp.go                   |  1 +
 go/proto/ctrl_pld.capnp.go                    |  1 +
 go/proto/drkey_mgmt.capnp.go                  |  1 +
 go/proto/path_mgmt.capnp.go                   |  1 +
 go/proto/sciond.capnp.go                      |  1 +
 go/proto/sig.capnp.go                         |  1 +
 go/proto/structs.gen.go                       |  3 +--
 go/sciond/internal/config/config.go           |  9 +++++----
 go/sciond/internal/fetcher/fetcher.go         |  3 ++-
 go/sciond/internal/servers/handlers.go        |  4 ++--
 go/sciond/internal/servers/server.go          |  5 +++--
 go/sig/internal/sigconfig/conf.go             | 12 ++++++------
 go/sig/main.go                                |  5 +++--
 go/tools/scion-pki/internal/conf/isd.go       |  3 ++-
 go/tools/scion-pki/internal/keys/gen.go       |  3 ++-
 go/tools/scion-pki/internal/v2/conf/isd.go    |  7 ++++---
 go/tools/scion-pki/internal/v2/keys/gen.go    |  3 ++-
 go/tools/scion-pki/internal/v2/trcs/sign.go   |  3 ++-
 go/tools/scmp/cmn/common.go                   |  7 ++++---
 97 files changed, 277 insertions(+), 197 deletions(-)

diff --git a/go/beacon_srv/internal/beacon/store.go b/go/beacon_srv/internal/beacon/store.go
index ec9cd8e1b4..0f1f4aacc5 100644
--- a/go/beacon_srv/internal/beacon/store.go
+++ b/go/beacon_srv/internal/beacon/store.go
@@ -23,6 +23,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/ctrl/path_mgmt"
 	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/spath"
 	"github.com/scionproto/scion/go/proto"
 )
@@ -273,7 +274,7 @@ func (s *baseStore) DeleteExpiredRevocations(ctx context.Context) (int, error) {
 // UpdatePolicy updates the policy. Beacons that are filtered by all
 // policies after the update are removed.
 func (s *baseStore) UpdatePolicy(ctx context.Context, policy Policy) error {
-	return common.NewBasicError("policy update not supported", nil)
+	return serrors.New("policy update not supported")
 }
 
 // Close closes the store and the underlying database connection.
diff --git a/go/beacon_srv/internal/beaconing/extender.go b/go/beacon_srv/internal/beaconing/extender.go
index 25763c1b53..1310725462 100644
--- a/go/beacon_srv/internal/beaconing/extender.go
+++ b/go/beacon_srv/internal/beaconing/extender.go
@@ -23,6 +23,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/ctrl/seg"
 	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/spath"
 	"github.com/scionproto/scion/go/lib/util"
 )
@@ -49,7 +50,7 @@ func (s *segExtender) extend(pseg *seg.PathSegment, inIfid, egIfid common.IFIDTy
 	peers []common.IFIDType) error {
 
 	if inIfid == 0 && egIfid == 0 {
-		return common.NewBasicError("Ingress and egress must not be both 0", nil)
+		return serrors.New("Ingress and egress must not be both 0")
 	}
 	infoF, err := pseg.InfoF()
 	if err != nil {
@@ -135,15 +136,15 @@ func (s *segExtender) remoteInfo(ifid common.IFIDType) (
 	}
 	intf := s.cfg.Intfs.Get(ifid)
 	if intf == nil {
-		return 0, 0, 0, common.NewBasicError("Interface not found", nil)
+		return 0, 0, 0, serrors.New("Interface not found")
 	}
 	state := intf.State()
 	if state != ifstate.Active {
-		return 0, 0, 0, common.NewBasicError("Interface is not active", nil)
+		return 0, 0, 0, serrors.New("Interface is not active")
 	}
 	topoInfo := intf.TopoInfo()
 	if topoInfo.RemoteIFID == 0 {
-		return 0, 0, 0, common.NewBasicError("Remote ifid is not set", nil)
+		return 0, 0, 0, serrors.New("Remote ifid is not set")
 	}
 	if topoInfo.ISD_AS.IsWildcard() {
 		return 0, 0, 0, common.NewBasicError("Remote IA is wildcard", nil, "ia", topoInfo.ISD_AS)
diff --git a/go/beacon_srv/internal/beaconing/extender_config.go b/go/beacon_srv/internal/beaconing/extender_config.go
index d7b669b3d2..797d2091ca 100644
--- a/go/beacon_srv/internal/beaconing/extender_config.go
+++ b/go/beacon_srv/internal/beaconing/extender_config.go
@@ -18,8 +18,8 @@ import (
 	"hash"
 
 	"github.com/scionproto/scion/go/beacon_srv/internal/ifstate"
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/infra"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/spath"
 )
 
@@ -56,13 +56,13 @@ func (cfg *ExtenderConf) InitDefaults() {
 // Validate checks that the config contains a signer.
 func (cfg *ExtenderConf) Validate() error {
 	if cfg.Signer == nil {
-		return common.NewBasicError("Signer must be set", nil)
+		return serrors.New("Signer must be set")
 	}
 	if cfg.IfidSize == 0 {
-		return common.NewBasicError("IfidSize must be set", nil)
+		return serrors.New("IfidSize must be set")
 	}
 	if cfg.MTU == 0 {
-		return common.NewBasicError("MTU must be set", nil)
+		return serrors.New("MTU must be set")
 	}
 	return nil
 }
diff --git a/go/beacon_srv/internal/beaconing/handler.go b/go/beacon_srv/internal/beaconing/handler.go
index c36fad94d6..6df55a53b2 100644
--- a/go/beacon_srv/internal/beaconing/handler.go
+++ b/go/beacon_srv/internal/beaconing/handler.go
@@ -27,6 +27,7 @@ import (
 	"github.com/scionproto/scion/go/lib/infra/messenger"
 	"github.com/scionproto/scion/go/lib/infra/modules/segverifier"
 	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/proto"
 )
@@ -76,7 +77,7 @@ func (h *handler) Handle() *infra.HandlerResult {
 func (h *handler) handle(logger log.Logger) (*infra.HandlerResult, error) {
 	rw, ok := infra.ResponseWriterFromContext(h.request.Context())
 	if !ok {
-		return infra.MetricsErrInternal, common.NewBasicError("No Messenger found", nil)
+		return infra.MetricsErrInternal, serrors.New("No Messenger found")
 	}
 
 	sendAck := messenger.SendAckHelper(h.request.Context(), rw)
diff --git a/go/beacon_srv/internal/beaconing/handler_test.go b/go/beacon_srv/internal/beaconing/handler_test.go
index 25b9abef2c..843f2a97e8 100644
--- a/go/beacon_srv/internal/beaconing/handler_test.go
+++ b/go/beacon_srv/internal/beaconing/handler_test.go
@@ -32,6 +32,7 @@ import (
 	"github.com/scionproto/scion/go/lib/infra"
 	"github.com/scionproto/scion/go/lib/infra/mock_infra"
 	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/spath"
 	"github.com/scionproto/scion/go/lib/topology"
@@ -166,7 +167,7 @@ func TestNewHandler(t *testing.T) {
 		verifier.EXPECT().WithSrc(gomock.Any()).Return(verifier)
 		verifier.EXPECT().WithServer(gomock.Any()).Return(verifier)
 		verifier.EXPECT().Verify(gomock.Any(), gomock.Any(),
-			gomock.Any()).MaxTimes(2).Return(common.NewBasicError("failed", nil))
+						gomock.Any()).MaxTimes(2).Return(serrors.New("failed"))
 
 		handler := NewHandler(localIA, intfs, inserter, verifier)
 		pseg := testBeacon(g, []common.IFIDType{graph.If_220_X_120_B, graph.If_120_A_110_X}).Segment
@@ -177,7 +178,7 @@ func TestNewHandler(t *testing.T) {
 		inserter := mock_beaconing.NewMockBeaconInserter(mctrl)
 		inserter.EXPECT().PreFilter(gomock.Any()).Return(nil)
 		inserter.EXPECT().InsertBeacon(gomock.Any(),
-			gomock.Any()).Return(beacon.InsertStats{}, common.NewBasicError("failed", nil))
+						gomock.Any()).Return(beacon.InsertStats{}, serrors.New("failed"))
 
 		verifier := mock_infra.NewMockVerifier(mctrl)
 		verifier.EXPECT().WithServer(gomock.Any()).MaxTimes(2).Return(verifier)
diff --git a/go/beacon_srv/internal/beaconing/originator.go b/go/beacon_srv/internal/beaconing/originator.go
index a1a84d4396..fc7f2add85 100644
--- a/go/beacon_srv/internal/beaconing/originator.go
+++ b/go/beacon_srv/internal/beaconing/originator.go
@@ -25,6 +25,7 @@ import (
 	"github.com/scionproto/scion/go/lib/ctrl/seg"
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/periodic"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/spath"
 	"github.com/scionproto/scion/go/lib/util"
 	"github.com/scionproto/scion/go/proto"
@@ -164,7 +165,7 @@ func (o *beaconOriginator) originateBeacon(ctx context.Context) error {
 	intf := o.cfg.Intfs.Get(o.ifId)
 	if intf == nil {
 		o.metrics.IncInternalErr()
-		return common.NewBasicError("Interface does not exist", nil)
+		return serrors.New("Interface does not exist")
 	}
 	topoInfo := intf.TopoInfo()
 	ov := topoInfo.InternalAddrs.PublicOverlay(topoInfo.InternalAddrs.Overlay)
diff --git a/go/beacon_srv/internal/beaconstorage/config.go b/go/beacon_srv/internal/beaconstorage/config.go
index b4d471bc86..898e3f03e8 100644
--- a/go/beacon_srv/internal/beaconstorage/config.go
+++ b/go/beacon_srv/internal/beaconstorage/config.go
@@ -28,6 +28,7 @@ import (
 	"github.com/scionproto/scion/go/lib/config"
 	"github.com/scionproto/scion/go/lib/infra/modules/db"
 	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 )
 
@@ -102,7 +103,7 @@ func (cfg *BeaconDBConf) validateBackend() error {
 	case BackendSqlite:
 		return nil
 	case backendNone:
-		return common.NewBasicError("No backend set", nil)
+		return serrors.New("No backend set")
 	}
 	return common.NewBasicError("Unsupported backend", nil, "backend", cfg.Backend())
 }
diff --git a/go/beacon_srv/internal/config/config.go b/go/beacon_srv/internal/config/config.go
index d9ce321d81..8da6684782 100644
--- a/go/beacon_srv/internal/config/config.go
+++ b/go/beacon_srv/internal/config/config.go
@@ -25,6 +25,7 @@ import (
 	"github.com/scionproto/scion/go/lib/ctrl/path_mgmt"
 	"github.com/scionproto/scion/go/lib/env"
 	"github.com/scionproto/scion/go/lib/infra/modules/idiscovery"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/truststorage"
 	"github.com/scionproto/scion/go/lib/util"
 )
@@ -162,35 +163,35 @@ func (cfg *BSConfig) InitDefaults() {
 // Validate validates that all durations are set.
 func (cfg *BSConfig) Validate() error {
 	if cfg.KeepaliveInterval.Duration == 0 {
-		return common.NewBasicError("KeepaliveInterval not set", nil)
+		return serrors.New("KeepaliveInterval not set")
 	}
 	if cfg.KeepaliveTimeout.Duration == 0 {
-		return common.NewBasicError("KeepaliveTimeout not set", nil)
+		return serrors.New("KeepaliveTimeout not set")
 	}
 	if cfg.OriginationInterval.Duration == 0 {
-		return common.NewBasicError("OriginationInterval not set", nil)
+		return serrors.New("OriginationInterval not set")
 	}
 	if cfg.PropagationInterval.Duration == 0 {
-		return common.NewBasicError("PropagationInterval not set", nil)
+		return serrors.New("PropagationInterval not set")
 	}
 	if cfg.RegistrationInterval.Duration == 0 {
-		return common.NewBasicError("RegistrationInterval not set", nil)
+		return serrors.New("RegistrationInterval not set")
 	}
 	if cfg.ExpiredCheckInterval.Duration == 0 {
-		return common.NewBasicError("ExpiredCheckInterval not set", nil)
+		return serrors.New("ExpiredCheckInterval not set")
 	}
 	if cfg.RevTTL.Duration == 0 {
-		return common.NewBasicError("RevTTL is not set", nil)
+		return serrors.New("RevTTL is not set")
 	}
 	if cfg.RevTTL.Duration < path_mgmt.MinRevTTL {
 		return common.NewBasicError("RevTTL must be equal or greater than MinRevTTL", nil,
 			"MinRevTTL", path_mgmt.MinRevTTL)
 	}
 	if cfg.RevOverlap.Duration == 0 {
-		return common.NewBasicError("RevOverlap not set", nil)
+		return serrors.New("RevOverlap not set")
 	}
 	if cfg.RevOverlap.Duration > cfg.RevTTL.Duration {
-		return common.NewBasicError("RevOverlap cannot be greater than RevTTL", nil)
+		return serrors.New("RevOverlap cannot be greater than RevTTL")
 	}
 	return nil
 }
diff --git a/go/beacon_srv/internal/ifstate/ifstate.go b/go/beacon_srv/internal/ifstate/ifstate.go
index a8d21b3c08..f6e25ee379 100644
--- a/go/beacon_srv/internal/ifstate/ifstate.go
+++ b/go/beacon_srv/internal/ifstate/ifstate.go
@@ -20,6 +20,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/ctrl/path_mgmt"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/topology"
 )
 
@@ -184,7 +185,7 @@ func (intf *Interface) Revoke(rev *path_mgmt.SignedRevInfo) error {
 	intf.mu.Lock()
 	defer intf.mu.Unlock()
 	if intf.state == Active {
-		return common.NewBasicError("Interface activated in the meantime", nil)
+		return serrors.New("Interface activated in the meantime")
 	}
 	intf.state = Revoked
 	intf.revocation = rev
diff --git a/go/beacon_srv/internal/ifstate/mock_ifstate/ifstate.go b/go/beacon_srv/internal/ifstate/mock_ifstate/ifstate.go
index 03d829cac4..5debd320dd 100644
--- a/go/beacon_srv/internal/ifstate/mock_ifstate/ifstate.go
+++ b/go/beacon_srv/internal/ifstate/mock_ifstate/ifstate.go
@@ -6,9 +6,10 @@ package mock_ifstate
 
 import (
 	context "context"
+	reflect "reflect"
+
 	gomock "github.com/golang/mock/gomock"
 	path_mgmt "github.com/scionproto/scion/go/lib/ctrl/path_mgmt"
-	reflect "reflect"
 )
 
 // MockRevInserter is a mock of RevInserter interface
diff --git a/go/beacon_srv/main.go b/go/beacon_srv/main.go
index 1c39c34a96..c3e6422c33 100644
--- a/go/beacon_srv/main.go
+++ b/go/beacon_srv/main.go
@@ -55,6 +55,7 @@ import (
 	"github.com/scionproto/scion/go/lib/periodic"
 	"github.com/scionproto/scion/go/lib/prom"
 	"github.com/scionproto/scion/go/lib/scrypto"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/sock/reliable"
 	"github.com/scionproto/scion/go/lib/sock/reliable/reconnect"
@@ -292,7 +293,7 @@ func (t *periodicTasks) Start() error {
 	topo := t.topoProvider.Get()
 	topoAddress := topo.BS.GetById(cfg.General.ID)
 	if topoAddress == nil {
-		return common.NewBasicError("Unable to find topo address", nil)
+		return serrors.New("Unable to find topo address")
 	}
 	var err error
 	if t.registrars, err = t.startSegRegRunners(); err != nil {
diff --git a/go/border/main.go b/go/border/main.go
index 9241ef12ca..13d1b35a52 100644
--- a/go/border/main.go
+++ b/go/border/main.go
@@ -36,6 +36,7 @@ import (
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/profile"
 	"github.com/scionproto/scion/go/lib/prom"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 var (
@@ -133,7 +134,7 @@ func checkPerms() error {
 		return common.NewBasicError("Error retrieving user", err)
 	}
 	if u.Uid == "0" {
-		return common.NewBasicError("Running as root is not allowed for security reasons", nil)
+		return serrors.New("Running as root is not allowed for security reasons")
 	}
 	return nil
 }
diff --git a/go/border/rpkt/extns.go b/go/border/rpkt/extns.go
index 411a848a30..b2d3396874 100644
--- a/go/border/rpkt/extns.go
+++ b/go/border/rpkt/extns.go
@@ -20,6 +20,7 @@ package rpkt
 import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/scmp"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 // rExtension extends common.ExtnBase, adding a method to retrieve the
@@ -134,7 +135,7 @@ func (rp *RtrPkt) extnAddE2E(e common.Extension) error {
 // that extension, as well as a pointer to the nextHdr field of that extension.
 func (rp *RtrPkt) extnOffsetNew(isHBH bool) (int, *uint8, error) {
 	if isHBH && len(rp.E2EExt) > 0 {
-		return 0, nil, common.NewBasicError("HBH extension illegal to add after E2E extension", nil)
+		return 0, nil, serrors.New("HBH extension illegal to add after E2E extension")
 	}
 	offset := rp.CmnHdr.HdrLenBytes()
 	nextHdr := (*uint8)(&rp.CmnHdr.NextHdr)
diff --git a/go/border/rpkt/path.go b/go/border/rpkt/path.go
index 4afa9529d8..80cb653634 100644
--- a/go/border/rpkt/path.go
+++ b/go/border/rpkt/path.go
@@ -28,6 +28,7 @@ import (
 	"github.com/scionproto/scion/go/lib/assert"
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/scmp"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/spath"
 	"github.com/scionproto/scion/go/proto"
 )
@@ -47,7 +48,7 @@ func (rp *RtrPkt) validatePath(dirFrom rcmn.Dir) error {
 	if rp.infoF.Shortcut {
 		currentLinkType := rp.Ctx.Conf.BR.IFs[*rp.ifCurr].LinkType
 		if currentLinkType == proto.LinkType_core {
-			return common.NewBasicError("Shortcut not allowed on core segment", nil)
+			return serrors.New("Shortcut not allowed on core segment")
 		}
 	}
 	// A verify-only Hop Field cannot be used for routing.
@@ -82,7 +83,7 @@ func (rp *RtrPkt) validatePath(dirFrom rcmn.Dir) error {
 // destination is this router.
 func (rp *RtrPkt) validateLocalIF(ifid *common.IFIDType) error {
 	if ifid == nil {
-		return common.NewBasicError("validateLocalIF: Interface is nil", nil)
+		return serrors.New("validateLocalIF: Interface is nil")
 	}
 	if _, ok := rp.Ctx.Conf.Topo.IFInfoMap[*ifid]; !ok {
 		// No such interface.
@@ -448,7 +449,7 @@ func (rp *RtrPkt) IFCurr() (*common.IFIDType, error) {
 // valid before setting the ifCurr field and returning the value.
 func (rp *RtrPkt) checkSetCurrIF(ifid *common.IFIDType) (*common.IFIDType, error) {
 	if ifid == nil {
-		return nil, common.NewBasicError("No interface found", nil)
+		return nil, serrors.New("No interface found")
 	}
 	if _, ok := rp.Ctx.Conf.BR.IFs[*ifid]; !ok {
 		return nil, common.NewBasicError("Unknown interface", nil, "ifid", *ifid)
diff --git a/go/border/rpkt/route.go b/go/border/rpkt/route.go
index 0d5985eb80..73b384332a 100644
--- a/go/border/rpkt/route.go
+++ b/go/border/rpkt/route.go
@@ -27,6 +27,7 @@ import (
 	"github.com/scionproto/scion/go/lib/overlay"
 	"github.com/scionproto/scion/go/lib/ringbuf"
 	"github.com/scionproto/scion/go/lib/scmp"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/proto"
 )
 
@@ -220,7 +221,7 @@ func (rp *RtrPkt) xoverFromExternal() error {
 	}
 	// Make sure we drop packets with shortcuts in core links.
 	if rp.infoF.Shortcut && nextLink == proto.LinkType_core {
-		return common.NewBasicError("Shortcut not allowed on core segment", nil)
+		return serrors.New("Shortcut not allowed on core segment")
 	}
 	return nil
 }
diff --git a/go/cert_srv/internal/config/config.go b/go/cert_srv/internal/config/config.go
index 292f85bc02..5b2a7bd888 100644
--- a/go/cert_srv/internal/config/config.go
+++ b/go/cert_srv/internal/config/config.go
@@ -18,11 +18,11 @@ import (
 	"io"
 	"time"
 
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/config"
 	"github.com/scionproto/scion/go/lib/env"
 	"github.com/scionproto/scion/go/lib/infra/modules/idiscovery"
 	"github.com/scionproto/scion/go/lib/scrypto/cert"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/truststorage"
 	"github.com/scionproto/scion/go/lib/util"
 )
@@ -140,16 +140,16 @@ func (cfg *CSConfig) InitDefaults() {
 
 func (cfg *CSConfig) Validate() error {
 	if cfg.LeafReissueLeadTime.Duration == 0 {
-		return common.NewBasicError("LeafReissueLeadTime must not be zero", nil)
+		return serrors.New("LeafReissueLeadTime must not be zero")
 	}
 	if cfg.IssuerReissueLeadTime.Duration == 0 {
-		return common.NewBasicError("IssuerReissueLeadTime must not be zero", nil)
+		return serrors.New("IssuerReissueLeadTime must not be zero")
 	}
 	if cfg.ReissueRate.Duration == 0 {
-		return common.NewBasicError("ReissueRate must not be zero", nil)
+		return serrors.New("ReissueRate must not be zero")
 	}
 	if cfg.ReissueTimeout.Duration == 0 {
-		return common.NewBasicError("ReissueTimeout must not be zero", nil)
+		return serrors.New("ReissueTimeout must not be zero")
 	}
 	return nil
 }
diff --git a/go/cert_srv/internal/reiss/corepush_test.go b/go/cert_srv/internal/reiss/corepush_test.go
index de85161e7e..e03c773889 100644
--- a/go/cert_srv/internal/reiss/corepush_test.go
+++ b/go/cert_srv/internal/reiss/corepush_test.go
@@ -30,6 +30,7 @@ import (
 	"github.com/scionproto/scion/go/lib/periodic"
 	"github.com/scionproto/scion/go/lib/scrypto/cert"
 	"github.com/scionproto/scion/go/lib/scrypto/trc"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/xtest"
 	"github.com/scionproto/scion/go/lib/xtest/matchers"
 )
@@ -151,7 +152,7 @@ func TestErrDuringSendIsRetried(t *testing.T) {
 	gomock.InOrder(
 		msger.EXPECT().SendCertChain(
 			gomock.Any(), matchesChain(rawChain), matchers.IsSnetAddrWithIA(core1_130),
-			gomock.Any()).Return(common.NewBasicError("test error", nil)),
+			gomock.Any()).Return(serrors.New("test error")),
 		msger.EXPECT().GetCertChain(
 			gomock.Any(), gomock.Any(), matchers.IsSnetAddrWithIA(core1_130), gomock.Any()).Return(
 			emptyChainMsg, nil,
diff --git a/go/cert_srv/internal/reiss/handler.go b/go/cert_srv/internal/reiss/handler.go
index d39172f3c8..3a49c18a2e 100644
--- a/go/cert_srv/internal/reiss/handler.go
+++ b/go/cert_srv/internal/reiss/handler.go
@@ -30,6 +30,7 @@ import (
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/scrypto"
 	"github.com/scionproto/scion/go/lib/scrypto/cert"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/util"
 )
@@ -119,7 +120,7 @@ func (h *Handler) validateSign(ctx context.Context, addr *snet.Addr,
 	signed *ctrl.SignedPld) (*cert.Chain, error) {
 
 	if signed.Sign == nil {
-		return nil, common.NewBasicError("Sign is nil", nil)
+		return nil, serrors.New("Sign is nil")
 	}
 	src, err := ctrl.NewSignSrcDefFromRaw(signed.Sign.Src)
 	if err != nil {
@@ -160,10 +161,10 @@ func (h *Handler) validateReq(c *cert.Certificate, vKey common.RawBytes,
 			c.Issuer, "expected", h.IA)
 	}
 	if c.CanIssue {
-		return common.NewBasicError("CanIssue not allowed to be true", nil)
+		return serrors.New("CanIssue not allowed to be true")
 	}
 	if !bytes.Equal(vKey, vChain.Leaf.SubjectSignKey) {
-		return common.NewBasicError("Request signed with wrong signing key", nil)
+		return serrors.New("Request signed with wrong signing key")
 	}
 	return nil
 }
@@ -229,7 +230,7 @@ func (h *Handler) sendRep(ctx context.Context, addr net.Addr, chain *cert.Chain)
 	}
 	rw, ok := infra.ResponseWriterFromContext(ctx)
 	if !ok {
-		return common.NewBasicError("Unable to send reply, no response writer found", nil)
+		return serrors.New("Unable to send reply, no response writer found")
 	}
 	log.Trace("[reiss.Handler] Sending reissued certificate chain", "chain", chain,
 		"addr", addr)
diff --git a/go/cert_srv/setup.go b/go/cert_srv/setup.go
index 204b2a9f8a..3e1ffb811a 100644
--- a/go/cert_srv/setup.go
+++ b/go/cert_srv/setup.go
@@ -34,6 +34,7 @@ import (
 	"github.com/scionproto/scion/go/lib/infra/modules/trust/trustdb"
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/prom"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/topology"
 	"github.com/scionproto/scion/go/proto"
@@ -167,7 +168,7 @@ func setMessenger(cfg *config.Config, router snet.Router) error {
 	topo := itopo.Get()
 	topoAddress := topo.CS.GetById(cfg.General.ID)
 	if topoAddress == nil {
-		return common.NewBasicError("Unable to find topo address", nil)
+		return serrors.New("Unable to find topo address")
 	}
 	nc := infraenv.NetworkConfig{
 		IA:                    topo.ISD_AS,
diff --git a/go/examples/discovery_client/client.go b/go/examples/discovery_client/client.go
index 7e772faa13..7e7995e968 100644
--- a/go/examples/discovery_client/client.go
+++ b/go/examples/discovery_client/client.go
@@ -31,6 +31,7 @@ import (
 	"github.com/scionproto/scion/go/lib/discovery/topofetcher"
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/periodic"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/topology"
 )
 
@@ -113,10 +114,10 @@ func realMain() int {
 
 func validateFlags() error {
 	if *topoPath == "" && *ds == "" {
-		return common.NewBasicError("Topology and discovery service address not specified", nil)
+		return serrors.New("Topology and discovery service address not specified")
 	}
 	if *ds != "" && *topoPath != "" {
-		return common.NewBasicError("Both topology and discovery service address specified", nil)
+		return serrors.New("Both topology and discovery service address specified")
 	}
 	if *ds != "" {
 		host, port, err := net.SplitHostPort(*ds)
diff --git a/go/godispatcher/internal/config/config.go b/go/godispatcher/internal/config/config.go
index ccc9e06cce..190e8e2321 100644
--- a/go/godispatcher/internal/config/config.go
+++ b/go/godispatcher/internal/config/config.go
@@ -19,10 +19,10 @@ import (
 	"fmt"
 	"io"
 
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/config"
 	"github.com/scionproto/scion/go/lib/env"
 	"github.com/scionproto/scion/go/lib/overlay"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/sock/reliable"
 	"github.com/scionproto/scion/go/lib/util"
 )
@@ -65,16 +65,16 @@ func (cfg *Config) InitDefaults() {
 
 func (cfg *Config) Validate() error {
 	if cfg.Dispatcher.ApplicationSocket == "" {
-		return common.NewBasicError("ApplicationSocket must be set", nil)
+		return serrors.New("ApplicationSocket must be set")
 	}
 	if cfg.Dispatcher.SocketFileMode == 0 {
-		return common.NewBasicError("SocketFileMode must be set", nil)
+		return serrors.New("SocketFileMode must be set")
 	}
 	if cfg.Dispatcher.OverlayPort == 0 {
-		return common.NewBasicError("OverlayPort must be set", nil)
+		return serrors.New("OverlayPort must be set")
 	}
 	if cfg.Dispatcher.ID == "" {
-		return common.NewBasicError("ID must be set", nil)
+		return serrors.New("ID must be set")
 	}
 	return config.ValidateAll(&cfg.Logging, &cfg.Metrics)
 }
diff --git a/go/godispatcher/internal/registration/scmp_table.go b/go/godispatcher/internal/registration/scmp_table.go
index 244daf852d..eccc1a0dc0 100644
--- a/go/godispatcher/internal/registration/scmp_table.go
+++ b/go/godispatcher/internal/registration/scmp_table.go
@@ -16,6 +16,7 @@ package registration
 
 import (
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 // SCMPTable tracks SCMP General class IDs.
@@ -36,7 +37,7 @@ func (t *SCMPTable) Lookup(id uint64) (interface{}, bool) {
 
 func (t *SCMPTable) Register(id uint64, value interface{}) error {
 	if value == nil {
-		return common.NewBasicError("cannot register nil value", nil)
+		return serrors.New("cannot register nil value")
 	}
 	if _, ok := t.m[id]; ok {
 		return common.NewBasicError("id already registered", nil, "id", id)
diff --git a/go/godispatcher/internal/respool/packet.go b/go/godispatcher/internal/respool/packet.go
index fd33e322b9..ff6d8652ce 100644
--- a/go/godispatcher/internal/respool/packet.go
+++ b/go/godispatcher/internal/respool/packet.go
@@ -22,6 +22,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/hpkt"
 	"github.com/scionproto/scion/go/lib/overlay"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/spkt"
 )
 
@@ -116,7 +117,7 @@ func (pkt *Packet) DecodeFromReliableConn(conn net.PacketConn) error {
 	pkt.buffer = pkt.buffer[:n]
 
 	if readExtra == nil {
-		return common.NewBasicError("missing next-hop", nil)
+		return serrors.New("missing next-hop")
 	}
 	pkt.OverlayRemote = readExtra.(*overlay.OverlayAddr).ToUDPAddr()
 
diff --git a/go/godispatcher/main.go b/go/godispatcher/main.go
index c72aa67edf..7cf86994ae 100644
--- a/go/godispatcher/main.go
+++ b/go/godispatcher/main.go
@@ -32,6 +32,7 @@ import (
 	"github.com/scionproto/scion/go/lib/fatal"
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/prom"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 )
 
@@ -172,7 +173,7 @@ func checkPerms() error {
 		return common.NewBasicError("Error retrieving user", err)
 	}
 	if u.Uid == "0" {
-		return common.NewBasicError("Running as root is not allowed for security reasons", nil)
+		return serrors.New("Running as root is not allowed for security reasons")
 	}
 	return nil
 }
diff --git a/go/godispatcher/network/scmp.go b/go/godispatcher/network/scmp.go
index 3e1cccb661..e6c1248699 100644
--- a/go/godispatcher/network/scmp.go
+++ b/go/godispatcher/network/scmp.go
@@ -17,6 +17,7 @@ package network
 import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/scmp"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/spkt"
 )
 
@@ -69,7 +70,7 @@ func getQuotedSCMPGeneralID(scmpPayload *scmp.Payload) (uint64, error) {
 	quotedInfoStart := quotedSCMPHeader.L4Len() + common.LineLen
 	quotedInfoEnd := quotedInfoStart + int(meta.InfoLen)*common.LineLen
 	if len(scmpPayload.L4Hdr) < quotedInfoEnd {
-		return 0, common.NewBasicError("incomplete post-quoted SCMP header meta+info quote", nil)
+		return 0, serrors.New("incomplete post-quoted SCMP header meta+info quote")
 	}
 	info, err := scmp.ParseInfo(scmpPayload.L4Hdr[quotedInfoStart:quotedInfoEnd],
 		scmp.ClassType{Class: quotedSCMPHeader.Class, Type: quotedSCMPHeader.Type})
@@ -78,7 +79,7 @@ func getQuotedSCMPGeneralID(scmpPayload *scmp.Payload) (uint64, error) {
 	}
 	id := extractID(quotedSCMPHeader.Type, info)
 	if id == 0 {
-		return 0, common.NewBasicError("SCMP General ID is 0, cannot route error packet", nil)
+		return 0, serrors.New("SCMP General ID is 0, cannot route error packet")
 	}
 	return id, nil
 }
diff --git a/go/integration/cert_req/main.go b/go/integration/cert_req/main.go
index b295396d34..1930350fd3 100644
--- a/go/integration/cert_req/main.go
+++ b/go/integration/cert_req/main.go
@@ -31,6 +31,7 @@ import (
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/scrypto"
 	"github.com/scionproto/scion/go/lib/scrypto/cert"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/proto"
 )
@@ -121,7 +122,7 @@ func (c client) requestCert() (*cert.Chain, error) {
 		return nil, common.NewBasicError("Unable to parse chain", err)
 	}
 	if chain == nil {
-		return nil, common.NewBasicError("Empty reply", nil)
+		return nil, serrors.New("Empty reply")
 	}
 	if !chain.Leaf.Subject.Equal(remoteIA) {
 		return nil, common.NewBasicError("Invalid subject", nil,
@@ -149,7 +150,7 @@ func (c client) requestTRC(chain *cert.Chain) error {
 		return common.NewBasicError("Unable to parse trc", err)
 	}
 	if trc == nil {
-		return common.NewBasicError("Empty reply", nil)
+		return serrors.New("Empty reply")
 	}
 	if trc.ISD != remoteIA.I {
 		return common.NewBasicError("Invalid ISD", nil,
diff --git a/go/integration/end2end/main.go b/go/integration/end2end/main.go
index c7f6df4c8f..6d0c350298 100644
--- a/go/integration/end2end/main.go
+++ b/go/integration/end2end/main.go
@@ -33,6 +33,7 @@ import (
 	"github.com/scionproto/scion/go/lib/overlay"
 	"github.com/scionproto/scion/go/lib/pathmgr"
 	"github.com/scionproto/scion/go/lib/sciond"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/sock/reliable"
 	"github.com/scionproto/scion/go/lib/spath"
@@ -241,7 +242,7 @@ func (c client) getRemote(ctx context.Context, n int) error {
 		return common.NewBasicError("Error requesting paths", err)
 	}
 	if len(paths.Entries) == 0 {
-		return common.NewBasicError("No path entries found", nil)
+		return serrors.New("No path entries found")
 	}
 	pathEntry := paths.Entries[0]
 	path := spath.New(pathEntry.Path.FwdPath)
diff --git a/go/lib/ctrl/seg/seg.go b/go/lib/ctrl/seg/seg.go
index 931e4d9312..2d37c6eadb 100644
--- a/go/lib/ctrl/seg/seg.go
+++ b/go/lib/ctrl/seg/seg.go
@@ -28,6 +28,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/spath"
 	"github.com/scionproto/scion/go/lib/util"
 	"github.com/scionproto/scion/go/proto"
@@ -56,7 +57,7 @@ type Beacon struct {
 // Parse parses and validates the enclosed path segment.
 func (b *Beacon) Parse() error {
 	if b.Segment == nil {
-		return common.NewBasicError("Beacon does not contain a segment", nil)
+		return serrors.New("Beacon does not contain a segment")
 	}
 	return b.Segment.ParseRaw(ValidateBeacon)
 }
@@ -205,7 +206,7 @@ func (ps *PathSegment) Validate(validationMethod ValidationMethod) error {
 		return err
 	}
 	if len(ps.RawASEntries) == 0 {
-		return common.NewBasicError("PathSegment has no AS Entries", nil)
+		return serrors.New("PathSegment has no AS Entries")
 	}
 	if len(ps.ASEntries) != len(ps.RawASEntries) {
 		return common.NewBasicError(
diff --git a/go/lib/discovery/discovery.go b/go/lib/discovery/discovery.go
index f85df645c3..1087bf75d3 100644
--- a/go/lib/discovery/discovery.go
+++ b/go/lib/discovery/discovery.go
@@ -72,6 +72,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/topology"
 )
 
@@ -155,7 +156,7 @@ func FetchTopoRaw(ctx context.Context, params FetchParams, ds *addr.AppAddr,
 // createURL builds the url to the topology file.
 func createURL(params FetchParams, ds *addr.AppAddr) (string, error) {
 	if ds == nil {
-		return "", common.NewBasicError("Addr not set", nil)
+		return "", serrors.New("Addr not set")
 	}
 	protocol := "http"
 	if params.Https {
diff --git a/go/lib/discovery/discoverypool/pool.go b/go/lib/discovery/discoverypool/pool.go
index 8e30fcc609..5d7d99ad00 100644
--- a/go/lib/discovery/discoverypool/pool.go
+++ b/go/lib/discovery/discoverypool/pool.go
@@ -21,6 +21,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/discovery"
 	"github.com/scionproto/scion/go/lib/discovery/discoveryinfo"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/topology"
 )
 
@@ -67,7 +68,7 @@ func (p *Pool) Update(svcInfo topology.IDAddrMap) error {
 	}
 	// Check that more than one DS remain.
 	if len(del) == len(p.m) {
-		return common.NewBasicError("Unable to delete all discovery service instances", nil)
+		return serrors.New("Unable to delete all discovery service instances")
 	}
 	for _, k := range del {
 		delete(p.m, k)
@@ -90,7 +91,7 @@ func (p *Pool) Choose() (discovery.InstanceInfo, error) {
 		}
 	}
 	if best == nil {
-		return nil, common.NewBasicError("Unable to find any discovery service instance", nil)
+		return nil, serrors.New("Unable to find any discovery service instance")
 	}
 	return best, nil
 }
diff --git a/go/lib/discovery/topofetcher/fetcher.go b/go/lib/discovery/topofetcher/fetcher.go
index 6f3add2b0a..ecd580bee0 100644
--- a/go/lib/discovery/topofetcher/fetcher.go
+++ b/go/lib/discovery/topofetcher/fetcher.go
@@ -21,6 +21,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/discovery"
 	"github.com/scionproto/scion/go/lib/discovery/discoverypool"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/topology"
 )
 
@@ -88,7 +89,7 @@ func (f *Fetcher) Run(ctx context.Context) {
 
 func (f *Fetcher) run(ctx context.Context) error {
 	if f.Pool == nil {
-		return common.NewBasicError("Pool not initialized", nil)
+		return serrors.New("Pool not initialized")
 	}
 	// Choose a DS server.
 	ds, err := f.Pool.Choose()
diff --git a/go/lib/env/env.go b/go/lib/env/env.go
index cc96efca83..9a8575d74e 100644
--- a/go/lib/env/env.go
+++ b/go/lib/env/env.go
@@ -43,6 +43,7 @@ import (
 	"github.com/scionproto/scion/go/lib/overlay"
 	"github.com/scionproto/scion/go/lib/sciond"
 	_ "github.com/scionproto/scion/go/lib/scrypto" // Make sure math/rand is seeded
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/topology"
 	"github.com/scionproto/scion/go/lib/util"
@@ -98,7 +99,7 @@ func (cfg *General) InitDefaults() {
 
 func (cfg *General) Validate() error {
 	if cfg.ID == "" {
-		return common.NewBasicError("No element ID specified", nil)
+		return serrors.New("No element ID specified")
 	}
 	return cfg.checkDir()
 }
@@ -147,7 +148,7 @@ func (cfg *SciondClient) InitDefaults() {
 
 func (cfg *SciondClient) Validate() error {
 	if cfg.InitialConnectPeriod.Duration == 0 {
-		return common.NewBasicError("InitialConnectPeriod must not be zero", nil)
+		return serrors.New("InitialConnectPeriod must not be zero")
 	}
 	return nil
 }
diff --git a/go/lib/healthpool/pool.go b/go/lib/healthpool/pool.go
index ddd0747d98..dc1fe8c395 100644
--- a/go/lib/healthpool/pool.go
+++ b/go/lib/healthpool/pool.go
@@ -21,6 +21,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/periodic"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 // ErrPoolClosed is the error returned when operations on a closed pool are
@@ -120,7 +121,7 @@ func (p *Pool) chooseMinFails() (Info, error) {
 		}
 	}
 	if best == nil {
-		return nil, common.NewBasicError("Unable to find an info instance", nil)
+		return nil, serrors.New("Unable to find an info instance")
 	}
 	return best, nil
 }
diff --git a/go/lib/hpkt/write.go b/go/lib/hpkt/write.go
index 5397ab2af0..f0ea8795c9 100644
--- a/go/lib/hpkt/write.go
+++ b/go/lib/hpkt/write.go
@@ -26,6 +26,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/l4"
 	"github.com/scionproto/scion/go/lib/layers"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/spkt"
 	"github.com/scionproto/scion/go/lib/util"
 )
@@ -151,7 +152,7 @@ func writeExtensions(extensions []common.Extension, buffer gopacket.SerializeBuf
 		case common.End2EndClass:
 			buffer.PushLayer(layers.LayerTypeEndToEndExtension)
 		default:
-			return common.NewBasicError("cannot push unknown layer", nil)
+			return serrors.New("cannot push unknown layer")
 		}
 	}
 	return nil
diff --git a/go/lib/infra/disp/common_test.go b/go/lib/infra/disp/common_test.go
index 41882dad9b..f41af85623 100644
--- a/go/lib/infra/disp/common_test.go
+++ b/go/lib/infra/disp/common_test.go
@@ -20,6 +20,7 @@ import (
 	"strings"
 
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/proto"
 )
 
@@ -40,7 +41,7 @@ func (t testAdapterT) MsgToRaw(msg proto.Cerealizable) (common.RawBytes, error)
 func (t testAdapterT) RawToMsg(b common.RawBytes) (proto.Cerealizable, error) {
 	items := strings.Split(string(b), "-")
 	if len(items) != 2 {
-		return nil, common.NewBasicError("Bad message", nil)
+		return nil, serrors.New("Bad message")
 	}
 	id, err := strconv.Atoi(items[0])
 	if err != nil {
diff --git a/go/lib/infra/disp/wtable.go b/go/lib/infra/disp/wtable.go
index 87bd6a1ccd..7e7640aace 100644
--- a/go/lib/infra/disp/wtable.go
+++ b/go/lib/infra/disp/wtable.go
@@ -19,6 +19,7 @@ import (
 	"sync"
 
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/proto"
 )
 
@@ -40,7 +41,7 @@ func newWaitTable(keyF func(proto.Cerealizable) string) *waitTable {
 func (wt *waitTable) addRequest(object proto.Cerealizable) error {
 	select {
 	case <-wt.destroyChan:
-		return common.NewBasicError("Table destroyed", nil)
+		return serrors.New("Table destroyed")
 	default:
 	}
 	replyChannel := make(chan proto.Cerealizable, 1)
@@ -60,7 +61,7 @@ func (wt *waitTable) waitForReply(ctx context.Context,
 	object proto.Cerealizable) (proto.Cerealizable, error) {
 	select {
 	case <-wt.destroyChan:
-		return nil, common.NewBasicError("Table destroyed", nil)
+		return nil, serrors.New("Table destroyed")
 	default:
 	}
 	replyChannel, loaded := wt.replyMap.Load(wt.keyF(object))
@@ -73,7 +74,7 @@ func (wt *waitTable) waitForReply(ctx context.Context,
 	case <-ctx.Done():
 		return nil, ctx.Err()
 	case <-wt.destroyChan:
-		return nil, common.NewBasicError("Table destroyed", nil)
+		return nil, serrors.New("Table destroyed")
 	}
 }
 
@@ -83,7 +84,7 @@ func (wt *waitTable) waitForReply(ctx context.Context,
 func (wt *waitTable) reply(object proto.Cerealizable) (bool, error) {
 	select {
 	case <-wt.destroyChan:
-		return false, common.NewBasicError("Table destroyed", nil)
+		return false, serrors.New("Table destroyed")
 	default:
 	}
 	replyChannel, ok := wt.replyMap.Load(wt.keyF(object))
diff --git a/go/lib/infra/messenger/addr.go b/go/lib/infra/messenger/addr.go
index a5d9dcc273..6ed09e6486 100644
--- a/go/lib/infra/messenger/addr.go
+++ b/go/lib/infra/messenger/addr.go
@@ -24,6 +24,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/overlay"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/svc"
 	"github.com/scionproto/scion/go/lib/topology"
@@ -211,14 +212,14 @@ func (r AddressRewriter) resolutionCtx(ctx context.Context) (context.Context, co
 // found, an error is returned.
 func parseReply(reply *svc.Reply) (*addr.AppAddr, error) {
 	if reply == nil {
-		return nil, common.NewBasicError("nil reply", nil)
+		return nil, serrors.New("nil reply")
 	}
 	if reply.Transports == nil {
-		return nil, common.NewBasicError("empty reply", nil)
+		return nil, serrors.New("empty reply")
 	}
 	addressStr, ok := reply.Transports[svc.QUIC]
 	if !ok {
-		return nil, common.NewBasicError("QUIC server address not found", nil)
+		return nil, serrors.New("QUIC server address not found")
 	}
 	udpAddr, err := net.ResolveUDPAddr("udp", addressStr)
 	if err != nil {
diff --git a/go/lib/infra/messenger/quic_response_writer.go b/go/lib/infra/messenger/quic_response_writer.go
index 0725ee541b..4928e4ed84 100644
--- a/go/lib/infra/messenger/quic_response_writer.go
+++ b/go/lib/infra/messenger/quic_response_writer.go
@@ -17,7 +17,6 @@ package messenger
 import (
 	"context"
 
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/ctrl"
 	"github.com/scionproto/scion/go/lib/ctrl/ack"
 	"github.com/scionproto/scion/go/lib/ctrl/cert_mgmt"
@@ -25,6 +24,7 @@ import (
 	"github.com/scionproto/scion/go/lib/infra"
 	"github.com/scionproto/scion/go/lib/infra/rpc"
 	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 var _ infra.ResponseWriter = (*QUICResponseWriter)(nil)
@@ -106,7 +106,7 @@ func (rw *QUICResponseWriter) SendIfStateInfoReply(ctx context.Context,
 	msg *path_mgmt.IFStateInfos) error {
 
 	// FIXME(scrye): Use only UDP because the BR doesn't support QUIC.
-	return common.NewBasicError("IFStateInfos responses not supported in QUIC", nil)
+	return serrors.New("IFStateInfos responses not supported in QUIC")
 }
 
 func (rw *QUICResponseWriter) SendHPSegReply(ctx context.Context, msg *path_mgmt.HPSegReply) error {
diff --git a/go/lib/infra/modules/db/sqlite.go b/go/lib/infra/modules/db/sqlite.go
index 12a2cdacf9..0e6b8dcae1 100644
--- a/go/lib/infra/modules/db/sqlite.go
+++ b/go/lib/infra/modules/db/sqlite.go
@@ -19,6 +19,7 @@ import (
 	"fmt"
 
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 // NewSqlite returns a new SQLite backend opening a database at the given path. If
@@ -27,7 +28,7 @@ import (
 func NewSqlite(path string, schema string, schemaVersion int) (*sql.DB, error) {
 	var err error
 	if path == "" {
-		return nil, common.NewBasicError("Empty path not allowed for sqlite", nil)
+		return nil, serrors.New("Empty path not allowed for sqlite")
 	}
 	db, err := open(path)
 	if err != nil {
diff --git a/go/lib/infra/modules/idiscovery/config.go b/go/lib/infra/modules/idiscovery/config.go
index 1aa480b66c..d516175aa8 100644
--- a/go/lib/infra/modules/idiscovery/config.go
+++ b/go/lib/infra/modules/idiscovery/config.go
@@ -21,6 +21,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/config"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 )
 
@@ -120,10 +121,10 @@ func (cfg *FetchConfig) InitDefaults() {
 
 func (cfg *FetchConfig) Validate() error {
 	if cfg.Interval.Duration == 0 {
-		return common.NewBasicError("Interval must not be zero", nil)
+		return serrors.New("Interval must not be zero")
 	}
 	if cfg.Timeout.Duration == 0 {
-		return common.NewBasicError("Timeout must not be zero", nil)
+		return serrors.New("Timeout must not be zero")
 	}
 	return cfg.Connect.Validate()
 }
@@ -159,7 +160,7 @@ func (cfg *ConnectParams) InitDefaults() {
 
 func (cfg *ConnectParams) Validate() error {
 	if cfg.InitialPeriod.Duration == 0 {
-		return common.NewBasicError("InitialPeriod must not be zero", nil)
+		return serrors.New("InitialPeriod must not be zero")
 	}
 	return cfg.FailAction.Validate()
 }
diff --git a/go/lib/infra/modules/idiscovery/idiscovery.go b/go/lib/infra/modules/idiscovery/idiscovery.go
index f9be2f5be6..23ea4f008d 100644
--- a/go/lib/infra/modules/idiscovery/idiscovery.go
+++ b/go/lib/infra/modules/idiscovery/idiscovery.go
@@ -48,6 +48,7 @@ import (
 	"github.com/scionproto/scion/go/lib/infra/modules/itopo"
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/periodic"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/topology"
 	"github.com/scionproto/scion/go/lib/util"
 )
@@ -241,7 +242,7 @@ func (r *Runner) execFailAction(fetcher *task, cfg FetchConfig) {
 		log.Warn("[discovery] Unable to get a valid initial topology, ignoring")
 		r.startRegularFetcher(fetcher, cfg)
 	default:
-		fatal.Fatal(common.NewBasicError("Unable to get a valid initial topology", nil))
+		fatal.Fatal(serrors.New("Unable to get a valid initial topology"))
 	}
 }
 
@@ -293,7 +294,7 @@ func NewFetcher(handler TopoHandler, params discovery.FetchParams,
 	filename string, client *http.Client) (*task, error) {
 
 	if handler == nil {
-		return nil, common.NewBasicError("handler must not be nil", nil)
+		return nil, serrors.New("handler must not be nil")
 	}
 	t := &task{
 		mode:     params.Mode,
diff --git a/go/lib/infra/modules/itopo/itopo.go b/go/lib/infra/modules/itopo/itopo.go
index 9cd3ee9c73..919f21f656 100644
--- a/go/lib/infra/modules/itopo/itopo.go
+++ b/go/lib/infra/modules/itopo/itopo.go
@@ -25,6 +25,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/infra/modules/itopo/internal/metrics"
 	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/topology"
 	"github.com/scionproto/scion/go/proto"
 )
@@ -159,7 +160,7 @@ func (tx *Transaction) Commit() error {
 	}
 	if tx.staticAtTxStart != st.topo.static {
 		incUpdateMetric(l.WithResult(metrics.ErrCommit))
-		return common.NewBasicError("Static topology changed in the meantime", nil)
+		return serrors.New("Static topology changed in the meantime")
 	}
 	if !tx.IsUpdate() {
 		incUpdateMetric(l.WithResult(metrics.OkIgnored))
@@ -269,10 +270,10 @@ func (s *state) beginSetDynamic(dynamic *topology.Topo) (Transaction, error) {
 
 func (s *state) dynamicPreCheck(dynamic *topology.Topo) error {
 	if dynamic == nil {
-		return common.NewBasicError("Provided topology must not be nil", nil)
+		return serrors.New("Provided topology must not be nil")
 	}
 	if s.topo.static == nil {
-		return common.NewBasicError("Static topology must be set", nil)
+		return serrors.New("Static topology must be set")
 	}
 	now := time.Now()
 	if !dynamic.Active(now) {
diff --git a/go/lib/infra/modules/itopo/validate.go b/go/lib/infra/modules/itopo/validate.go
index d2954d3f4f..45c622c570 100644
--- a/go/lib/infra/modules/itopo/validate.go
+++ b/go/lib/infra/modules/itopo/validate.go
@@ -18,6 +18,7 @@ import (
 	"github.com/google/go-cmp/cmp"
 
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/topology"
 	"github.com/scionproto/scion/go/proto"
 )
@@ -89,7 +90,7 @@ type generalValidator struct{}
 
 func (v *generalValidator) General(topo *topology.Topo) error {
 	if topo == nil {
-		return common.NewBasicError("Topo must not be nil", nil)
+		return serrors.New("Topo must not be nil")
 	}
 	return nil
 }
diff --git a/go/lib/infra/modules/seghandler/seghandler_test.go b/go/lib/infra/modules/seghandler/seghandler_test.go
index 56a8cbd1c1..adbba36574 100644
--- a/go/lib/infra/modules/seghandler/seghandler_test.go
+++ b/go/lib/infra/modules/seghandler/seghandler_test.go
@@ -22,7 +22,6 @@ import (
 	"github.com/golang/mock/gomock"
 	"github.com/stretchr/testify/assert"
 
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/ctrl/path_mgmt"
 	"github.com/scionproto/scion/go/lib/ctrl/seg"
 	"github.com/scionproto/scion/go/lib/infra"
@@ -30,6 +29,7 @@ import (
 	"github.com/scionproto/scion/go/lib/infra/modules/seghandler/mock_seghandler"
 	"github.com/scionproto/scion/go/lib/infra/modules/segverifier"
 	"github.com/scionproto/scion/go/lib/mocks/net/mock_net"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/xtest"
 	"github.com/scionproto/scion/go/proto"
 )
@@ -82,10 +82,10 @@ func TestReplyHandlerErrors(t *testing.T) {
 	verified := make(chan segverifier.UnitResult)
 
 	verifyErrs := []error{
-		common.NewBasicError("test err 1", nil),
-		common.NewBasicError("test err 2", nil),
-		common.NewBasicError("test err 3", nil),
-		common.NewBasicError("test err rev 1", nil),
+		serrors.New("test err 1"),
+		serrors.New("test err 2"),
+		serrors.New("test err 3"),
+		serrors.New("test err rev 1"),
 	}
 	rev1, err := path_mgmt.NewSignedRevInfo(&path_mgmt.RevInfo{}, infra.NullSigner)
 	xtest.FailOnErr(t, err)
@@ -282,7 +282,7 @@ func TestReplyHandlerEarlyTriggerStorageError(t *testing.T) {
 	}
 	seg1Store := storage.EXPECT().StoreSegs(gomock.Any(),
 		gomock.Eq([]*seghandler.SegWithHP{seg1})).
-		Return(seghandler.SegStats{}, common.NewBasicError("Test error", nil))
+		Return(seghandler.SegStats{}, serrors.New("Test error"))
 	storage.EXPECT().StoreSegs(gomock.Any(),
 		gomock.Eq([]*seghandler.SegWithHP{seg1, seg2})).
 		Return(seghandler.SegStats{InsertedSegs: []string{"seg1", "seg2"}}, nil).
@@ -339,7 +339,7 @@ func TestReplyHandlerStorageError(t *testing.T) {
 		Storage:  storage,
 		Verifier: verifier,
 	}
-	storageErr := common.NewBasicError("Test error", nil)
+	storageErr := serrors.New("Test error")
 	storage.EXPECT().StoreSegs(gomock.Any(),
 		gomock.Eq([]*seghandler.SegWithHP{seg1, seg2})).
 		Return(seghandler.SegStats{}, storageErr)
diff --git a/go/lib/infra/modules/trust/signhelper.go b/go/lib/infra/modules/trust/signhelper.go
index bd9fcb3db8..81b331dbf1 100644
--- a/go/lib/infra/modules/trust/signhelper.go
+++ b/go/lib/infra/modules/trust/signhelper.go
@@ -27,6 +27,7 @@ import (
 	"github.com/scionproto/scion/go/lib/infra"
 	"github.com/scionproto/scion/go/lib/infra/modules/trust/internal/metrics"
 	"github.com/scionproto/scion/go/lib/scrypto"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 	"github.com/scionproto/scion/go/proto"
 )
@@ -196,7 +197,7 @@ func (v *BasicVerifier) sanityChecks(sign *proto.SignS, isPldSignature bool) err
 	l := metrics.VerificationLabels{Type: metrics.Signature, Result: metrics.ErrValidate}
 	if sign == nil {
 		metrics.Store.Verification(l).Inc()
-		return common.NewBasicError("SignS is unset", nil)
+		return serrors.New("SignS is unset")
 	}
 	if len(sign.Signature) == 0 {
 		metrics.Store.Verification(l).Inc()
diff --git a/go/lib/infra/modules/trust/trust.go b/go/lib/infra/modules/trust/trust.go
index 70aa1a23be..15de8c0dd4 100644
--- a/go/lib/infra/modules/trust/trust.go
+++ b/go/lib/infra/modules/trust/trust.go
@@ -579,7 +579,7 @@ func (store *Store) LoadAuthoritativeTRC(dir string) error {
 		// Unexpected error in trust store
 		return common.NewBasicError("Failed to load TRC from store", err)
 	case xerrors.Is(err, ErrNotFoundLocally) && fileTRC == nil:
-		return common.NewBasicError("No TRC found on disk or in trustdb", nil)
+		return serrors.New("No TRC found on disk or in trustdb")
 	case xerrors.Is(err, ErrNotFoundLocally) && fileTRC != nil:
 		if _, err := store.trustdb.InsertTRC(ctx, fileTRC); err != nil {
 			return common.NewBasicError("Failed to insert TRC in trust db", err)
@@ -635,7 +635,7 @@ func (store *Store) LoadAuthoritativeChain(dir string) error {
 		// Unexpected error in trust store
 		return err
 	case xerrors.Is(err, ErrMissingAuthoritative) && fileChain == nil:
-		return common.NewBasicError("No chain found on disk or in trustdb", nil)
+		return serrors.New("No chain found on disk or in trustdb")
 	case xerrors.Is(err, ErrMissingAuthoritative) && fileChain != nil:
 		_, err := store.trustdb.InsertChain(ctx, fileChain)
 		return err
diff --git a/go/lib/infra/modules/trust/trust_test.go b/go/lib/infra/modules/trust/trust_test.go
index a0290912fb..698e5f9e9a 100644
--- a/go/lib/infra/modules/trust/trust_test.go
+++ b/go/lib/infra/modules/trust/trust_test.go
@@ -28,7 +28,6 @@ import (
 	"github.com/stretchr/testify/require"
 
 	"github.com/scionproto/scion/go/lib/addr"
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/ctrl/cert_mgmt"
 	"github.com/scionproto/scion/go/lib/infra"
 	"github.com/scionproto/scion/go/lib/infra/disp"
@@ -39,6 +38,7 @@ import (
 	"github.com/scionproto/scion/go/lib/scrypto"
 	"github.com/scionproto/scion/go/lib/scrypto/cert"
 	"github.com/scionproto/scion/go/lib/scrypto/trc"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/topology"
 	"github.com/scionproto/scion/go/lib/topology/topotestutil"
@@ -91,12 +91,12 @@ func newMessengerMock(ctrl *gomock.Controller,
 
 			trcObj, ok := trcs[msg.ISD]
 			if !ok {
-				return nil, common.NewBasicError("TRC not found", nil)
+				return nil, serrors.New("TRC not found")
 			}
 
 			compressedTRC, err := trcObj.Compress()
 			if err != nil {
-				return nil, common.NewBasicError("Unable to compress TRC", nil)
+				return nil, serrors.New("Unable to compress TRC")
 			}
 			return &cert_mgmt.TRC{RawTRC: compressedTRC}, nil
 		},
@@ -107,12 +107,12 @@ func newMessengerMock(ctrl *gomock.Controller,
 
 			chain, ok := chains[msg.IA()]
 			if !ok {
-				return nil, common.NewBasicError("Chain not found", nil)
+				return nil, serrors.New("Chain not found")
 			}
 
 			compressedChain, err := chain.Compress()
 			if err != nil {
-				return nil, common.NewBasicError("Unable to compress Chain", nil)
+				return nil, serrors.New("Unable to compress Chain")
 			}
 			return &cert_mgmt.Chain{RawChain: compressedChain}, nil
 		},
diff --git a/go/lib/infra/modules/trust/trustdb/trustdbsqlite/db.go b/go/lib/infra/modules/trust/trustdb/trustdbsqlite/db.go
index 37d3f0f79f..319acaa8c5 100644
--- a/go/lib/infra/modules/trust/trustdb/trustdbsqlite/db.go
+++ b/go/lib/infra/modules/trust/trustdb/trustdbsqlite/db.go
@@ -33,6 +33,7 @@ import (
 	"github.com/scionproto/scion/go/lib/scrypto"
 	"github.com/scionproto/scion/go/lib/scrypto/cert"
 	"github.com/scionproto/scion/go/lib/scrypto/trc"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 const (
@@ -592,7 +593,7 @@ func (db *executor) InsertCustKey(ctx context.Context,
 	key *trustdb.CustKey, oldVersion scrypto.Version) error {
 
 	if key == nil {
-		return common.NewBasicError("Inserting nil key not allowed", nil)
+		return serrors.New("Inserting nil key not allowed")
 	}
 	if key.Version == oldVersion {
 		return common.NewBasicError("Same version as oldVersion not allowed",
@@ -636,7 +637,7 @@ func (db *transaction) Commit() error {
 	db.Lock()
 	defer db.Unlock()
 	if db.tx == nil {
-		return common.NewBasicError("Transaction already done", nil)
+		return serrors.New("Transaction already done")
 	}
 	err := db.tx.Commit()
 	if err != nil {
@@ -650,7 +651,7 @@ func (db *transaction) Rollback() error {
 	db.Lock()
 	defer db.Unlock()
 	if db.tx == nil {
-		return common.NewBasicError("Transaction already done", nil)
+		return serrors.New("Transaction already done")
 	}
 	err := db.tx.Rollback()
 	db.tx = nil
diff --git a/go/lib/infra/rpc/rpc.go b/go/lib/infra/rpc/rpc.go
index c7a0157215..a892f59b3b 100644
--- a/go/lib/infra/rpc/rpc.go
+++ b/go/lib/infra/rpc/rpc.go
@@ -27,8 +27,8 @@ import (
 	quic "github.com/lucas-clemente/quic-go"
 	capnp "zombiezen.com/go/capnproto2"
 
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/proto"
 )
@@ -82,7 +82,7 @@ func (s *Server) initListener() error {
 	defer s.mu.Unlock()
 
 	if s.listener != nil {
-		return common.NewBasicError("cannot listen on same server twice", nil)
+		return serrors.New("cannot listen on same server twice")
 	}
 	listener, err := quic.Listen(s.Conn, s.TLSConfig, s.QUICConfig)
 	if err != nil {
diff --git a/go/lib/layers/extensions_layer.go b/go/lib/layers/extensions_layer.go
index 57d40fc746..4ac12e5046 100644
--- a/go/lib/layers/extensions_layer.go
+++ b/go/lib/layers/extensions_layer.go
@@ -19,6 +19,7 @@ import (
 	"github.com/google/gopacket/layers"
 
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 )
 
@@ -64,7 +65,7 @@ func (e *Extension) DecodeFromBytes(data []byte, df gopacket.DecodeFeedback) err
 	expectedLength := int(data[1]) * common.LineLen
 	if expectedLength <= 0 {
 		df.SetTruncated()
-		return common.NewBasicError("Invalid SCION Extension header, length is zero", nil)
+		return serrors.New("Invalid SCION Extension header, length is zero")
 	}
 
 	if len(data) < expectedLength {
diff --git a/go/lib/log/flags.go b/go/lib/log/flags.go
index 5aae2de1aa..6c69ee507d 100644
--- a/go/lib/log/flags.go
+++ b/go/lib/log/flags.go
@@ -17,7 +17,7 @@ package log
 import (
 	"flag"
 
-	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 var (
@@ -71,7 +71,7 @@ func SetupFromFlags(name string) error {
 	// if name passed, the caller wants to setup a log file
 	if name != "" {
 		if logDir == "" {
-			return common.NewBasicError("Log dir flag not set", nil)
+			return serrors.New("Log dir flag not set")
 		}
 		err = SetupLogFile(name, logDir, logLevel, logSize, logAge, logBackups, logFlush)
 	}
diff --git a/go/lib/overlay/addr.go b/go/lib/overlay/addr.go
index f85a62bf36..8ce1cb3df9 100644
--- a/go/lib/overlay/addr.go
+++ b/go/lib/overlay/addr.go
@@ -20,6 +20,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 type OverlayAddr struct {
@@ -29,7 +30,7 @@ type OverlayAddr struct {
 
 func NewOverlayAddr(l3 addr.HostAddr, l4 addr.L4Info) (*OverlayAddr, error) {
 	if l3 == nil {
-		return nil, common.NewBasicError("L3 required", nil)
+		return nil, serrors.New("L3 required")
 	}
 	switch l3.Type() {
 	case addr.HostTypeIPv4, addr.HostTypeIPv6:
diff --git a/go/lib/overlay/conn/conn.go b/go/lib/overlay/conn/conn.go
index bcaf871b52..8629ca4425 100644
--- a/go/lib/overlay/conn/conn.go
+++ b/go/lib/overlay/conn/conn.go
@@ -32,6 +32,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/overlay"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/sockctrl"
 )
 
@@ -226,7 +227,7 @@ func (cc *connUDPBase) initConnUDP(network string, listen, remote *overlay.Overl
 	var c *net.UDPConn
 	var err error
 	if listen == nil {
-		return common.NewBasicError("listen address must be specified", nil)
+		return serrors.New("listen address must be specified")
 	}
 	laddr = listen.ToUDPAddr()
 	if laddr == nil {
diff --git a/go/lib/pathdb/sqlite/sqlite.go b/go/lib/pathdb/sqlite/sqlite.go
index 23384381e9..09d167f56e 100644
--- a/go/lib/pathdb/sqlite/sqlite.go
+++ b/go/lib/pathdb/sqlite/sqlite.go
@@ -35,6 +35,7 @@ import (
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/pathdb"
 	"github.com/scionproto/scion/go/lib/pathdb/query"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/proto"
 )
 
@@ -135,7 +136,7 @@ func (e *executor) InsertWithHPCfgIDs(ctx context.Context, segMeta *seg.Meta,
 	e.Lock()
 	defer e.Unlock()
 	if e.db == nil {
-		return noInsertion, common.NewBasicError("No database open", nil)
+		return noInsertion, serrors.New("No database open")
 	}
 	pseg := segMeta.Segment
 	// Check if we already have a path segment.
@@ -390,7 +391,7 @@ func (e *executor) deleteInTx(ctx context.Context,
 	e.Lock()
 	defer e.Unlock()
 	if e.db == nil {
-		return 0, common.NewBasicError("No database open", nil)
+		return 0, serrors.New("No database open")
 	}
 	return db.DeleteInTx(ctx, e.db, delFunc)
 }
@@ -399,7 +400,7 @@ func (e *executor) Get(ctx context.Context, params *query.Params) (query.Results
 	e.RLock()
 	defer e.RUnlock()
 	if e.db == nil {
-		return nil, common.NewBasicError("No database open", nil)
+		return nil, serrors.New("No database open")
 	}
 	stmt, args := e.buildQuery(params)
 	rows, err := e.db.QueryContext(ctx, stmt, args...)
@@ -537,7 +538,7 @@ func (e *executor) GetAll(ctx context.Context) (<-chan query.ResultOrErr, error)
 	e.RLock()
 	defer e.RUnlock()
 	if e.db == nil {
-		return nil, common.NewBasicError("No database open", nil)
+		return nil, serrors.New("No database open")
 	}
 	stmt, args := e.buildQuery(nil)
 	rows, err := e.db.QueryContext(ctx, stmt, args...)
@@ -598,7 +599,7 @@ func (e *executor) InsertNextQuery(ctx context.Context, src, dst addr.IA, policy
 	e.Lock()
 	defer e.Unlock()
 	if e.db == nil {
-		return false, common.NewBasicError("No database open", nil)
+		return false, serrors.New("No database open")
 	}
 	if policy == nil {
 		policy = pathdb.NoPolicy
@@ -633,7 +634,7 @@ func (e *executor) GetNextQuery(ctx context.Context, src, dst addr.IA,
 	e.RLock()
 	defer e.RUnlock()
 	if e.db == nil {
-		return time.Time{}, common.NewBasicError("No database open", nil)
+		return time.Time{}, serrors.New("No database open")
 	}
 	if policy == nil {
 		policy = pathdb.NoPolicy
diff --git a/go/lib/pathpol/hop_pred.go b/go/lib/pathpol/hop_pred.go
index 98d672ad6d..4fe5acfd3e 100644
--- a/go/lib/pathpol/hop_pred.go
+++ b/go/lib/pathpol/hop_pred.go
@@ -23,6 +23,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 // A HopPredicate specifies a hop in the ACL or Sequence of the path policy,
@@ -155,7 +156,7 @@ func validateHopPredStr(str string) error {
 			"dashes", dashes, "hashes", hashes, "commas", commas)
 	}
 	if dashes == 0 && (hashes > 0 || commas > 0) {
-		return common.NewBasicError("Can't specify IFIDs without AS", nil)
+		return serrors.New("Can't specify IFIDs without AS")
 	}
 	return nil
 }
diff --git a/go/lib/pathstorage/pathstorage.go b/go/lib/pathstorage/pathstorage.go
index 9bd6d0d0db..61877349e8 100644
--- a/go/lib/pathstorage/pathstorage.go
+++ b/go/lib/pathstorage/pathstorage.go
@@ -26,6 +26,7 @@ import (
 	sqlitepathdb "github.com/scionproto/scion/go/lib/pathdb/sqlite"
 	"github.com/scionproto/scion/go/lib/revcache"
 	"github.com/scionproto/scion/go/lib/revcache/memrevcache"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 )
 
@@ -102,14 +103,14 @@ func (cfg *PathDBConf) validateBackend() error {
 	case BackendSqlite:
 		return nil
 	case BackendNone:
-		return common.NewBasicError("No backend set", nil)
+		return serrors.New("No backend set")
 	}
 	return common.NewBasicError("Unsupported backend", nil, "backend", cfg.Backend())
 }
 
 func (cfg *PathDBConf) validateConnection() error {
 	if cfg.Connection() == "" {
-		return common.NewBasicError("Empty connection not allowed", nil)
+		return serrors.New("Empty connection not allowed")
 	}
 	return nil
 }
@@ -174,14 +175,14 @@ func (cfg *RevCacheConf) validateBackend() error {
 	case BackendSqlite, BackendMem:
 		return nil
 	case BackendNone:
-		return common.NewBasicError("No backend set", nil)
+		return serrors.New("No backend set")
 	}
 	return common.NewBasicError("Unsupported backend", nil, "backend", cfg.Backend())
 }
 
 func (cfg *RevCacheConf) validateConnection() error {
 	if cfg.Backend() != BackendMem && cfg.Connection() == "" {
-		return common.NewBasicError("Empty connection not allowed", nil)
+		return serrors.New("Empty connection not allowed")
 	}
 	return nil
 }
diff --git a/go/lib/pktcls/json.go b/go/lib/pktcls/json.go
index 5670816bc5..55e08d0346 100644
--- a/go/lib/pktcls/json.go
+++ b/go/lib/pktcls/json.go
@@ -19,6 +19,7 @@ import (
 	"strconv"
 
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 type Typer interface {
@@ -126,7 +127,7 @@ func unmarshalCond(b []byte) (Cond, error) {
 	}
 	c, ok := t.(Cond)
 	if !ok {
-		return nil, common.NewBasicError("Unable to extract Cond from interface", nil)
+		return nil, serrors.New("Unable to extract Cond from interface")
 	}
 	return c, nil
 }
@@ -139,7 +140,7 @@ func unmarshalPredicate(b []byte) (IPv4Predicate, error) {
 	}
 	p, ok := t.(IPv4Predicate)
 	if !ok {
-		return nil, common.NewBasicError("Unable to extract Cond from interface", nil)
+		return nil, serrors.New("Unable to extract Cond from interface")
 	}
 	return p, nil
 }
diff --git a/go/lib/revcache/util_test.go b/go/lib/revcache/util_test.go
index d1a25c8fe2..b45ec560c1 100644
--- a/go/lib/revcache/util_test.go
+++ b/go/lib/revcache/util_test.go
@@ -29,6 +29,7 @@ import (
 	"github.com/scionproto/scion/go/lib/infra"
 	"github.com/scionproto/scion/go/lib/revcache"
 	"github.com/scionproto/scion/go/lib/revcache/mock_revcache"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 	"github.com/scionproto/scion/go/lib/xtest"
 	"github.com/scionproto/scion/go/lib/xtest/graph"
@@ -90,7 +91,7 @@ func TestFilterNew(t *testing.T) {
 			SoMsg("Only new revocations should stay in map", rMap, ShouldResemble, expectedMap)
 		})
 		Convey("Given a cache with an error", func() {
-			expectedErr := common.NewBasicError("TESTERR", nil)
+			expectedErr := serrors.New("TESTERR")
 			revCache.EXPECT().Get(gomock.Any(), gomock.Any()).Return(nil, expectedErr)
 			rMap, err := revcache.RevocationToMap([]*path_mgmt.SignedRevInfo{})
 			SoMsg("No error expected", err, ShouldBeNil)
@@ -132,7 +133,7 @@ func TestNoRevokedHopIntf(t *testing.T) {
 		})
 		Convey("Given an error in the revache it is propagated", func() {
 			revCache.EXPECT().Get(gomock.Eq(ctx), gomock.Any()).Return(
-				nil, common.NewBasicError("TestError", nil),
+				nil, serrors.New("TestError"),
 			)
 			_, err := revcache.NoRevokedHopIntf(ctx, revCache, seg210_222_1)
 			SoMsg("Err expected", err, ShouldNotBeNil)
@@ -157,7 +158,7 @@ func TestRelevantRevInfos(t *testing.T) {
 		// TODO(lukedirtwalker): Add test with revocations
 		Convey("Given an error in the revache it is propagated", func() {
 			revCache.EXPECT().Get(gomock.Eq(ctx), gomock.Any()).Return(
-				nil, common.NewBasicError("TestError", nil),
+				nil, serrors.New("TestError"),
 			)
 			_, err := revcache.RelevantRevInfos(ctx, revCache, segs)
 			SoMsg("Err expected", err, ShouldNotBeNil)
diff --git a/go/lib/sciond/pathprobe/paths.go b/go/lib/sciond/pathprobe/paths.go
index 8d3efb20d8..a5d544ab38 100644
--- a/go/lib/sciond/pathprobe/paths.go
+++ b/go/lib/sciond/pathprobe/paths.go
@@ -28,6 +28,7 @@ import (
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/sciond"
 	"github.com/scionproto/scion/go/lib/scmp"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/sock/reliable"
 	"github.com/scionproto/scion/go/lib/spath"
@@ -87,7 +88,7 @@ func (p Prober) GetStatuses(ctx context.Context,
 
 	deadline, ok := ctx.Deadline()
 	if !ok {
-		return nil, common.NewBasicError("deadline required on ctx", nil)
+		return nil, serrors.New("deadline required on ctx")
 	}
 	// Check whether paths are alive. This is done by sending a packet
 	// with invalid address via the path. The border router at the destination
diff --git a/go/lib/scmp/info.go b/go/lib/scmp/info.go
index a65ba686cd..ae9632a99d 100644
--- a/go/lib/scmp/info.go
+++ b/go/lib/scmp/info.go
@@ -21,6 +21,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/ctrl/path_mgmt"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 )
 
@@ -250,7 +251,7 @@ type InfoExtIdx struct {
 
 func InfoExtIdxFromRaw(b common.RawBytes) (*InfoExtIdx, error) {
 	if len(b) == 0 {
-		return nil, common.NewBasicError("Unable to parse InfoExtIdx", nil)
+		return nil, serrors.New("Unable to parse InfoExtIdx")
 	}
 	return &InfoExtIdx{Idx: b[0]}, nil
 }
diff --git a/go/lib/scmp/info_traceroute.go b/go/lib/scmp/info_traceroute.go
index e00bfb3442..3933a91c35 100644
--- a/go/lib/scmp/info_traceroute.go
+++ b/go/lib/scmp/info_traceroute.go
@@ -19,6 +19,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 )
 
@@ -57,7 +58,7 @@ type InfoTraceRoute struct {
 
 func InfoTraceRouteFromRaw(b common.RawBytes) (*InfoTraceRoute, error) {
 	if len(b) < traceRouteLen {
-		return nil, common.NewBasicError("Unable to parse InfoTraceRoute, small buffer size", nil)
+		return nil, serrors.New("Unable to parse InfoTraceRoute, small buffer size")
 	}
 	e := &InfoTraceRoute{}
 	e.Id = common.Order.Uint64(b)
diff --git a/go/lib/scrypto/asym.go b/go/lib/scrypto/asym.go
index 8e84244865..f3b41e9e68 100644
--- a/go/lib/scrypto/asym.go
+++ b/go/lib/scrypto/asym.go
@@ -22,6 +22,7 @@ import (
 	"golang.org/x/crypto/nacl/box"
 
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 // Available asymmetric crypto algorithms. The values must be lower case.
@@ -77,7 +78,7 @@ func GetPubKey(privKey []byte, algo string) ([]byte, error) {
 	case Ed25519:
 		return ed25519.PrivateKey(privKey).Public().(ed25519.PublicKey), nil
 	}
-	return nil, common.NewBasicError("unsupported key type", nil)
+	return nil, serrors.New("unsupported key type")
 }
 
 // Sign takes a signature input and a signing key to create a signature. Currently only
diff --git a/go/lib/snet/conn.go b/go/lib/snet/conn.go
index f5e2117c4d..22f62e3881 100644
--- a/go/lib/snet/conn.go
+++ b/go/lib/snet/conn.go
@@ -19,9 +19,9 @@ import (
 	"time"
 
 	"github.com/scionproto/scion/go/lib/addr"
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/pathmgr"
 	"github.com/scionproto/scion/go/lib/scmp"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 const (
@@ -73,7 +73,7 @@ func newSCIONConn(base *scionConnBase, pr pathmgr.Resolver, conn PacketConn) *SC
 // context.
 func DialSCION(network string, laddr, raddr *Addr) (Conn, error) {
 	if DefNetwork == nil {
-		return nil, common.NewBasicError("SCION network not initialized", nil)
+		return nil, serrors.New("SCION network not initialized")
 	}
 	return DefNetwork.DialSCION(network, laddr, raddr, 0)
 }
@@ -83,7 +83,7 @@ func DialSCION(network string, laddr, raddr *Addr) (Conn, error) {
 func DialSCIONWithBindSVC(network string, laddr, raddr, baddr *Addr,
 	svc addr.HostSVC) (Conn, error) {
 	if DefNetwork == nil {
-		return nil, common.NewBasicError("SCION network not initialized", nil)
+		return nil, serrors.New("SCION network not initialized")
 	}
 	return DefNetwork.DialSCIONWithBindSVC(network, laddr, raddr, baddr, svc, 0)
 }
@@ -92,7 +92,7 @@ func DialSCIONWithBindSVC(network string, laddr, raddr, baddr *Addr,
 // networking context.
 func ListenSCION(network string, laddr *Addr) (Conn, error) {
 	if DefNetwork == nil {
-		return nil, common.NewBasicError("SCION network not initialized", nil)
+		return nil, serrors.New("SCION network not initialized")
 	}
 	return DefNetwork.ListenSCION(network, laddr, 0)
 }
@@ -101,7 +101,7 @@ func ListenSCION(network string, laddr *Addr) (Conn, error) {
 // the default networking context.
 func ListenSCIONWithBindSVC(network string, laddr, baddr *Addr, svc addr.HostSVC) (Conn, error) {
 	if DefNetwork == nil {
-		return nil, common.NewBasicError("SCION network not initialized", nil)
+		return nil, serrors.New("SCION network not initialized")
 	}
 	return DefNetwork.ListenSCIONWithBindSVC(network, laddr, baddr, svc, 0)
 }
diff --git a/go/lib/snet/reader.go b/go/lib/snet/reader.go
index 78d85d7117..43eaf760a8 100644
--- a/go/lib/snet/reader.go
+++ b/go/lib/snet/reader.go
@@ -24,6 +24,7 @@ import (
 	"github.com/scionproto/scion/go/lib/l4"
 	"github.com/scionproto/scion/go/lib/overlay"
 	"github.com/scionproto/scion/go/lib/scmp"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 type scionConnReader struct {
@@ -64,7 +65,7 @@ func (c *scionConnReader) Read(b []byte) (int, error) {
 // an error (if one occurred).
 func (c *scionConnReader) read(b []byte) (int, *Addr, error) {
 	if c.base.scionNet == nil {
-		return 0, nil, common.NewBasicError("SCION network not initialized", nil)
+		return 0, nil, serrors.New("SCION network not initialized")
 	}
 
 	c.mtx.Lock()
diff --git a/go/lib/snet/router.go b/go/lib/snet/router.go
index d0a8faf3f6..e301c80391 100644
--- a/go/lib/snet/router.go
+++ b/go/lib/snet/router.go
@@ -23,6 +23,7 @@ import (
 	"github.com/scionproto/scion/go/lib/overlay"
 	"github.com/scionproto/scion/go/lib/pathmgr"
 	"github.com/scionproto/scion/go/lib/sciond"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/spath"
 	"github.com/scionproto/scion/go/lib/spath/spathmeta"
 )
@@ -63,7 +64,7 @@ func (r *BaseRouter) Route(ctx context.Context, dst addr.IA) (Path, error) {
 	}
 	aps := r.PathResolver.Query(ctx, r.IA, dst, sciond.PathReqFlags{})
 	if len(aps) == 0 {
-		return nil, common.NewBasicError("unable to find paths", nil)
+		return nil, serrors.New("unable to find paths")
 	}
 	ap := aps.GetAppPath("")
 	return r.appPathToPath(ap)
diff --git a/go/lib/snet/snet.go b/go/lib/snet/snet.go
index 3ce14bcc5a..da66046567 100644
--- a/go/lib/snet/snet.go
+++ b/go/lib/snet/snet.go
@@ -56,6 +56,7 @@ import (
 	"github.com/scionproto/scion/go/lib/overlay"
 	"github.com/scionproto/scion/go/lib/pathmgr"
 	"github.com/scionproto/scion/go/lib/sciond"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/sock/reliable"
 )
 
@@ -76,7 +77,7 @@ func Init(ia addr.IA, sciondPath string, dispatcher reliable.DispatcherService)
 // InitWithNetwork initializes snet with the provided SCION networking context.
 func InitWithNetwork(network *SCIONNetwork) error {
 	if DefNetwork != nil {
-		return common.NewBasicError("Cannot initialize global SCION network twice", nil)
+		return serrors.New("Cannot initialize global SCION network twice")
 	}
 	DefNetwork = network
 	return nil
@@ -200,7 +201,7 @@ func (n *SCIONNetwork) DialSCIONWithBindSVC(network string, laddr, raddr, baddr
 	svc addr.HostSVC, timeout time.Duration) (Conn, error) {
 
 	if raddr == nil {
-		return nil, common.NewBasicError("Unable to dial to nil remote", nil)
+		return nil, serrors.New("Unable to dial to nil remote")
 	}
 	conn, err := n.ListenSCIONWithBindSVC(network, laddr, baddr, svc, timeout)
 	if err != nil {
@@ -251,20 +252,20 @@ func (n *SCIONNetwork) ListenSCIONWithBindSVC(network string, laddr, baddr *Addr
 		return nil, common.NewBasicError("Network not implemented", nil, "net", network)
 	}
 	if laddr == nil {
-		return nil, common.NewBasicError("Nil laddr not supported", nil)
+		return nil, serrors.New("Nil laddr not supported")
 	}
 	if laddr.Host == nil {
-		return nil, common.NewBasicError("Nil Host laddr not supported", nil)
+		return nil, serrors.New("Nil Host laddr not supported")
 	}
 	if laddr.Host.L3 == nil {
-		return nil, common.NewBasicError("Nil Host L3 laddr not supported", nil)
+		return nil, serrors.New("Nil Host L3 laddr not supported")
 	}
 	if laddr.Host.L3.Type() != l3Type {
 		return nil, common.NewBasicError("Supplied local address does not match network", nil,
 			"expected L3", l3Type, "actual L3", laddr.Host.L3.Type())
 	}
 	if laddr.Host.L3.IP().IsUnspecified() {
-		return nil, common.NewBasicError("Binding to unspecified address not supported", nil)
+		return nil, serrors.New("Binding to unspecified address not supported")
 	}
 	if laddr.Host.L4 == nil {
 		// If no port has been specified, default to 0 to get a random port from the dispatcher
diff --git a/go/lib/snet/squic/squic.go b/go/lib/snet/squic/squic.go
index 51a9944d77..449c6f5447 100644
--- a/go/lib/snet/squic/squic.go
+++ b/go/lib/snet/squic/squic.go
@@ -22,6 +22,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 )
 
@@ -78,7 +79,7 @@ func ListenSCIONWithBindSVC(network *snet.SCIONNetwork, laddr, baddr *snet.Addr,
 	svc addr.HostSVC, quicConfig *quic.Config) (quic.Listener, error) {
 
 	if len(srvTlsCfg.Certificates) == 0 {
-		return nil, common.NewBasicError("squic: No server TLS certificate configured", nil)
+		return nil, serrors.New("squic: No server TLS certificate configured")
 	}
 	sconn, err := sListen(network, laddr, baddr, svc)
 	if err != nil {
diff --git a/go/lib/sock/reliable/reconnect/main_test.go b/go/lib/sock/reliable/reconnect/main_test.go
index 3a16b0d763..8c16555ebe 100644
--- a/go/lib/sock/reliable/reconnect/main_test.go
+++ b/go/lib/sock/reliable/reconnect/main_test.go
@@ -25,9 +25,9 @@ import (
 	"github.com/golang/mock/gomock"
 
 	"github.com/scionproto/scion/go/lib/addr"
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/overlay"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/sock/reliable/reconnect"
 )
@@ -51,8 +51,8 @@ var (
 var (
 	dispatcherError            = &net.OpError{Err: os.NewSyscallError("write", syscall.ECONNRESET)}
 	writeDispatcherError       = &net.OpError{Err: os.NewSyscallError("write", syscall.EPIPE)}
-	writeNonDispatcherError    = common.NewBasicError("Misc error", nil)
-	connectErrorFromDispatcher = common.NewBasicError("Port unavailable", nil)
+	writeNonDispatcherError    = serrors.New("Misc error")
+	connectErrorFromDispatcher = serrors.New("Port unavailable")
 )
 
 func MustParseSnet(str string) *snet.Addr {
diff --git a/go/lib/sock/reliable/reconnect/network_test.go b/go/lib/sock/reliable/reconnect/network_test.go
index 9851ba7d9a..2b7866e3a1 100644
--- a/go/lib/sock/reliable/reconnect/network_test.go
+++ b/go/lib/sock/reliable/reconnect/network_test.go
@@ -24,8 +24,8 @@ import (
 	. "github.com/smartystreets/goconvey/convey"
 
 	"github.com/scionproto/scion/go/lib/addr"
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/mocks/net/mock_net"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/sock/reliable/mock_reliable"
 	"github.com/scionproto/scion/go/lib/sock/reliable/reconnect"
 )
@@ -60,7 +60,7 @@ func TestNetworkFatalError(t *testing.T) {
 	Convey("Given a network running over an underlying mocked network", t, func() {
 		ctrl := gomock.NewController(t)
 		defer ctrl.Finish()
-		err := common.NewBasicError("Not dispatcher dead error, e.g., malformed register msg", nil)
+		err := serrors.New("Not dispatcher dead error, e.g., malformed register msg")
 		mockNetwork := mock_reliable.NewMockDispatcherService(ctrl)
 		network := reconnect.NewDispatcherService(mockNetwork)
 		Convey("The network returns non-dispatcher dial errors from the mock", func() {
diff --git a/go/lib/sock/reliable/reliable.go b/go/lib/sock/reliable/reliable.go
index 3c4b06f3ae..69193062a0 100644
--- a/go/lib/sock/reliable/reliable.go
+++ b/go/lib/sock/reliable/reliable.go
@@ -70,6 +70,7 @@ import (
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/overlay"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 var (
@@ -270,7 +271,7 @@ func (conn *Conn) ReadFrom(buf []byte) (int, net.Addr, error) {
 		}
 	}
 	if len(buf) < len(p.Payload) {
-		return 0, nil, common.NewBasicError("buffer too small", nil)
+		return 0, nil, serrors.New("buffer too small")
 	}
 	copy(buf, p.Payload)
 	return len(p.Payload), overlayAddr, nil
@@ -345,7 +346,7 @@ func (listener *Listener) String() string {
 
 func createUDPAddrFromAppAddr(address *addr.AppAddr) (*net.UDPAddr, error) {
 	if address == nil || address.L3 == nil {
-		return nil, common.NewBasicError("nil application address", nil)
+		return nil, serrors.New("nil application address")
 	}
 	if address.L3.Type() != addr.HostTypeIPv4 && address.L3.Type() != addr.HostTypeIPv6 {
 		return nil, common.NewBasicError("unsupported application address type", nil,
diff --git a/go/lib/spath/path.go b/go/lib/spath/path.go
index d9c0591913..7e40d0d671 100644
--- a/go/lib/spath/path.go
+++ b/go/lib/spath/path.go
@@ -22,6 +22,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 )
 
@@ -143,7 +144,7 @@ func (path *Path) InitOffsets() error {
 	path.HopOff = common.LineLen
 	// Cannot initialize an empty path
 	if path.IsEmpty() {
-		return common.NewBasicError("Unable to initialize empty path", nil)
+		return serrors.New("Unable to initialize empty path")
 	}
 	// Skip Peer with Xover HF
 	if infoF, err = path.GetInfoField(path.InfOff); err != nil {
@@ -162,7 +163,7 @@ func (path *Path) InitOffsets() error {
 		return err
 	}
 	if path.InfOff != 0 {
-		return common.NewBasicError("Unable to find routing Hop Field in first path segment", nil)
+		return serrors.New("Unable to find routing Hop Field in first path segment")
 	}
 	return nil
 }
@@ -221,7 +222,7 @@ func (path *Path) GetInfoField(offset int) (*InfoField, error) {
 		return nil, common.NewBasicError("Negative InfoF offset", nil, "offset", offset)
 	}
 	if path.IsEmpty() {
-		return nil, common.NewBasicError("Unable to get infoField from empty path", nil)
+		return nil, serrors.New("Unable to get infoField from empty path")
 	}
 	infoF, err := InfoFFromRaw(path.Raw[offset:])
 	if err != nil {
@@ -235,7 +236,7 @@ func (path *Path) GetHopField(offset int) (*HopField, error) {
 		return nil, common.NewBasicError("Negative HopF offset", nil, "offset", offset)
 	}
 	if path.IsEmpty() {
-		return nil, common.NewBasicError("Unable to get hopField from empty path", nil)
+		return nil, serrors.New("Unable to get hopField from empty path")
 	}
 	hopF, err := HopFFromRaw(path.Raw[offset:])
 	if err != nil {
diff --git a/go/lib/svc/svc_test.go b/go/lib/svc/svc_test.go
index 9e15486711..f9f4ec5bd2 100644
--- a/go/lib/svc/svc_test.go
+++ b/go/lib/svc/svc_test.go
@@ -26,6 +26,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/l4"
 	"github.com/scionproto/scion/go/lib/overlay"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/snet/mock_snet"
 	"github.com/scionproto/scion/go/lib/spath"
@@ -124,7 +125,7 @@ func TestSVCResolutionServer(t *testing.T) {
 				Convey("return from socket with error if next internal read fails", func() {
 					mockPacketConn.EXPECT().ReadFrom(gomock.Any(), gomock.Any()).DoAndReturn(
 						func(pkt *snet.SCIONPacket, ov *overlay.OverlayAddr) error {
-							return common.NewBasicError("forced exit", nil)
+							return serrors.New("forced exit")
 						},
 					)
 					err := conn.ReadFrom(&pkt, &ov)
diff --git a/go/lib/topology/topology.go b/go/lib/topology/topology.go
index 1244a3e2ec..869de9ae05 100644
--- a/go/lib/topology/topology.go
+++ b/go/lib/topology/topology.go
@@ -24,6 +24,7 @@ import (
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/overlay"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/proto"
 )
 
@@ -44,7 +45,7 @@ type ServiceNames []string
 func (s ServiceNames) GetRandom() (string, error) {
 	numServers := len(s)
 	if numServers == 0 {
-		return "", common.NewBasicError("No names present", nil)
+		return "", serrors.New("No names present")
 	}
 	return s[rand.Intn(numServers)], nil
 }
@@ -324,7 +325,7 @@ func (t *Topo) GetAllTopoAddrs(svc proto.ServiceType) ([]TopoAddr, error) {
 	}
 	topoAddrs := svcInfo.GetAllTopoAddrs()
 	if topoAddrs == nil {
-		return nil, common.NewBasicError("Address not found", nil)
+		return nil, serrors.New("Address not found")
 	}
 	return topoAddrs, nil
 }
@@ -332,7 +333,7 @@ func (t *Topo) GetAllTopoAddrs(svc proto.ServiceType) ([]TopoAddr, error) {
 func (t *Topo) GetSvcInfo(svc proto.ServiceType) (*SVCInfo, error) {
 	switch svc {
 	case proto.ServiceType_unset:
-		return nil, common.NewBasicError("Service type unset", nil)
+		return nil, serrors.New("Service type unset")
 	case proto.ServiceType_bs:
 		return &SVCInfo{overlay: t.Overlay, names: t.BSNames, idTopoAddrMap: t.BS}, nil
 	case proto.ServiceType_ps:
diff --git a/go/lib/truststorage/truststorage.go b/go/lib/truststorage/truststorage.go
index ee99036a6b..d5732031cf 100644
--- a/go/lib/truststorage/truststorage.go
+++ b/go/lib/truststorage/truststorage.go
@@ -27,6 +27,7 @@ import (
 	"github.com/scionproto/scion/go/lib/infra/modules/trust/trustdb"
 	"github.com/scionproto/scion/go/lib/infra/modules/trust/trustdb/trustdbsqlite"
 	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 )
 
@@ -98,7 +99,7 @@ func (cfg *TrustDBConf) validateBackend() error {
 	case BackendSqlite:
 		return nil
 	case BackendNone:
-		return common.NewBasicError("No backend set", nil)
+		return serrors.New("No backend set")
 	}
 	return common.NewBasicError("Unsupported backend", nil, "backend", cfg.Backend())
 }
diff --git a/go/path_srv/internal/config/config.go b/go/path_srv/internal/config/config.go
index 9591b9a42e..3bd7a299b3 100644
--- a/go/path_srv/internal/config/config.go
+++ b/go/path_srv/internal/config/config.go
@@ -19,11 +19,11 @@ import (
 	"io"
 	"time"
 
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/config"
 	"github.com/scionproto/scion/go/lib/env"
 	"github.com/scionproto/scion/go/lib/infra/modules/idiscovery"
 	"github.com/scionproto/scion/go/lib/pathstorage"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/truststorage"
 	"github.com/scionproto/scion/go/lib/util"
 )
@@ -118,7 +118,7 @@ func (cfg *PSConfig) InitDefaults() {
 
 func (cfg *PSConfig) Validate() error {
 	if cfg.QueryInterval.Duration == 0 {
-		return common.NewBasicError("QueryInterval must not be zero", nil)
+		return serrors.New("QueryInterval must not be zero")
 	}
 	return config.ValidateAll(&cfg.PathDB, &cfg.RevCache)
 }
diff --git a/go/path_srv/internal/handlers/common_test.go b/go/path_srv/internal/handlers/common_test.go
index b988649954..737bdd0f1c 100644
--- a/go/path_srv/internal/handlers/common_test.go
+++ b/go/path_srv/internal/handlers/common_test.go
@@ -29,6 +29,7 @@ import (
 	"github.com/scionproto/scion/go/lib/revcache"
 	"github.com/scionproto/scion/go/lib/revcache/memrevcache"
 	"github.com/scionproto/scion/go/lib/revcache/mock_revcache"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/xtest"
 	"github.com/scionproto/scion/go/lib/xtest/graph"
 )
@@ -110,7 +111,7 @@ func TestFetchDB(t *testing.T) {
 			mPathDB.EXPECT().Get(gomock.Any(), gomock.Any()).Return([]*query.Result{{
 				Seg: g.seg130_132,
 			}}, nil)
-			expErr := common.NewBasicError("TestError", nil)
+			expErr := serrors.New("TestError")
 			mRevCache.EXPECT().Get(gomock.Any(), gomock.Any()).AnyTimes().Return(
 				nil,
 				expErr,
diff --git a/go/path_srv/internal/segreq/provider.go b/go/path_srv/internal/segreq/provider.go
index b8f81effe4..d10ad675f1 100644
--- a/go/path_srv/internal/segreq/provider.go
+++ b/go/path_srv/internal/segreq/provider.go
@@ -28,6 +28,7 @@ import (
 	"github.com/scionproto/scion/go/lib/pathdb"
 	"github.com/scionproto/scion/go/lib/pathdb/query"
 	"github.com/scionproto/scion/go/lib/revcache"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet/addrutil"
 	"github.com/scionproto/scion/go/lib/topology"
 	"github.com/scionproto/scion/go/proto"
@@ -59,7 +60,7 @@ func (s *SegSelector) SelectSeg(ctx context.Context,
 		return nil, common.NewBasicError("failed to filter segments", err)
 	}
 	if len(segs) < 1 {
-		return nil, common.NewBasicError("no segments found", nil)
+		return nil, serrors.New("no segments found")
 	}
 	return segs[rand.Intn(len(segs))], nil
 }
diff --git a/go/path_srv/internal/segsyncer/segsyncer.go b/go/path_srv/internal/segsyncer/segsyncer.go
index 94a97bf81b..a3ad22aaba 100644
--- a/go/path_srv/internal/segsyncer/segsyncer.go
+++ b/go/path_srv/internal/segsyncer/segsyncer.go
@@ -32,6 +32,7 @@ import (
 	"github.com/scionproto/scion/go/lib/pathdb/query"
 	"github.com/scionproto/scion/go/lib/periodic"
 	"github.com/scionproto/scion/go/lib/revcache"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet/addrutil"
 	"github.com/scionproto/scion/go/lib/topology"
 	"github.com/scionproto/scion/go/path_srv/internal/handlers"
@@ -117,7 +118,7 @@ func (s *SegSyncer) getDstAddr(ctx context.Context) (net.Addr, error) {
 		return nil, common.NewBasicError("Failed to get core segs", err)
 	}
 	if len(coreSegs) < 1 {
-		return nil, common.NewBasicError("No core segments found!", nil)
+		return nil, serrors.New("No core segments found!")
 	}
 	var cPs net.Addr
 	// select a seg to reach the dst
diff --git a/go/proto/cert_mgmt.capnp.go b/go/proto/cert_mgmt.capnp.go
index 0097da823f..54ffa59820 100644
--- a/go/proto/cert_mgmt.capnp.go
+++ b/go/proto/cert_mgmt.capnp.go
@@ -4,6 +4,7 @@ package proto
 
 import (
 	strconv "strconv"
+
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/ctrl_pld.capnp.go b/go/proto/ctrl_pld.capnp.go
index 3bb43e5811..3444ba1427 100644
--- a/go/proto/ctrl_pld.capnp.go
+++ b/go/proto/ctrl_pld.capnp.go
@@ -4,6 +4,7 @@ package proto
 
 import (
 	strconv "strconv"
+
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/drkey_mgmt.capnp.go b/go/proto/drkey_mgmt.capnp.go
index 344162dff8..c67722da46 100644
--- a/go/proto/drkey_mgmt.capnp.go
+++ b/go/proto/drkey_mgmt.capnp.go
@@ -4,6 +4,7 @@ package proto
 
 import (
 	strconv "strconv"
+
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/path_mgmt.capnp.go b/go/proto/path_mgmt.capnp.go
index 15446c469f..15de82ba81 100644
--- a/go/proto/path_mgmt.capnp.go
+++ b/go/proto/path_mgmt.capnp.go
@@ -4,6 +4,7 @@ package proto
 
 import (
 	strconv "strconv"
+
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/sciond.capnp.go b/go/proto/sciond.capnp.go
index 3c18142e3c..9776830bd9 100644
--- a/go/proto/sciond.capnp.go
+++ b/go/proto/sciond.capnp.go
@@ -4,6 +4,7 @@ package proto
 
 import (
 	strconv "strconv"
+
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/sig.capnp.go b/go/proto/sig.capnp.go
index 3f53f57636..e9b63f7153 100644
--- a/go/proto/sig.capnp.go
+++ b/go/proto/sig.capnp.go
@@ -4,6 +4,7 @@ package proto
 
 import (
 	strconv "strconv"
+
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/structs.gen.go b/go/proto/structs.gen.go
index dbcaa9a109..37ceb522c1 100644
--- a/go/proto/structs.gen.go
+++ b/go/proto/structs.gen.go
@@ -3,9 +3,8 @@
 package proto
 
 import (
-	"zombiezen.com/go/capnproto2"
-
 	"github.com/scionproto/scion/go/lib/common"
+	capnp "zombiezen.com/go/capnproto2"
 )
 
 // NewRootStruct calls the appropriate NewRoot<x> function corresponding to the capnp proto type ID,
diff --git a/go/sciond/internal/config/config.go b/go/sciond/internal/config/config.go
index 053fb96973..08e94b5956 100644
--- a/go/sciond/internal/config/config.go
+++ b/go/sciond/internal/config/config.go
@@ -25,6 +25,7 @@ import (
 	"github.com/scionproto/scion/go/lib/infra/modules/idiscovery"
 	"github.com/scionproto/scion/go/lib/pathstorage"
 	"github.com/scionproto/scion/go/lib/sciond"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/truststorage"
 	"github.com/scionproto/scion/go/lib/util"
@@ -137,16 +138,16 @@ func (cfg *SDConfig) InitDefaults() {
 
 func (cfg *SDConfig) Validate() error {
 	if cfg.Reliable == "" {
-		return common.NewBasicError("Reliable must be set", nil)
+		return serrors.New("Reliable must be set")
 	}
 	if cfg.Unix == "" {
-		return common.NewBasicError("Unix must be set", nil)
+		return serrors.New("Unix must be set")
 	}
 	if cfg.SocketFileMode == 0 {
-		return common.NewBasicError("SocketFileMode must be set", nil)
+		return serrors.New("SocketFileMode must be set")
 	}
 	if cfg.QueryInterval.Duration == 0 {
-		return common.NewBasicError("QueryInterval must not be zero", nil)
+		return serrors.New("QueryInterval must not be zero")
 	}
 	return config.ValidateAll(&cfg.PathDB, &cfg.RevCache)
 }
diff --git a/go/sciond/internal/fetcher/fetcher.go b/go/sciond/internal/fetcher/fetcher.go
index e5d4745126..1e592436c9 100644
--- a/go/sciond/internal/fetcher/fetcher.go
+++ b/go/sciond/internal/fetcher/fetcher.go
@@ -34,6 +34,7 @@ import (
 	"github.com/scionproto/scion/go/lib/pathdb/query"
 	"github.com/scionproto/scion/go/lib/revcache"
 	"github.com/scionproto/scion/go/lib/sciond"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/spath"
 	"github.com/scionproto/scion/go/lib/topology"
@@ -114,7 +115,7 @@ func (f *fetcherHandler) GetPaths(ctx context.Context, req *sciond.PathReq,
 	req = req.Copy()
 	// Check context
 	if _, ok := ctx.Deadline(); !ok {
-		return nil, common.NewBasicError("Context must have deadline set", nil)
+		return nil, serrors.New("Context must have deadline set")
 	}
 	// Check source
 	if req.Src.IA().IsZero() {
diff --git a/go/sciond/internal/servers/handlers.go b/go/sciond/internal/servers/handlers.go
index b1ad54cfc6..2827e6538f 100644
--- a/go/sciond/internal/servers/handlers.go
+++ b/go/sciond/internal/servers/handlers.go
@@ -20,7 +20,6 @@ import (
 	"net"
 	"time"
 
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/ctrl/path_mgmt"
 	"github.com/scionproto/scion/go/lib/hostinfo"
 	"github.com/scionproto/scion/go/lib/infra"
@@ -30,6 +29,7 @@ import (
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/revcache"
 	"github.com/scionproto/scion/go/lib/sciond"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/topology"
 	"github.com/scionproto/scion/go/proto"
 	"github.com/scionproto/scion/go/sciond/internal/fetcher"
@@ -300,7 +300,7 @@ func (h *RevNotificationHandler) verifySRevInfo(ctx context.Context,
 	// Error out immediately if RevInfo is bad
 	info, err := sRevInfo.RevInfo()
 	if err != nil {
-		return nil, common.NewBasicError("Unable to extract RevInfo", nil)
+		return nil, serrors.New("Unable to extract RevInfo")
 	}
 	err = segverifier.VerifyRevInfo(ctx, h.VerifierFactory.NewVerifier(), nil, sRevInfo)
 	return info, err
diff --git a/go/sciond/internal/servers/server.go b/go/sciond/internal/servers/server.go
index 37b018ca6b..726d141378 100644
--- a/go/sciond/internal/servers/server.go
+++ b/go/sciond/internal/servers/server.go
@@ -24,6 +24,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/sock/reliable"
 	"github.com/scionproto/scion/go/proto"
 )
@@ -70,7 +71,7 @@ func (srv *Server) ListenAndServe() error {
 	srv.mu.Lock()
 	if srv.closeCalled {
 		srv.mu.Unlock()
-		return common.NewBasicError("attempted to listen on server that was shut down", nil)
+		return serrors.New("attempted to listen on server that was shut down")
 	}
 	listener, err := srv.listen()
 	if err != nil {
@@ -135,7 +136,7 @@ func (srv *Server) Close() error {
 	defer srv.mu.Unlock()
 
 	if srv.listener == nil {
-		return common.NewBasicError("uninitialized server", nil)
+		return serrors.New("uninitialized server")
 	}
 	srv.closeCalled = true
 	return srv.listener.Close()
diff --git a/go/sig/internal/sigconfig/conf.go b/go/sig/internal/sigconfig/conf.go
index f43264479a..c62fdb8c7f 100644
--- a/go/sig/internal/sigconfig/conf.go
+++ b/go/sig/internal/sigconfig/conf.go
@@ -20,9 +20,9 @@ import (
 	"net"
 
 	"github.com/scionproto/scion/go/lib/addr"
-	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/config"
 	"github.com/scionproto/scion/go/lib/env"
+	"github.com/scionproto/scion/go/lib/serrors"
 )
 
 const (
@@ -123,19 +123,19 @@ func (cfg *SigConf) InitDefaults() {
 // Validate validate the config and returns an error if a value is not valid.
 func (cfg *SigConf) Validate() error {
 	if cfg.ID == "" {
-		return common.NewBasicError("ID must be set!", nil)
+		return serrors.New("ID must be set!")
 	}
 	if cfg.SIGConfig == "" {
-		return common.NewBasicError("Config must be set!", nil)
+		return serrors.New("Config must be set!")
 	}
 	if cfg.IA.IsZero() {
-		return common.NewBasicError("IA must be set", nil)
+		return serrors.New("IA must be set")
 	}
 	if cfg.IA.IsWildcard() {
-		return common.NewBasicError("Wildcard IA not allowed", nil)
+		return serrors.New("Wildcard IA not allowed")
 	}
 	if cfg.IP.IsUnspecified() {
-		return common.NewBasicError("IP must be set", nil)
+		return serrors.New("IP must be set")
 	}
 	return nil
 }
diff --git a/go/sig/main.go b/go/sig/main.go
index 6fb5639995..91684145ac 100644
--- a/go/sig/main.go
+++ b/go/sig/main.go
@@ -32,6 +32,7 @@ import (
 	"github.com/scionproto/scion/go/lib/fatal"
 	"github.com/scionproto/scion/go/lib/log"
 	"github.com/scionproto/scion/go/lib/prom"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/sig/base"
 	"github.com/scionproto/scion/go/sig/config"
 	"github.com/scionproto/scion/go/sig/disp"
@@ -138,7 +139,7 @@ func validateConfig() error {
 
 func setupTun() (io.ReadWriteCloser, error) {
 	if err := checkPerms(); err != nil {
-		return nil, common.NewBasicError("Permissions checks failed", nil)
+		return nil, serrors.New("Permissions checks failed")
 	}
 	tunLink, tunIO, err := xnet.ConnectTun(cfg.Sig.Tun)
 	if err != nil {
@@ -176,7 +177,7 @@ func checkPerms() error {
 		return common.NewBasicError("Error retrieving user", err)
 	}
 	if u.Uid == "0" {
-		return common.NewBasicError("Running as root is not allowed for security reasons", nil)
+		return serrors.New("Running as root is not allowed for security reasons")
 	}
 	caps, err := capability.NewPid(0)
 	if err != nil {
diff --git a/go/tools/scion-pki/internal/conf/isd.go b/go/tools/scion-pki/internal/conf/isd.go
index 7d295ee09b..6aaaf23365 100644
--- a/go/tools/scion-pki/internal/conf/isd.go
+++ b/go/tools/scion-pki/internal/conf/isd.go
@@ -23,6 +23,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 	"github.com/scionproto/scion/go/tools/scion-pki/internal/pkicmn"
 )
@@ -55,7 +56,7 @@ func LoadIsdConf(dir string) (*Isd, error) {
 		return nil, err
 	}
 	if len(i.Trc.RawCoreIAs) == 0 {
-		return nil, common.NewBasicError("CoreASes missing", nil)
+		return nil, serrors.New("CoreASes missing")
 	}
 	// Parse core ASes into addr.IAs
 	for _, raw := range i.Trc.RawCoreIAs {
diff --git a/go/tools/scion-pki/internal/keys/gen.go b/go/tools/scion-pki/internal/keys/gen.go
index 70203f7847..bc123e38bd 100644
--- a/go/tools/scion-pki/internal/keys/gen.go
+++ b/go/tools/scion-pki/internal/keys/gen.go
@@ -27,6 +27,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/keyconf"
 	"github.com/scionproto/scion/go/lib/scrypto"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/tools/scion-pki/internal/conf"
 	"github.com/scionproto/scion/go/tools/scion-pki/internal/pkicmn"
 )
@@ -137,7 +138,7 @@ func genMasterKey(rand io.Reader) ([]byte, error) {
 		return nil, err
 	}
 	if n != 16 {
-		return nil, common.NewBasicError("Not enough random bytes", nil)
+		return nil, serrors.New("Not enough random bytes")
 	}
 	return key, nil
 }
diff --git a/go/tools/scion-pki/internal/v2/conf/isd.go b/go/tools/scion-pki/internal/v2/conf/isd.go
index dc11418da2..9afc777505 100644
--- a/go/tools/scion-pki/internal/v2/conf/isd.go
+++ b/go/tools/scion-pki/internal/v2/conf/isd.go
@@ -23,6 +23,7 @@ import (
 
 	"github.com/scionproto/scion/go/lib/addr"
 	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/util"
 	"github.com/scionproto/scion/go/tools/scion-pki/internal/pkicmn"
 )
@@ -67,7 +68,7 @@ func LoadISDCfg(dir string) (*ISDCfg, error) {
 		return nil, err
 	}
 	if len(i.Desc) == 0 {
-		return nil, common.NewBasicError("description not set", nil)
+		return nil, serrors.New("description not set")
 	}
 	if err = i.TRC.Validate(); err != nil {
 		return nil, err
@@ -180,7 +181,7 @@ func (t *TRC) parsePrimaries() error {
 func (t *TRC) parsePrimary(raw []string) ([]addr.AS, error) {
 	var ases []addr.AS
 	if len(raw) == 0 {
-		return nil, common.NewBasicError("section not set", nil)
+		return nil, serrors.New("section not set")
 	}
 	for _, raw := range raw {
 		as, err := addr.ASFromString(raw)
@@ -200,7 +201,7 @@ func (t *TRC) checkValuesSet() error {
 		return common.NewBasicError(ErrTrcVersionNotSet, nil)
 	}
 	if t.BaseVersion != t.Version {
-		return common.NewBasicError("only base TRCs supported currently", nil)
+		return serrors.New("only base TRCs supported currently")
 	}
 	if t.VotingQuorum == 0 {
 		return common.NewBasicError(ErrVotingQuorumNotSet, nil)
diff --git a/go/tools/scion-pki/internal/v2/keys/gen.go b/go/tools/scion-pki/internal/v2/keys/gen.go
index 512e8b721f..1236532c56 100644
--- a/go/tools/scion-pki/internal/v2/keys/gen.go
+++ b/go/tools/scion-pki/internal/v2/keys/gen.go
@@ -26,6 +26,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/keyconf"
 	"github.com/scionproto/scion/go/lib/scrypto"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/tools/scion-pki/internal/pkicmn"
 	"github.com/scionproto/scion/go/tools/scion-pki/internal/v2/conf"
 )
@@ -143,7 +144,7 @@ func genMasterKey() ([]byte, error) {
 		return nil, err
 	}
 	if n != 16 {
-		return nil, common.NewBasicError("not enough random bytes", nil)
+		return nil, serrors.New("not enough random bytes")
 	}
 	return key, nil
 }
diff --git a/go/tools/scion-pki/internal/v2/trcs/sign.go b/go/tools/scion-pki/internal/v2/trcs/sign.go
index 665b28c988..596f1ddfd4 100644
--- a/go/tools/scion-pki/internal/v2/trcs/sign.go
+++ b/go/tools/scion-pki/internal/v2/trcs/sign.go
@@ -23,6 +23,7 @@ import (
 	"github.com/scionproto/scion/go/lib/common"
 	"github.com/scionproto/scion/go/lib/scrypto"
 	"github.com/scionproto/scion/go/lib/scrypto/trc/v2"
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/tools/scion-pki/internal/pkicmn"
 	"github.com/scionproto/scion/go/tools/scion-pki/internal/v2/conf"
 )
@@ -140,7 +141,7 @@ func signTRC(t *trc.TRC, encoded trc.Encoded, primaryASes map[addr.AS]*asCfg) (
 		}
 	}
 	if len(signatures) == 0 {
-		return nil, common.NewBasicError("no signature generated", nil)
+		return nil, serrors.New("no signature generated")
 	}
 	signed := &trc.Signed{
 		EncodedTRC: encoded,
diff --git a/go/tools/scmp/cmn/common.go b/go/tools/scmp/cmn/common.go
index f76381e745..39f5567245 100644
--- a/go/tools/scmp/cmn/common.go
+++ b/go/tools/scmp/cmn/common.go
@@ -34,6 +34,7 @@ import (
 	"github.com/scionproto/scion/go/lib/sciond"
 	"github.com/scionproto/scion/go/lib/scmp"
 	_ "github.com/scionproto/scion/go/lib/scrypto" // Make sure math/rand is seeded
+	"github.com/scionproto/scion/go/lib/serrors"
 	"github.com/scionproto/scion/go/lib/snet"
 	"github.com/scionproto/scion/go/lib/sock/reliable"
 	"github.com/scionproto/scion/go/lib/spkt"
@@ -200,17 +201,17 @@ func Validate(pkt *spkt.ScnPkt) (*scmp.Hdr, *scmp.Payload, error) {
 	infoRev, ok := scmpPld.Info.(*scmp.InfoRevocation)
 	if !ok {
 		return scmpHdr, scmpPld,
-			common.NewBasicError("Failed to parse SCMP revocation Info", nil)
+			serrors.New("Failed to parse SCMP revocation Info")
 	}
 	signedRevInfo, err := path_mgmt.NewSignedRevInfoFromRaw(infoRev.RawSRev)
 	if err != nil {
 		return scmpHdr, scmpPld,
-			common.NewBasicError("Failed to decode SCMP signed revocation Info", nil)
+			serrors.New("Failed to decode SCMP signed revocation Info")
 	}
 	ri, err := signedRevInfo.RevInfo()
 	if err != nil {
 		return scmpHdr, scmpPld,
-			common.NewBasicError("Failed to decode SCMP revocation Info", nil)
+			serrors.New("Failed to decode SCMP revocation Info")
 	}
 	return scmpHdr, scmpPld, common.NewBasicError("", nil, "Revocation", ri)
 }

From 1a7cdf45b5784d7d2950f915778d9f553849b2e9 Mon Sep 17 00:00:00 2001
From: Lukas Vogel <lukedirtwalker@gmail.com>
Date: Mon, 7 Oct 2019 08:47:34 +0200
Subject: [PATCH 2/4] lint fixes

---
 go/beacon_srv/BUILD.bazel                     |   1 +
 go/beacon_srv/internal/beacon/BUILD.bazel     |   1 +
 go/beacon_srv/internal/beaconing/BUILD.bazel  |   2 +
 .../internal/beaconing/handler_test.go        |   4 +-
 .../internal/beaconstorage/BUILD.bazel        |   1 +
 go/beacon_srv/internal/config/BUILD.bazel     |   1 +
 go/beacon_srv/internal/ifstate/BUILD.bazel    |   1 +
 go/border/BUILD.bazel                         |   1 +
 go/cert_srv/BUILD.bazel                       |   1 +
 go/cert_srv/internal/config/BUILD.bazel       |   1 +
 go/cert_srv/internal/reiss/BUILD.bazel        |   2 +
 go/examples/discovery_client/BUILD.bazel      |   1 +
 go/godispatcher/BUILD.bazel                   |   1 +
 go/godispatcher/internal/config/BUILD.bazel   |   2 +-
 .../internal/registration/BUILD.bazel         |   1 +
 go/godispatcher/internal/respool/BUILD.bazel  |   1 +
 go/godispatcher/network/BUILD.bazel           |   1 +
 go/integration/cert_req/BUILD.bazel           |   1 +
 go/integration/end2end/BUILD.bazel            |   1 +
 go/lib/ctrl/seg/BUILD.bazel                   |   1 +
 go/lib/discovery/BUILD.bazel                  |   1 +
 go/lib/discovery/discoverypool/BUILD.bazel    |   1 +
 go/lib/discovery/topofetcher/BUILD.bazel      |   1 +
 go/lib/env/BUILD.bazel                        |   1 +
 go/lib/healthpool/BUILD.bazel                 |   1 +
 go/lib/hpkt/BUILD.bazel                       |   1 +
 go/lib/infra/disp/BUILD.bazel                 |   2 +
 go/lib/infra/messenger/BUILD.bazel            |   1 +
 go/lib/infra/modules/idiscovery/BUILD.bazel   |   1 +
 go/lib/infra/modules/itopo/BUILD.bazel        |   1 +
 go/lib/infra/modules/itopo/itopo.go.orig      | 372 ++++++++++++++++++
 go/lib/infra/modules/seghandler/BUILD.bazel   |   1 +
 go/lib/infra/modules/trust/BUILD.bazel        |   2 +-
 .../trust/trustdb/trustdbsqlite/BUILD.bazel   |   1 +
 go/lib/infra/rpc/BUILD.bazel                  |   2 +-
 go/lib/layers/BUILD.bazel                     |   1 +
 go/lib/log/BUILD.bazel                        |   1 +
 go/lib/overlay/BUILD.bazel                    |   1 +
 go/lib/overlay/conn/BUILD.bazel               |   1 +
 go/lib/pathdb/sqlite/BUILD.bazel              |   1 +
 go/lib/pathpol/BUILD.bazel                    |   1 +
 go/lib/pathstorage/BUILD.bazel                |   1 +
 go/lib/pktcls/BUILD.bazel                     |   1 +
 go/lib/revcache/BUILD.bazel                   |   1 +
 go/lib/sciond/pathprobe/BUILD.bazel           |   1 +
 go/lib/scmp/BUILD.bazel                       |   1 +
 go/lib/scrypto/BUILD.bazel                    |   1 +
 go/lib/snet/BUILD.bazel                       |   1 +
 go/lib/snet/squic/BUILD.bazel                 |   1 +
 go/lib/sock/reliable/BUILD.bazel              |   1 +
 go/lib/sock/reliable/reconnect/BUILD.bazel    |   1 +
 go/lib/svc/BUILD.bazel                        |   1 +
 go/lib/topology/BUILD.bazel                   |   1 +
 go/lib/truststorage/BUILD.bazel               |   1 +
 go/path_srv/internal/config/BUILD.bazel       |   2 +-
 go/path_srv/internal/handlers/BUILD.bazel     |   1 +
 go/path_srv/internal/segreq/BUILD.bazel       |   1 +
 go/path_srv/internal/segsyncer/BUILD.bazel    |   1 +
 go/protobuf/BUILD.bazel                       |  16 +
 go/sciond/internal/config/BUILD.bazel         |   1 +
 go/sciond/internal/fetcher/BUILD.bazel        |   1 +
 go/sciond/internal/servers/BUILD.bazel        |   1 +
 go/sig/BUILD.bazel                            |   1 +
 go/sig/internal/sigconfig/BUILD.bazel         |   2 +-
 go/tools/scion-pki/internal/conf/BUILD.bazel  |   1 +
 go/tools/scion-pki/internal/keys/BUILD.bazel  |   1 +
 .../scion-pki/internal/v2/keys/BUILD.bazel    |   1 +
 .../scion-pki/internal/v2/trcs/BUILD.bazel    |   1 +
 go/tools/scmp/cmn/BUILD.bazel                 |   1 +
 69 files changed, 459 insertions(+), 7 deletions(-)
 create mode 100644 go/lib/infra/modules/itopo/itopo.go.orig
 create mode 100644 go/protobuf/BUILD.bazel

diff --git a/go/beacon_srv/BUILD.bazel b/go/beacon_srv/BUILD.bazel
index 6cadeb9f49..76d17bc558 100644
--- a/go/beacon_srv/BUILD.bazel
+++ b/go/beacon_srv/BUILD.bazel
@@ -32,6 +32,7 @@ go_library(
         "//go/lib/periodic:go_default_library",
         "//go/lib/prom:go_default_library",
         "//go/lib/scrypto:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/sock/reliable:go_default_library",
         "//go/lib/sock/reliable/reconnect:go_default_library",
diff --git a/go/beacon_srv/internal/beacon/BUILD.bazel b/go/beacon_srv/internal/beacon/BUILD.bazel
index 209d78a993..ec05bf197a 100644
--- a/go/beacon_srv/internal/beacon/BUILD.bazel
+++ b/go/beacon_srv/internal/beacon/BUILD.bazel
@@ -22,6 +22,7 @@ go_library(
         "//go/lib/infra/modules/db:go_default_library",
         "//go/lib/log:go_default_library",
         "//go/lib/prom:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/spath:go_default_library",
         "//go/lib/util:go_default_library",
         "//go/proto:go_default_library",
diff --git a/go/beacon_srv/internal/beaconing/BUILD.bazel b/go/beacon_srv/internal/beaconing/BUILD.bazel
index 663ec3fb39..ca7b5886e6 100644
--- a/go/beacon_srv/internal/beaconing/BUILD.bazel
+++ b/go/beacon_srv/internal/beaconing/BUILD.bazel
@@ -31,6 +31,7 @@ go_library(
         "//go/lib/infra/modules/segverifier:go_default_library",
         "//go/lib/log:go_default_library",
         "//go/lib/periodic:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/snet/addrutil:go_default_library",
         "//go/lib/spath:go_default_library",
@@ -67,6 +68,7 @@ go_test(
         "//go/lib/log:go_default_library",
         "//go/lib/overlay:go_default_library",
         "//go/lib/scrypto:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/snet/mock_snet:go_default_library",
         "//go/lib/spath:go_default_library",
diff --git a/go/beacon_srv/internal/beaconing/handler_test.go b/go/beacon_srv/internal/beaconing/handler_test.go
index 843f2a97e8..833c9afba8 100644
--- a/go/beacon_srv/internal/beaconing/handler_test.go
+++ b/go/beacon_srv/internal/beaconing/handler_test.go
@@ -167,7 +167,7 @@ func TestNewHandler(t *testing.T) {
 		verifier.EXPECT().WithSrc(gomock.Any()).Return(verifier)
 		verifier.EXPECT().WithServer(gomock.Any()).Return(verifier)
 		verifier.EXPECT().Verify(gomock.Any(), gomock.Any(),
-						gomock.Any()).MaxTimes(2).Return(serrors.New("failed"))
+			gomock.Any()).MaxTimes(2).Return(serrors.New("failed"))
 
 		handler := NewHandler(localIA, intfs, inserter, verifier)
 		pseg := testBeacon(g, []common.IFIDType{graph.If_220_X_120_B, graph.If_120_A_110_X}).Segment
@@ -178,7 +178,7 @@ func TestNewHandler(t *testing.T) {
 		inserter := mock_beaconing.NewMockBeaconInserter(mctrl)
 		inserter.EXPECT().PreFilter(gomock.Any()).Return(nil)
 		inserter.EXPECT().InsertBeacon(gomock.Any(),
-						gomock.Any()).Return(beacon.InsertStats{}, serrors.New("failed"))
+			gomock.Any()).Return(beacon.InsertStats{}, serrors.New("failed"))
 
 		verifier := mock_infra.NewMockVerifier(mctrl)
 		verifier.EXPECT().WithServer(gomock.Any()).MaxTimes(2).Return(verifier)
diff --git a/go/beacon_srv/internal/beaconstorage/BUILD.bazel b/go/beacon_srv/internal/beaconstorage/BUILD.bazel
index 738bf09a6b..b4c05ed7fb 100644
--- a/go/beacon_srv/internal/beaconstorage/BUILD.bazel
+++ b/go/beacon_srv/internal/beaconstorage/BUILD.bazel
@@ -19,6 +19,7 @@ go_library(
         "//go/lib/infra/modules/cleaner:go_default_library",
         "//go/lib/infra/modules/db:go_default_library",
         "//go/lib/log:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/spath:go_default_library",
         "//go/lib/util:go_default_library",
         "//go/proto:go_default_library",
diff --git a/go/beacon_srv/internal/config/BUILD.bazel b/go/beacon_srv/internal/config/BUILD.bazel
index 467b0c2b14..f6c58211f6 100644
--- a/go/beacon_srv/internal/config/BUILD.bazel
+++ b/go/beacon_srv/internal/config/BUILD.bazel
@@ -15,6 +15,7 @@ go_library(
         "//go/lib/ctrl/path_mgmt:go_default_library",
         "//go/lib/env:go_default_library",
         "//go/lib/infra/modules/idiscovery:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/truststorage:go_default_library",
         "//go/lib/util:go_default_library",
     ],
diff --git a/go/beacon_srv/internal/ifstate/BUILD.bazel b/go/beacon_srv/internal/ifstate/BUILD.bazel
index 6b61770a98..8bc74a92af 100644
--- a/go/beacon_srv/internal/ifstate/BUILD.bazel
+++ b/go/beacon_srv/internal/ifstate/BUILD.bazel
@@ -21,6 +21,7 @@ go_library(
         "//go/lib/infra/messenger:go_default_library",
         "//go/lib/log:go_default_library",
         "//go/lib/periodic:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/topology:go_default_library",
         "//go/lib/util:go_default_library",
diff --git a/go/border/BUILD.bazel b/go/border/BUILD.bazel
index 20e7f2932f..1fef910b37 100644
--- a/go/border/BUILD.bazel
+++ b/go/border/BUILD.bazel
@@ -37,6 +37,7 @@ go_library(
         "//go/lib/ringbuf:go_default_library",
         "//go/lib/scmp:go_default_library",
         "//go/lib/scrypto:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/topology:go_default_library",
         "//go/proto:go_default_library",
         "@com_github_burntsushi_toml//:go_default_library",
diff --git a/go/cert_srv/BUILD.bazel b/go/cert_srv/BUILD.bazel
index 79f9d13f3a..92a9d32e9c 100644
--- a/go/cert_srv/BUILD.bazel
+++ b/go/cert_srv/BUILD.bazel
@@ -27,6 +27,7 @@ go_library(
         "//go/lib/log:go_default_library",
         "//go/lib/periodic:go_default_library",
         "//go/lib/prom:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/topology:go_default_library",
         "//go/proto:go_default_library",
diff --git a/go/cert_srv/internal/config/BUILD.bazel b/go/cert_srv/internal/config/BUILD.bazel
index 0671d972c8..50805c5676 100644
--- a/go/cert_srv/internal/config/BUILD.bazel
+++ b/go/cert_srv/internal/config/BUILD.bazel
@@ -19,6 +19,7 @@ go_library(
         "//go/lib/infra/modules/trust/trustdb:go_default_library",
         "//go/lib/keyconf:go_default_library",
         "//go/lib/scrypto/cert:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/truststorage:go_default_library",
         "//go/lib/util:go_default_library",
     ],
diff --git a/go/cert_srv/internal/reiss/BUILD.bazel b/go/cert_srv/internal/reiss/BUILD.bazel
index 38c41959f4..e67e41301a 100644
--- a/go/cert_srv/internal/reiss/BUILD.bazel
+++ b/go/cert_srv/internal/reiss/BUILD.bazel
@@ -25,6 +25,7 @@ go_library(
         "//go/lib/scrypto:go_default_library",
         "//go/lib/scrypto/cert:go_default_library",
         "//go/lib/scrypto/trc:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/util:go_default_library",
         "@org_golang_x_crypto//ed25519:go_default_library",
@@ -44,6 +45,7 @@ go_test(
         "//go/lib/periodic:go_default_library",
         "//go/lib/scrypto/cert:go_default_library",
         "//go/lib/scrypto/trc:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/xtest:go_default_library",
         "//go/lib/xtest/matchers:go_default_library",
         "@com_github_golang_mock//gomock:go_default_library",
diff --git a/go/examples/discovery_client/BUILD.bazel b/go/examples/discovery_client/BUILD.bazel
index 5ff7e47c2b..2b9bf31cde 100644
--- a/go/examples/discovery_client/BUILD.bazel
+++ b/go/examples/discovery_client/BUILD.bazel
@@ -13,6 +13,7 @@ go_library(
         "//go/lib/discovery/topofetcher:go_default_library",
         "//go/lib/log:go_default_library",
         "//go/lib/periodic:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/topology:go_default_library",
     ],
 )
diff --git a/go/godispatcher/BUILD.bazel b/go/godispatcher/BUILD.bazel
index e95561fa77..03472ecb02 100644
--- a/go/godispatcher/BUILD.bazel
+++ b/go/godispatcher/BUILD.bazel
@@ -14,6 +14,7 @@ go_library(
         "//go/lib/fatal:go_default_library",
         "//go/lib/log:go_default_library",
         "//go/lib/prom:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/util:go_default_library",
         "@com_github_burntsushi_toml//:go_default_library",
     ],
diff --git a/go/godispatcher/internal/config/BUILD.bazel b/go/godispatcher/internal/config/BUILD.bazel
index b4c2373ea7..0fb47d71c6 100644
--- a/go/godispatcher/internal/config/BUILD.bazel
+++ b/go/godispatcher/internal/config/BUILD.bazel
@@ -9,10 +9,10 @@ go_library(
     importpath = "github.com/scionproto/scion/go/godispatcher/internal/config",
     visibility = ["//go/godispatcher:__subpackages__"],
     deps = [
-        "//go/lib/common:go_default_library",
         "//go/lib/config:go_default_library",
         "//go/lib/env:go_default_library",
         "//go/lib/overlay:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/sock/reliable:go_default_library",
         "//go/lib/util:go_default_library",
     ],
diff --git a/go/godispatcher/internal/registration/BUILD.bazel b/go/godispatcher/internal/registration/BUILD.bazel
index 9d3b89507c..4957c98808 100644
--- a/go/godispatcher/internal/registration/BUILD.bazel
+++ b/go/godispatcher/internal/registration/BUILD.bazel
@@ -16,6 +16,7 @@ go_library(
     deps = [
         "//go/lib/addr:go_default_library",
         "//go/lib/common:go_default_library",
+        "//go/lib/serrors:go_default_library",
     ],
 )
 
diff --git a/go/godispatcher/internal/respool/BUILD.bazel b/go/godispatcher/internal/respool/BUILD.bazel
index 04fc2b7195..83703f89bd 100644
--- a/go/godispatcher/internal/respool/BUILD.bazel
+++ b/go/godispatcher/internal/respool/BUILD.bazel
@@ -13,6 +13,7 @@ go_library(
         "//go/lib/common:go_default_library",
         "//go/lib/hpkt:go_default_library",
         "//go/lib/overlay:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/spkt:go_default_library",
     ],
 )
diff --git a/go/godispatcher/network/BUILD.bazel b/go/godispatcher/network/BUILD.bazel
index 0a4ac07016..42db93721b 100644
--- a/go/godispatcher/network/BUILD.bazel
+++ b/go/godispatcher/network/BUILD.bazel
@@ -25,6 +25,7 @@ go_library(
         "//go/lib/overlay/conn:go_default_library",
         "//go/lib/ringbuf:go_default_library",
         "//go/lib/scmp:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/sock/reliable:go_default_library",
         "//go/lib/spkt:go_default_library",
     ],
diff --git a/go/integration/cert_req/BUILD.bazel b/go/integration/cert_req/BUILD.bazel
index 2cd5b2f43c..ef7e6361c8 100644
--- a/go/integration/cert_req/BUILD.bazel
+++ b/go/integration/cert_req/BUILD.bazel
@@ -18,6 +18,7 @@ go_library(
         "//go/lib/log:go_default_library",
         "//go/lib/scrypto:go_default_library",
         "//go/lib/scrypto/cert:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/proto:go_default_library",
     ],
diff --git a/go/integration/end2end/BUILD.bazel b/go/integration/end2end/BUILD.bazel
index 4e1ebc020c..874b841783 100644
--- a/go/integration/end2end/BUILD.bazel
+++ b/go/integration/end2end/BUILD.bazel
@@ -17,6 +17,7 @@ go_library(
         "//go/lib/overlay:go_default_library",
         "//go/lib/pathmgr:go_default_library",
         "//go/lib/sciond:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/sock/reliable:go_default_library",
         "//go/lib/spath:go_default_library",
diff --git a/go/lib/ctrl/seg/BUILD.bazel b/go/lib/ctrl/seg/BUILD.bazel
index d546136d1d..8fd5507611 100644
--- a/go/lib/ctrl/seg/BUILD.bazel
+++ b/go/lib/ctrl/seg/BUILD.bazel
@@ -17,6 +17,7 @@ go_library(
         "//go/lib/addr:go_default_library",
         "//go/lib/common:go_default_library",
         "//go/lib/scrypto:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/spath:go_default_library",
         "//go/lib/util:go_default_library",
         "//go/proto:go_default_library",
diff --git a/go/lib/discovery/BUILD.bazel b/go/lib/discovery/BUILD.bazel
index 2ba035e3e8..9fa8db7205 100644
--- a/go/lib/discovery/BUILD.bazel
+++ b/go/lib/discovery/BUILD.bazel
@@ -12,6 +12,7 @@ go_library(
         "//go/lib/addr:go_default_library",
         "//go/lib/common:go_default_library",
         "//go/lib/periodic:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/topology:go_default_library",
         "@org_golang_x_net//context/ctxhttp:go_default_library",
     ],
diff --git a/go/lib/discovery/discoverypool/BUILD.bazel b/go/lib/discovery/discoverypool/BUILD.bazel
index d7f488b8a7..a97583b93c 100644
--- a/go/lib/discovery/discoverypool/BUILD.bazel
+++ b/go/lib/discovery/discoverypool/BUILD.bazel
@@ -9,6 +9,7 @@ go_library(
         "//go/lib/common:go_default_library",
         "//go/lib/discovery:go_default_library",
         "//go/lib/discovery/discoveryinfo:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/topology:go_default_library",
     ],
 )
diff --git a/go/lib/discovery/topofetcher/BUILD.bazel b/go/lib/discovery/topofetcher/BUILD.bazel
index c5fb26b7c8..742324c1b8 100644
--- a/go/lib/discovery/topofetcher/BUILD.bazel
+++ b/go/lib/discovery/topofetcher/BUILD.bazel
@@ -9,6 +9,7 @@ go_library(
         "//go/lib/common:go_default_library",
         "//go/lib/discovery:go_default_library",
         "//go/lib/discovery/discoverypool:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/topology:go_default_library",
     ],
 )
diff --git a/go/lib/env/BUILD.bazel b/go/lib/env/BUILD.bazel
index 24fe5bc73f..00ca7a3e26 100644
--- a/go/lib/env/BUILD.bazel
+++ b/go/lib/env/BUILD.bazel
@@ -21,6 +21,7 @@ go_library(
         "//go/lib/overlay:go_default_library",
         "//go/lib/sciond:go_default_library",
         "//go/lib/scrypto:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/topology:go_default_library",
         "//go/lib/util:go_default_library",
diff --git a/go/lib/healthpool/BUILD.bazel b/go/lib/healthpool/BUILD.bazel
index b2c98cb548..6d059dc140 100644
--- a/go/lib/healthpool/BUILD.bazel
+++ b/go/lib/healthpool/BUILD.bazel
@@ -13,6 +13,7 @@ go_library(
     deps = [
         "//go/lib/common:go_default_library",
         "//go/lib/periodic:go_default_library",
+        "//go/lib/serrors:go_default_library",
     ],
 )
 
diff --git a/go/lib/hpkt/BUILD.bazel b/go/lib/hpkt/BUILD.bazel
index 4199d63722..51e3048b7f 100644
--- a/go/lib/hpkt/BUILD.bazel
+++ b/go/lib/hpkt/BUILD.bazel
@@ -15,6 +15,7 @@ go_library(
         "//go/lib/l4:go_default_library",
         "//go/lib/layers:go_default_library",
         "//go/lib/scmp:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/spath:go_default_library",
         "//go/lib/spkt:go_default_library",
         "//go/lib/util:go_default_library",
diff --git a/go/lib/infra/disp/BUILD.bazel b/go/lib/infra/disp/BUILD.bazel
index 78dc045a6f..eedbc3cc88 100644
--- a/go/lib/infra/disp/BUILD.bazel
+++ b/go/lib/infra/disp/BUILD.bazel
@@ -13,6 +13,7 @@ go_library(
         "//go/lib/common:go_default_library",
         "//go/lib/infra:go_default_library",
         "//go/lib/log:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/proto:go_default_library",
     ],
 )
@@ -28,6 +29,7 @@ go_test(
     deps = [
         "//go/lib/common:go_default_library",
         "//go/lib/log:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/xtest:go_default_library",
         "//go/lib/xtest/p2p:go_default_library",
         "//go/proto:go_default_library",
diff --git a/go/lib/infra/messenger/BUILD.bazel b/go/lib/infra/messenger/BUILD.bazel
index a311bd30df..0a5a887308 100644
--- a/go/lib/infra/messenger/BUILD.bazel
+++ b/go/lib/infra/messenger/BUILD.bazel
@@ -33,6 +33,7 @@ go_library(
         "//go/lib/overlay:go_default_library",
         "//go/lib/prom:go_default_library",
         "//go/lib/scrypto:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/svc:go_default_library",
         "//go/lib/topology:go_default_library",
diff --git a/go/lib/infra/modules/idiscovery/BUILD.bazel b/go/lib/infra/modules/idiscovery/BUILD.bazel
index aa87cca07f..b2bcb4d5e9 100644
--- a/go/lib/infra/modules/idiscovery/BUILD.bazel
+++ b/go/lib/infra/modules/idiscovery/BUILD.bazel
@@ -19,6 +19,7 @@ go_library(
         "//go/lib/infra/modules/itopo:go_default_library",
         "//go/lib/log:go_default_library",
         "//go/lib/periodic:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/topology:go_default_library",
         "//go/lib/util:go_default_library",
     ],
diff --git a/go/lib/infra/modules/itopo/BUILD.bazel b/go/lib/infra/modules/itopo/BUILD.bazel
index 4fb350a3e2..86586f882a 100644
--- a/go/lib/infra/modules/itopo/BUILD.bazel
+++ b/go/lib/infra/modules/itopo/BUILD.bazel
@@ -15,6 +15,7 @@ go_library(
         "//go/lib/infra/modules/itopo/internal/metrics:go_default_library",
         "//go/lib/log:go_default_library",
         "//go/lib/periodic:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/topology:go_default_library",
         "//go/proto:go_default_library",
         "@com_github_google_go_cmp//cmp:go_default_library",
diff --git a/go/lib/infra/modules/itopo/itopo.go.orig b/go/lib/infra/modules/itopo/itopo.go.orig
new file mode 100644
index 0000000000..2175b877b7
--- /dev/null
+++ b/go/lib/infra/modules/itopo/itopo.go.orig
@@ -0,0 +1,372 @@
+// Copyright 2018 ETH Zurich
+// Copyright 2019 ETH Zurich, Anapaya Systems
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//   http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package itopo
+
+import (
+	"sync"
+	"time"
+
+	"github.com/google/go-cmp/cmp"
+	"github.com/google/go-cmp/cmp/cmpopts"
+
+	"github.com/scionproto/scion/go/lib/common"
+	"github.com/scionproto/scion/go/lib/infra/modules/itopo/internal/metrics"
+	"github.com/scionproto/scion/go/lib/log"
+	"github.com/scionproto/scion/go/lib/serrors"
+	"github.com/scionproto/scion/go/lib/topology"
+	"github.com/scionproto/scion/go/proto"
+)
+
+var st *state
+
+// Callbacks are callbacks to respond to specific topology update events.
+type Callbacks struct {
+	// CleanDynamic is called whenever dynamic topology is dropped due to expiration.
+	CleanDynamic func()
+	// DropDynamic is called whenever dynamic topology is dropped due to static update.
+	DropDynamic func()
+	// UpdateStatic is called whenever the pointer to static topology is updated.
+	UpdateStatic func()
+}
+
+// providerFunc wraps the Get call as a topology provider.
+type providerFunc func() *topology.Topo
+
+// Provider returns a topology provider that calls Get internally.
+func Provider() topology.Provider {
+	st.RLock()
+	defer st.RUnlock()
+	if st.topo.static == nil {
+		panic("static topology not found")
+	}
+	return providerFunc(Get)
+}
+
+func (f providerFunc) Get() *topology.Topo {
+	return f()
+}
+
+// Init initializes itopo with the particular validator. A topology must be
+// initialized by calling SetStatic.
+func Init(id string, svc proto.ServiceType, clbks Callbacks) {
+	if st != nil {
+		panic("Must not re-initialize itopo")
+	}
+	st = newState(id, svc, clbks)
+}
+
+// Get atomically gets the pointer to the current topology.
+func Get() *topology.Topo {
+	st.RLock()
+	defer st.RUnlock()
+	return st.topo.Get()
+}
+
+// SetDynamic atomically sets the dynamic topology. The returned topology is a pointer
+// to the currently active topology at the end of the function call. It might differ from
+// the input topology. The second return value indicates whether the in-memory
+// copy of the dynamic topology has been updated.
+func SetDynamic(dynamic *topology.Topo) (*topology.Topo, bool, error) {
+	l := metrics.UpdateLabels{Type: metrics.Dynamic}
+	topo, updated, err := st.setDynamic(dynamic)
+	switch {
+	case err != nil:
+		l.Result = metrics.ErrValidate
+	case updated:
+		l.Result = metrics.Success
+	default:
+		l.Result = metrics.OkIgnored
+	}
+	incUpdateMetric(l)
+	return topo, updated, err
+}
+
+// BeginSetDynamic checks whether setting the dynamic topology is permissible. The returned
+// transaction provides a view on which topology would be active, if committed.
+func BeginSetDynamic(dynamic *topology.Topo) (Transaction, error) {
+	tx, err := st.beginSetDynamic(dynamic)
+	if err != nil {
+		incUpdateMetric(metrics.UpdateLabels{Type: metrics.Dynamic, Result: metrics.ErrValidate})
+	}
+	return tx, err
+}
+
+// SetStatic atomically sets the static topology. Whether semi-mutable fields are
+// allowed to change can be specified using semiMutAllowed. The returned
+// topology is a pointer to the currently active topology at the end of the function call.
+// It might differ from the input topology (same contents as existing static,
+// or dynamic set and still valid). The second return value indicates whether the in-memory
+// copy of the static topology has been updated.
+func SetStatic(static *topology.Topo, semiMutAllowed bool) (*topology.Topo, bool, error) {
+	l := metrics.UpdateLabels{Type: metrics.Static}
+	topo, updated, err := st.setStatic(static, semiMutAllowed)
+	switch {
+	case err != nil:
+		l.Result = metrics.ErrValidate
+	case updated:
+		l.Result = metrics.Success
+	default:
+		l.Result = metrics.OkIgnored
+	}
+	incUpdateMetric(l)
+	return topo, updated, err
+}
+
+// BeginSetStatic checks whether setting the static topology is permissible. The returned
+// transaction provides a view on which topology would be active, if committed.
+func BeginSetStatic(static *topology.Topo, semiMutAllowed bool) (Transaction, error) {
+	tx, err := st.beginSetStatic(static, semiMutAllowed)
+	if err != nil {
+		incUpdateMetric(metrics.UpdateLabels{Type: metrics.Static, Result: metrics.ErrValidate})
+	}
+	return tx, err
+}
+
+// Transaction allows to get a view on which topology will be active without committing
+// to the topology update yet.
+type Transaction struct {
+	// candidateTopo contains the view of what the static and dynamic topologies
+	// will be when the transaction is successfully committed.
+	candidateTopo topo
+	// staticAtTxStart stores a snapshot of the currently active static
+	// topology at transaction start.
+	staticAtTxStart *topology.Topo
+	// inputStatic stores the provided static topology.
+	inputStatic *topology.Topo
+	// inputDynamic stores the provided dynamic topology.
+	inputDynamic *topology.Topo
+}
+
+// Commit commits the change. An error is returned, if the static topology changed in the meantime.
+func (tx *Transaction) Commit() error {
+	st.Lock()
+	defer st.Unlock()
+	l := metrics.UpdateLabels{Type: metrics.Dynamic}
+	if tx.inputStatic != nil {
+		l.Type = metrics.Static
+	}
+	if tx.staticAtTxStart != st.topo.static {
+<<<<<<< 219ddaa7f3728ece29edf1de726456d18c30fb43
+		incUpdateMetric(l.WithResult(metrics.ErrCommit))
+		return common.NewBasicError("Static topology changed in the meantime", nil)
+=======
+		return serrors.New("Static topology changed in the meantime")
+>>>>>>> Use serrors.New instead of common.NewBasicError
+	}
+	if !tx.IsUpdate() {
+		incUpdateMetric(l.WithResult(metrics.OkIgnored))
+		return nil
+	}
+	// Do transaction for static topology updated.
+	if tx.inputStatic != nil {
+		st.updateStatic(tx.inputStatic)
+		incUpdateMetric(l.WithResult(metrics.Success))
+		return nil
+	}
+	// Do transaction from dynamic topology update.
+	st.updateDynamic(tx.inputDynamic)
+	incUpdateMetric(l.WithResult(metrics.Success))
+	return nil
+}
+
+// Get returns the topology that will be active if the transaction is committed.
+func (tx *Transaction) Get() *topology.Topo {
+	return tx.candidateTopo.Get()
+}
+
+// IsUpdate indicates whether the transaction will cause an update.
+func (tx *Transaction) IsUpdate() bool {
+	if tx.inputStatic != nil {
+		return tx.candidateTopo.static == tx.inputStatic
+	}
+	return tx.candidateTopo.dynamic == tx.inputDynamic
+}
+
+// topo stores the currently active static and dynamic topologies.
+type topo struct {
+	static  *topology.Topo
+	dynamic *topology.Topo
+}
+
+// Get returns the dynamic topology if it is set and has not expired. Otherwise,
+// the static topology is returned.
+func (t *topo) Get() *topology.Topo {
+	if t.dynamic != nil && t.dynamic.Active(time.Now()) {
+		return t.dynamic
+	}
+	return t.static
+}
+
+// state keeps track of the active topologies and enforces update rules.
+type state struct {
+	sync.RWMutex
+	topo      topo
+	validator validator
+	clbks     Callbacks
+}
+
+func newState(id string, svc proto.ServiceType, clbks Callbacks) *state {
+	s := &state{
+		validator: validatorFactory(id, svc),
+		clbks:     clbks,
+	}
+	return s
+}
+
+// setDynamic atomically sets the dynamic topology.
+func (s *state) setDynamic(dynamic *topology.Topo) (*topology.Topo, bool, error) {
+	s.Lock()
+	defer s.Unlock()
+	if err := s.dynamicPreCheck(dynamic); err != nil {
+		return nil, false, err
+	}
+	if err := s.validator.Validate(dynamic, s.topo.static, false); err != nil {
+		return nil, false, err
+	}
+	if keepOld(dynamic, s.topo.dynamic) {
+		return s.topo.Get(), false, nil
+	}
+	s.updateDynamic(dynamic)
+	return s.topo.Get(), true, nil
+}
+
+func (s *state) updateDynamic(dynamic *topology.Topo) {
+	s.topo.dynamic = dynamic
+	cl := metrics.CurrentLabels{Type: metrics.Dynamic}
+	metrics.Current.Active().Set(1)
+	metrics.Current.Timestamp(cl).Set(metrics.Timestamp(dynamic.Timestamp))
+	metrics.Current.Expiry(cl).Set(metrics.Expiry(dynamic.Expiry()))
+}
+
+func (s *state) beginSetDynamic(dynamic *topology.Topo) (Transaction, error) {
+	s.Lock()
+	defer s.Unlock()
+	if err := s.dynamicPreCheck(dynamic); err != nil {
+		return Transaction{}, err
+	}
+	if err := s.validator.Validate(dynamic, s.topo.static, false); err != nil {
+		return Transaction{}, err
+	}
+	tx := Transaction{
+		candidateTopo:   s.topo,
+		staticAtTxStart: s.topo.static,
+		inputDynamic:    dynamic,
+	}
+	if !keepOld(tx.inputDynamic, tx.candidateTopo.dynamic) {
+		// The dynamic topology is only updated if it differs and is valid longer.
+		tx.candidateTopo.dynamic = dynamic
+	}
+	return tx, nil
+}
+
+func (s *state) dynamicPreCheck(dynamic *topology.Topo) error {
+	if dynamic == nil {
+		return serrors.New("Provided topology must not be nil")
+	}
+	if s.topo.static == nil {
+		return serrors.New("Static topology must be set")
+	}
+	now := time.Now()
+	if !dynamic.Active(now) {
+		return common.NewBasicError("Dynamic topology must be active", nil,
+			"ts", dynamic.Timestamp, "now", now, "expiry", dynamic.Expiry())
+	}
+	return nil
+}
+
+// setStatic atomically sets the static topology.
+func (s *state) setStatic(static *topology.Topo, allowed bool) (*topology.Topo, bool, error) {
+	s.Lock()
+	defer s.Unlock()
+	if err := s.validator.Validate(static, s.topo.static, allowed); err != nil {
+		return nil, false, err
+	}
+	// Only update static topology if the new one is different or valid for longer.
+	if keepOld(static, s.topo.static) {
+		return s.topo.Get(), false, nil
+	}
+	s.updateStatic(static)
+	return s.topo.Get(), true, nil
+}
+
+func (s *state) beginSetStatic(static *topology.Topo, allowed bool) (Transaction, error) {
+	s.Lock()
+	defer s.Unlock()
+	if err := s.validator.Validate(static, s.topo.static, allowed); err != nil {
+		return Transaction{}, err
+	}
+	tx := Transaction{
+		candidateTopo:   s.topo,
+		staticAtTxStart: s.topo.static,
+		inputStatic:     static,
+	}
+	if keepOld(tx.inputStatic, tx.staticAtTxStart) {
+		return tx, nil
+	}
+	// Drop dynamic from candidate topo if it will be dropped when committing the transaction.
+	if s.validator.MustDropDynamic(tx.inputStatic, tx.staticAtTxStart) {
+		tx.candidateTopo.dynamic = nil
+	}
+	tx.candidateTopo.static = static
+	return tx, nil
+}
+
+// updateStatic updates the static topology, if necessary, and calls the corresponding callbacks.
+func (s *state) updateStatic(static *topology.Topo) {
+	// Drop dynamic topology if necessary.
+	if s.validator.MustDropDynamic(static, s.topo.static) && s.topo.dynamic != nil {
+		s.topo.dynamic = nil
+		call(s.clbks.DropDynamic)
+		metrics.Current.Active().Set(0)
+	}
+	s.topo.static = static
+	call(s.clbks.UpdateStatic)
+	cl := metrics.CurrentLabels{Type: metrics.Static}
+	metrics.Current.Timestamp(cl).Set(metrics.Timestamp(static.Timestamp))
+	metrics.Current.Expiry(cl).Set(metrics.Expiry(static.Expiry()))
+}
+
+func keepOld(newTopo, oldTopo *topology.Topo) bool {
+	return topoEq(newTopo, oldTopo) && !expiresLater(newTopo, oldTopo)
+}
+
+func topoEq(newTopo, oldTopo *topology.Topo) bool {
+	return cmp.Equal(newTopo, oldTopo, cmpopts.IgnoreFields(
+		topology.Topo{}, "Timestamp", "TimestampHuman", "TTL"))
+}
+
+func expiresLater(newTopo, oldTopo *topology.Topo) bool {
+	if oldTopo == nil {
+		return true
+	}
+	newExpiry := newTopo.Expiry()
+	oldExpiry := oldTopo.Expiry()
+	return !oldExpiry.IsZero() && (newExpiry.IsZero() || newExpiry.After(oldExpiry))
+}
+
+func call(clbk func()) {
+	if clbk != nil {
+		go func() {
+			defer log.LogPanicAndExit()
+			clbk()
+		}()
+	}
+}
+
+func incUpdateMetric(l metrics.UpdateLabels) {
+	metrics.Updates.Last(l).SetToCurrentTime()
+	metrics.Updates.Total(l).Inc()
+}
diff --git a/go/lib/infra/modules/seghandler/BUILD.bazel b/go/lib/infra/modules/seghandler/BUILD.bazel
index c5e0793c8c..7169e340ce 100644
--- a/go/lib/infra/modules/seghandler/BUILD.bazel
+++ b/go/lib/infra/modules/seghandler/BUILD.bazel
@@ -42,6 +42,7 @@ go_test(
         "//go/lib/mocks/net/mock_net:go_default_library",
         "//go/lib/pathdb:go_default_library",
         "//go/lib/pathdb/mock_pathdb:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/xtest:go_default_library",
         "//go/lib/xtest/graph:go_default_library",
         "//go/proto:go_default_library",
diff --git a/go/lib/infra/modules/trust/BUILD.bazel b/go/lib/infra/modules/trust/BUILD.bazel
index 8a6e6d461a..51c768e664 100644
--- a/go/lib/infra/modules/trust/BUILD.bazel
+++ b/go/lib/infra/modules/trust/BUILD.bazel
@@ -49,7 +49,6 @@ go_test(
     embed = [":go_default_library"],
     deps = [
         "//go/lib/addr:go_default_library",
-        "//go/lib/common:go_default_library",
         "//go/lib/ctrl:go_default_library",
         "//go/lib/ctrl/cert_mgmt:go_default_library",
         "//go/lib/infra:go_default_library",
@@ -61,6 +60,7 @@ go_test(
         "//go/lib/scrypto:go_default_library",
         "//go/lib/scrypto/cert:go_default_library",
         "//go/lib/scrypto/trc:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/topology:go_default_library",
         "//go/lib/topology/topotestutil:go_default_library",
diff --git a/go/lib/infra/modules/trust/trustdb/trustdbsqlite/BUILD.bazel b/go/lib/infra/modules/trust/trustdb/trustdbsqlite/BUILD.bazel
index 9de9d4ce80..0427097b5d 100644
--- a/go/lib/infra/modules/trust/trustdb/trustdbsqlite/BUILD.bazel
+++ b/go/lib/infra/modules/trust/trustdb/trustdbsqlite/BUILD.bazel
@@ -14,6 +14,7 @@ go_library(
         "//go/lib/scrypto:go_default_library",
         "//go/lib/scrypto/cert:go_default_library",
         "//go/lib/scrypto/trc:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "@com_github_mattn_go_sqlite3//:go_default_library",
     ],
 )
diff --git a/go/lib/infra/rpc/BUILD.bazel b/go/lib/infra/rpc/BUILD.bazel
index f90a146442..807c89e9f2 100644
--- a/go/lib/infra/rpc/BUILD.bazel
+++ b/go/lib/infra/rpc/BUILD.bazel
@@ -9,8 +9,8 @@ go_library(
     importpath = "github.com/scionproto/scion/go/lib/infra/rpc",
     visibility = ["//visibility:public"],
     deps = [
-        "//go/lib/common:go_default_library",
         "//go/lib/log:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/proto:go_default_library",
         "@com_github_lucas_clemente_quic_go//:go_default_library",
diff --git a/go/lib/layers/BUILD.bazel b/go/lib/layers/BUILD.bazel
index e5243dc2ad..35870e990f 100644
--- a/go/lib/layers/BUILD.bazel
+++ b/go/lib/layers/BUILD.bazel
@@ -11,6 +11,7 @@ go_library(
     visibility = ["//visibility:public"],
     deps = [
         "//go/lib/common:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/util:go_default_library",
         "@com_github_google_gopacket//:go_default_library",
         "@com_github_google_gopacket//layers:go_default_library",
diff --git a/go/lib/log/BUILD.bazel b/go/lib/log/BUILD.bazel
index 1016e920af..c16f6c7be7 100644
--- a/go/lib/log/BUILD.bazel
+++ b/go/lib/log/BUILD.bazel
@@ -13,6 +13,7 @@ go_library(
     visibility = ["//visibility:public"],
     deps = [
         "//go/lib/common:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "@com_github_inconshreveable_log15//:go_default_library",
         "@com_github_inconshreveable_log15//ext:go_default_library",
         #"@com_github_inconshreveable_log15_ext//:go_default_library",
diff --git a/go/lib/overlay/BUILD.bazel b/go/lib/overlay/BUILD.bazel
index ceade32c5c..2bdeec305a 100644
--- a/go/lib/overlay/BUILD.bazel
+++ b/go/lib/overlay/BUILD.bazel
@@ -11,5 +11,6 @@ go_library(
     deps = [
         "//go/lib/addr:go_default_library",
         "//go/lib/common:go_default_library",
+        "//go/lib/serrors:go_default_library",
     ],
 )
diff --git a/go/lib/overlay/conn/BUILD.bazel b/go/lib/overlay/conn/BUILD.bazel
index f8d48af29c..7b9ca2c0f5 100644
--- a/go/lib/overlay/conn/BUILD.bazel
+++ b/go/lib/overlay/conn/BUILD.bazel
@@ -12,6 +12,7 @@ go_library(
             "//go/lib/common:go_default_library",
             "//go/lib/log:go_default_library",
             "//go/lib/overlay:go_default_library",
+            "//go/lib/serrors:go_default_library",
             "//go/lib/sockctrl:go_default_library",
             "@org_golang_x_net//ipv4:go_default_library",
             "@org_golang_x_net//ipv6:go_default_library",
diff --git a/go/lib/pathdb/sqlite/BUILD.bazel b/go/lib/pathdb/sqlite/BUILD.bazel
index d12b618729..f8ce4b7a2c 100644
--- a/go/lib/pathdb/sqlite/BUILD.bazel
+++ b/go/lib/pathdb/sqlite/BUILD.bazel
@@ -16,6 +16,7 @@ go_library(
         "//go/lib/log:go_default_library",
         "//go/lib/pathdb:go_default_library",
         "//go/lib/pathdb/query:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/proto:go_default_library",
         "@com_github_mattn_go_sqlite3//:go_default_library",
     ],
diff --git a/go/lib/pathpol/BUILD.bazel b/go/lib/pathpol/BUILD.bazel
index 8f21aeae8b..cb5e759b45 100644
--- a/go/lib/pathpol/BUILD.bazel
+++ b/go/lib/pathpol/BUILD.bazel
@@ -16,6 +16,7 @@ go_library(
         "//go/lib/common:go_default_library",
         "//go/lib/log:go_default_library",
         "//go/lib/pathpol/sequence:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "@com_github_antlr_antlr4//runtime/Go/antlr:go_default_library",
     ],
 )
diff --git a/go/lib/pathstorage/BUILD.bazel b/go/lib/pathstorage/BUILD.bazel
index e7c0f728f6..325732cfa1 100644
--- a/go/lib/pathstorage/BUILD.bazel
+++ b/go/lib/pathstorage/BUILD.bazel
@@ -17,6 +17,7 @@ go_library(
         "//go/lib/pathdb/sqlite:go_default_library",
         "//go/lib/revcache:go_default_library",
         "//go/lib/revcache/memrevcache:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/util:go_default_library",
     ],
 )
diff --git a/go/lib/pktcls/BUILD.bazel b/go/lib/pktcls/BUILD.bazel
index ec38b2eb20..780cb29e46 100644
--- a/go/lib/pktcls/BUILD.bazel
+++ b/go/lib/pktcls/BUILD.bazel
@@ -14,6 +14,7 @@ go_library(
     visibility = ["//visibility:public"],
     deps = [
         "//go/lib/common:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "@com_github_google_gopacket//:go_default_library",
         "@com_github_google_gopacket//layers:go_default_library",
     ],
diff --git a/go/lib/revcache/BUILD.bazel b/go/lib/revcache/BUILD.bazel
index ef32a9cd82..d7a109c831 100644
--- a/go/lib/revcache/BUILD.bazel
+++ b/go/lib/revcache/BUILD.bazel
@@ -29,6 +29,7 @@ go_test(
         "//go/lib/ctrl/seg:go_default_library",
         "//go/lib/infra:go_default_library",
         "//go/lib/revcache/mock_revcache:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/util:go_default_library",
         "//go/lib/xtest:go_default_library",
         "//go/lib/xtest/graph:go_default_library",
diff --git a/go/lib/sciond/pathprobe/BUILD.bazel b/go/lib/sciond/pathprobe/BUILD.bazel
index 4a3d46edd0..a03da74669 100644
--- a/go/lib/sciond/pathprobe/BUILD.bazel
+++ b/go/lib/sciond/pathprobe/BUILD.bazel
@@ -11,6 +11,7 @@ go_library(
         "//go/lib/log:go_default_library",
         "//go/lib/sciond:go_default_library",
         "//go/lib/scmp:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/sock/reliable:go_default_library",
         "//go/lib/spath:go_default_library",
diff --git a/go/lib/scmp/BUILD.bazel b/go/lib/scmp/BUILD.bazel
index 0cc05ca1b4..9d9d7a2d98 100644
--- a/go/lib/scmp/BUILD.bazel
+++ b/go/lib/scmp/BUILD.bazel
@@ -20,6 +20,7 @@ go_library(
         "//go/lib/common:go_default_library",
         "//go/lib/ctrl/path_mgmt:go_default_library",
         "//go/lib/l4:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/util:go_default_library",
         "@in_gopkg_restruct_v1//:go_default_library",
     ],
diff --git a/go/lib/scrypto/BUILD.bazel b/go/lib/scrypto/BUILD.bazel
index c2c059e9ab..edafa74da2 100644
--- a/go/lib/scrypto/BUILD.bazel
+++ b/go/lib/scrypto/BUILD.bazel
@@ -15,6 +15,7 @@ go_library(
     visibility = ["//visibility:public"],
     deps = [
         "//go/lib/common:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/util:go_default_library",
         "@com_github_dchest_cmac//:go_default_library",
         "@org_golang_x_crypto//ed25519:go_default_library",
diff --git a/go/lib/snet/BUILD.bazel b/go/lib/snet/BUILD.bazel
index 9a16248cd7..0372322a29 100644
--- a/go/lib/snet/BUILD.bazel
+++ b/go/lib/snet/BUILD.bazel
@@ -26,6 +26,7 @@ go_library(
         "//go/lib/pathmgr:go_default_library",
         "//go/lib/sciond:go_default_library",
         "//go/lib/scmp:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet/internal/ctxmonitor:go_default_library",
         "//go/lib/snet/internal/pathsource:go_default_library",
         "//go/lib/sock/reliable:go_default_library",
diff --git a/go/lib/snet/squic/BUILD.bazel b/go/lib/snet/squic/BUILD.bazel
index 893856705c..c45f3bb8c2 100644
--- a/go/lib/snet/squic/BUILD.bazel
+++ b/go/lib/snet/squic/BUILD.bazel
@@ -8,6 +8,7 @@ go_library(
     deps = [
         "//go/lib/addr:go_default_library",
         "//go/lib/common:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "@com_github_lucas_clemente_quic_go//:go_default_library",
     ],
diff --git a/go/lib/sock/reliable/BUILD.bazel b/go/lib/sock/reliable/BUILD.bazel
index ad4b3c4bc1..3933319f55 100644
--- a/go/lib/sock/reliable/BUILD.bazel
+++ b/go/lib/sock/reliable/BUILD.bazel
@@ -16,6 +16,7 @@ go_library(
         "//go/lib/addr:go_default_library",
         "//go/lib/common:go_default_library",
         "//go/lib/overlay:go_default_library",
+        "//go/lib/serrors:go_default_library",
     ],
 )
 
diff --git a/go/lib/sock/reliable/reconnect/BUILD.bazel b/go/lib/sock/reliable/reconnect/BUILD.bazel
index 57e1c97ef0..14d28cf838 100644
--- a/go/lib/sock/reliable/reconnect/BUILD.bazel
+++ b/go/lib/sock/reliable/reconnect/BUILD.bazel
@@ -38,6 +38,7 @@ go_test(
         "//go/lib/log:go_default_library",
         "//go/lib/mocks/net/mock_net:go_default_library",
         "//go/lib/overlay:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/sock/reliable/mock_reliable:go_default_library",
         "//go/lib/sock/reliable/reconnect/mock_reconnect:go_default_library",
diff --git a/go/lib/svc/BUILD.bazel b/go/lib/svc/BUILD.bazel
index c683518960..fdac246642 100644
--- a/go/lib/svc/BUILD.bazel
+++ b/go/lib/svc/BUILD.bazel
@@ -36,6 +36,7 @@ go_test(
         "//go/lib/ctrl:go_default_library",
         "//go/lib/l4:go_default_library",
         "//go/lib/overlay:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/snet/mock_snet:go_default_library",
         "//go/lib/spath:go_default_library",
diff --git a/go/lib/topology/BUILD.bazel b/go/lib/topology/BUILD.bazel
index 2400b1a1d2..8d8074d474 100644
--- a/go/lib/topology/BUILD.bazel
+++ b/go/lib/topology/BUILD.bazel
@@ -17,6 +17,7 @@ go_library(
         "//go/lib/addr:go_default_library",
         "//go/lib/common:go_default_library",
         "//go/lib/overlay:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/proto:go_default_library",
     ],
 )
diff --git a/go/lib/truststorage/BUILD.bazel b/go/lib/truststorage/BUILD.bazel
index f59dcccc7b..788a653478 100644
--- a/go/lib/truststorage/BUILD.bazel
+++ b/go/lib/truststorage/BUILD.bazel
@@ -15,6 +15,7 @@ go_library(
         "//go/lib/infra/modules/trust/trustdb:go_default_library",
         "//go/lib/infra/modules/trust/trustdb/trustdbsqlite:go_default_library",
         "//go/lib/log:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/util:go_default_library",
     ],
 )
diff --git a/go/path_srv/internal/config/BUILD.bazel b/go/path_srv/internal/config/BUILD.bazel
index cc6a2d2594..2413fd7505 100644
--- a/go/path_srv/internal/config/BUILD.bazel
+++ b/go/path_srv/internal/config/BUILD.bazel
@@ -9,11 +9,11 @@ go_library(
     importpath = "github.com/scionproto/scion/go/path_srv/internal/config",
     visibility = ["//go/path_srv:__subpackages__"],
     deps = [
-        "//go/lib/common:go_default_library",
         "//go/lib/config:go_default_library",
         "//go/lib/env:go_default_library",
         "//go/lib/infra/modules/idiscovery:go_default_library",
         "//go/lib/pathstorage:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/truststorage:go_default_library",
         "//go/lib/util:go_default_library",
     ],
diff --git a/go/path_srv/internal/handlers/BUILD.bazel b/go/path_srv/internal/handlers/BUILD.bazel
index 8e1dfff672..7d9566ccf3 100644
--- a/go/path_srv/internal/handlers/BUILD.bazel
+++ b/go/path_srv/internal/handlers/BUILD.bazel
@@ -48,6 +48,7 @@ go_test(
         "//go/lib/revcache:go_default_library",
         "//go/lib/revcache/memrevcache:go_default_library",
         "//go/lib/revcache/mock_revcache:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/xtest:go_default_library",
         "//go/lib/xtest/graph:go_default_library",
         "@com_github_golang_mock//gomock:go_default_library",
diff --git a/go/path_srv/internal/segreq/BUILD.bazel b/go/path_srv/internal/segreq/BUILD.bazel
index 3cc5a6ee5e..8828e43fe0 100644
--- a/go/path_srv/internal/segreq/BUILD.bazel
+++ b/go/path_srv/internal/segreq/BUILD.bazel
@@ -25,6 +25,7 @@ go_library(
         "//go/lib/pathdb:go_default_library",
         "//go/lib/pathdb/query:go_default_library",
         "//go/lib/revcache:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet/addrutil:go_default_library",
         "//go/lib/topology:go_default_library",
         "//go/path_srv/internal/handlers:go_default_library",
diff --git a/go/path_srv/internal/segsyncer/BUILD.bazel b/go/path_srv/internal/segsyncer/BUILD.bazel
index 2a428670ea..ecc025b1dd 100644
--- a/go/path_srv/internal/segsyncer/BUILD.bazel
+++ b/go/path_srv/internal/segsyncer/BUILD.bazel
@@ -17,6 +17,7 @@ go_library(
         "//go/lib/pathdb/query:go_default_library",
         "//go/lib/periodic:go_default_library",
         "//go/lib/revcache:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet/addrutil:go_default_library",
         "//go/lib/topology:go_default_library",
         "//go/path_srv/internal/handlers:go_default_library",
diff --git a/go/protobuf/BUILD.bazel b/go/protobuf/BUILD.bazel
new file mode 100644
index 0000000000..fe9a5b973d
--- /dev/null
+++ b/go/protobuf/BUILD.bazel
@@ -0,0 +1,16 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = [
+        "common.pb.go",
+        "conf_agent.pb.go",
+        "sig_mgmt.pb.go",
+    ],
+    importpath = "github.com/scionproto/scion/go/protobuf",
+    visibility = ["//visibility:public"],
+    deps = [
+        "@com_github_golang_protobuf//proto:go_default_library",
+        "@org_golang_google_grpc//:go_default_library",
+    ],
+)
diff --git a/go/sciond/internal/config/BUILD.bazel b/go/sciond/internal/config/BUILD.bazel
index fc5130ac74..95d19c9e3f 100644
--- a/go/sciond/internal/config/BUILD.bazel
+++ b/go/sciond/internal/config/BUILD.bazel
@@ -15,6 +15,7 @@ go_library(
         "//go/lib/infra/modules/idiscovery:go_default_library",
         "//go/lib/pathstorage:go_default_library",
         "//go/lib/sciond:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/truststorage:go_default_library",
         "//go/lib/util:go_default_library",
diff --git a/go/sciond/internal/fetcher/BUILD.bazel b/go/sciond/internal/fetcher/BUILD.bazel
index eb196ad3f4..8e41b79408 100644
--- a/go/sciond/internal/fetcher/BUILD.bazel
+++ b/go/sciond/internal/fetcher/BUILD.bazel
@@ -23,6 +23,7 @@ go_library(
         "//go/lib/pathpol:go_default_library",
         "//go/lib/revcache:go_default_library",
         "//go/lib/sciond:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/spath:go_default_library",
         "//go/lib/topology:go_default_library",
diff --git a/go/sciond/internal/servers/BUILD.bazel b/go/sciond/internal/servers/BUILD.bazel
index cbdaef5be1..ad5673cc80 100644
--- a/go/sciond/internal/servers/BUILD.bazel
+++ b/go/sciond/internal/servers/BUILD.bazel
@@ -20,6 +20,7 @@ go_library(
         "//go/lib/log:go_default_library",
         "//go/lib/revcache:go_default_library",
         "//go/lib/sciond:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/sock/reliable:go_default_library",
         "//go/lib/topology:go_default_library",
         "//go/lib/tracing:go_default_library",
diff --git a/go/sig/BUILD.bazel b/go/sig/BUILD.bazel
index e96b8af424..f23dde1a1e 100644
--- a/go/sig/BUILD.bazel
+++ b/go/sig/BUILD.bazel
@@ -12,6 +12,7 @@ go_library(
         "//go/lib/fatal:go_default_library",
         "//go/lib/log:go_default_library",
         "//go/lib/prom:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/sig/base:go_default_library",
         "//go/sig/config:go_default_library",
         "//go/sig/disp:go_default_library",
diff --git a/go/sig/internal/sigconfig/BUILD.bazel b/go/sig/internal/sigconfig/BUILD.bazel
index 800afa33af..3989b87c1d 100644
--- a/go/sig/internal/sigconfig/BUILD.bazel
+++ b/go/sig/internal/sigconfig/BUILD.bazel
@@ -10,9 +10,9 @@ go_library(
     visibility = ["//go/sig:__subpackages__"],
     deps = [
         "//go/lib/addr:go_default_library",
-        "//go/lib/common:go_default_library",
         "//go/lib/config:go_default_library",
         "//go/lib/env:go_default_library",
+        "//go/lib/serrors:go_default_library",
     ],
 )
 
diff --git a/go/tools/scion-pki/internal/conf/BUILD.bazel b/go/tools/scion-pki/internal/conf/BUILD.bazel
index 85ac391ac1..aefb5627fb 100644
--- a/go/tools/scion-pki/internal/conf/BUILD.bazel
+++ b/go/tools/scion-pki/internal/conf/BUILD.bazel
@@ -12,6 +12,7 @@ go_library(
         "//go/lib/addr:go_default_library",
         "//go/lib/common:go_default_library",
         "//go/lib/scrypto:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/util:go_default_library",
         "//go/tools/scion-pki/internal/pkicmn:go_default_library",
         "@com_github_go_ini_ini//:go_default_library",
diff --git a/go/tools/scion-pki/internal/keys/BUILD.bazel b/go/tools/scion-pki/internal/keys/BUILD.bazel
index 6b5014123b..087967902f 100644
--- a/go/tools/scion-pki/internal/keys/BUILD.bazel
+++ b/go/tools/scion-pki/internal/keys/BUILD.bazel
@@ -12,6 +12,7 @@ go_library(
         "//go/lib/common:go_default_library",
         "//go/lib/keyconf:go_default_library",
         "//go/lib/scrypto:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/tools/scion-pki/internal/conf:go_default_library",
         "//go/tools/scion-pki/internal/pkicmn:go_default_library",
         "@com_github_spf13_cobra//:go_default_library",
diff --git a/go/tools/scion-pki/internal/v2/keys/BUILD.bazel b/go/tools/scion-pki/internal/v2/keys/BUILD.bazel
index e71a2866a9..cfe07180e8 100644
--- a/go/tools/scion-pki/internal/v2/keys/BUILD.bazel
+++ b/go/tools/scion-pki/internal/v2/keys/BUILD.bazel
@@ -12,6 +12,7 @@ go_library(
         "//go/lib/common:go_default_library",
         "//go/lib/keyconf:go_default_library",
         "//go/lib/scrypto:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/tools/scion-pki/internal/pkicmn:go_default_library",
         "//go/tools/scion-pki/internal/v2/conf:go_default_library",
         "@com_github_spf13_cobra//:go_default_library",
diff --git a/go/tools/scion-pki/internal/v2/trcs/BUILD.bazel b/go/tools/scion-pki/internal/v2/trcs/BUILD.bazel
index bca8c3e9d8..494d8c4330 100644
--- a/go/tools/scion-pki/internal/v2/trcs/BUILD.bazel
+++ b/go/tools/scion-pki/internal/v2/trcs/BUILD.bazel
@@ -20,6 +20,7 @@ go_library(
         "//go/lib/keyconf:go_default_library",
         "//go/lib/scrypto:go_default_library",
         "//go/lib/scrypto/trc/v2:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/util:go_default_library",
         "//go/tools/scion-pki/internal/pkicmn:go_default_library",
         "//go/tools/scion-pki/internal/v2/conf:go_default_library",
diff --git a/go/tools/scmp/cmn/BUILD.bazel b/go/tools/scmp/cmn/BUILD.bazel
index 637bca494f..c9e221850c 100644
--- a/go/tools/scmp/cmn/BUILD.bazel
+++ b/go/tools/scmp/cmn/BUILD.bazel
@@ -15,6 +15,7 @@ go_library(
         "//go/lib/sciond:go_default_library",
         "//go/lib/scmp:go_default_library",
         "//go/lib/scrypto:go_default_library",
+        "//go/lib/serrors:go_default_library",
         "//go/lib/snet:go_default_library",
         "//go/lib/sock/reliable:go_default_library",
         "//go/lib/spkt:go_default_library",

From c8f8d18f1459735fc31b58c951d3cef90ab0a564 Mon Sep 17 00:00:00 2001
From: Lukas Vogel <lukedirtwalker@gmail.com>
Date: Mon, 7 Oct 2019 09:44:25 +0200
Subject: [PATCH 3/4] fix lint & test

---
 go/lib/infra/modules/itopo/itopo.go.orig | 372 -----------------------
 go/proto/cert_mgmt.capnp.go              |   1 -
 go/proto/ctrl_pld.capnp.go               |   1 -
 go/proto/drkey_mgmt.capnp.go             |   1 -
 go/proto/path_mgmt.capnp.go              |   1 -
 go/proto/sciond.capnp.go                 |   1 -
 go/proto/sig.capnp.go                    |   1 -
 go/protobuf/BUILD.bazel                  |  16 -
 8 files changed, 394 deletions(-)
 delete mode 100644 go/lib/infra/modules/itopo/itopo.go.orig
 delete mode 100644 go/protobuf/BUILD.bazel

diff --git a/go/lib/infra/modules/itopo/itopo.go.orig b/go/lib/infra/modules/itopo/itopo.go.orig
deleted file mode 100644
index 2175b877b7..0000000000
--- a/go/lib/infra/modules/itopo/itopo.go.orig
+++ /dev/null
@@ -1,372 +0,0 @@
-// Copyright 2018 ETH Zurich
-// Copyright 2019 ETH Zurich, Anapaya Systems
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-//   http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package itopo
-
-import (
-	"sync"
-	"time"
-
-	"github.com/google/go-cmp/cmp"
-	"github.com/google/go-cmp/cmp/cmpopts"
-
-	"github.com/scionproto/scion/go/lib/common"
-	"github.com/scionproto/scion/go/lib/infra/modules/itopo/internal/metrics"
-	"github.com/scionproto/scion/go/lib/log"
-	"github.com/scionproto/scion/go/lib/serrors"
-	"github.com/scionproto/scion/go/lib/topology"
-	"github.com/scionproto/scion/go/proto"
-)
-
-var st *state
-
-// Callbacks are callbacks to respond to specific topology update events.
-type Callbacks struct {
-	// CleanDynamic is called whenever dynamic topology is dropped due to expiration.
-	CleanDynamic func()
-	// DropDynamic is called whenever dynamic topology is dropped due to static update.
-	DropDynamic func()
-	// UpdateStatic is called whenever the pointer to static topology is updated.
-	UpdateStatic func()
-}
-
-// providerFunc wraps the Get call as a topology provider.
-type providerFunc func() *topology.Topo
-
-// Provider returns a topology provider that calls Get internally.
-func Provider() topology.Provider {
-	st.RLock()
-	defer st.RUnlock()
-	if st.topo.static == nil {
-		panic("static topology not found")
-	}
-	return providerFunc(Get)
-}
-
-func (f providerFunc) Get() *topology.Topo {
-	return f()
-}
-
-// Init initializes itopo with the particular validator. A topology must be
-// initialized by calling SetStatic.
-func Init(id string, svc proto.ServiceType, clbks Callbacks) {
-	if st != nil {
-		panic("Must not re-initialize itopo")
-	}
-	st = newState(id, svc, clbks)
-}
-
-// Get atomically gets the pointer to the current topology.
-func Get() *topology.Topo {
-	st.RLock()
-	defer st.RUnlock()
-	return st.topo.Get()
-}
-
-// SetDynamic atomically sets the dynamic topology. The returned topology is a pointer
-// to the currently active topology at the end of the function call. It might differ from
-// the input topology. The second return value indicates whether the in-memory
-// copy of the dynamic topology has been updated.
-func SetDynamic(dynamic *topology.Topo) (*topology.Topo, bool, error) {
-	l := metrics.UpdateLabels{Type: metrics.Dynamic}
-	topo, updated, err := st.setDynamic(dynamic)
-	switch {
-	case err != nil:
-		l.Result = metrics.ErrValidate
-	case updated:
-		l.Result = metrics.Success
-	default:
-		l.Result = metrics.OkIgnored
-	}
-	incUpdateMetric(l)
-	return topo, updated, err
-}
-
-// BeginSetDynamic checks whether setting the dynamic topology is permissible. The returned
-// transaction provides a view on which topology would be active, if committed.
-func BeginSetDynamic(dynamic *topology.Topo) (Transaction, error) {
-	tx, err := st.beginSetDynamic(dynamic)
-	if err != nil {
-		incUpdateMetric(metrics.UpdateLabels{Type: metrics.Dynamic, Result: metrics.ErrValidate})
-	}
-	return tx, err
-}
-
-// SetStatic atomically sets the static topology. Whether semi-mutable fields are
-// allowed to change can be specified using semiMutAllowed. The returned
-// topology is a pointer to the currently active topology at the end of the function call.
-// It might differ from the input topology (same contents as existing static,
-// or dynamic set and still valid). The second return value indicates whether the in-memory
-// copy of the static topology has been updated.
-func SetStatic(static *topology.Topo, semiMutAllowed bool) (*topology.Topo, bool, error) {
-	l := metrics.UpdateLabels{Type: metrics.Static}
-	topo, updated, err := st.setStatic(static, semiMutAllowed)
-	switch {
-	case err != nil:
-		l.Result = metrics.ErrValidate
-	case updated:
-		l.Result = metrics.Success
-	default:
-		l.Result = metrics.OkIgnored
-	}
-	incUpdateMetric(l)
-	return topo, updated, err
-}
-
-// BeginSetStatic checks whether setting the static topology is permissible. The returned
-// transaction provides a view on which topology would be active, if committed.
-func BeginSetStatic(static *topology.Topo, semiMutAllowed bool) (Transaction, error) {
-	tx, err := st.beginSetStatic(static, semiMutAllowed)
-	if err != nil {
-		incUpdateMetric(metrics.UpdateLabels{Type: metrics.Static, Result: metrics.ErrValidate})
-	}
-	return tx, err
-}
-
-// Transaction allows to get a view on which topology will be active without committing
-// to the topology update yet.
-type Transaction struct {
-	// candidateTopo contains the view of what the static and dynamic topologies
-	// will be when the transaction is successfully committed.
-	candidateTopo topo
-	// staticAtTxStart stores a snapshot of the currently active static
-	// topology at transaction start.
-	staticAtTxStart *topology.Topo
-	// inputStatic stores the provided static topology.
-	inputStatic *topology.Topo
-	// inputDynamic stores the provided dynamic topology.
-	inputDynamic *topology.Topo
-}
-
-// Commit commits the change. An error is returned, if the static topology changed in the meantime.
-func (tx *Transaction) Commit() error {
-	st.Lock()
-	defer st.Unlock()
-	l := metrics.UpdateLabels{Type: metrics.Dynamic}
-	if tx.inputStatic != nil {
-		l.Type = metrics.Static
-	}
-	if tx.staticAtTxStart != st.topo.static {
-<<<<<<< 219ddaa7f3728ece29edf1de726456d18c30fb43
-		incUpdateMetric(l.WithResult(metrics.ErrCommit))
-		return common.NewBasicError("Static topology changed in the meantime", nil)
-=======
-		return serrors.New("Static topology changed in the meantime")
->>>>>>> Use serrors.New instead of common.NewBasicError
-	}
-	if !tx.IsUpdate() {
-		incUpdateMetric(l.WithResult(metrics.OkIgnored))
-		return nil
-	}
-	// Do transaction for static topology updated.
-	if tx.inputStatic != nil {
-		st.updateStatic(tx.inputStatic)
-		incUpdateMetric(l.WithResult(metrics.Success))
-		return nil
-	}
-	// Do transaction from dynamic topology update.
-	st.updateDynamic(tx.inputDynamic)
-	incUpdateMetric(l.WithResult(metrics.Success))
-	return nil
-}
-
-// Get returns the topology that will be active if the transaction is committed.
-func (tx *Transaction) Get() *topology.Topo {
-	return tx.candidateTopo.Get()
-}
-
-// IsUpdate indicates whether the transaction will cause an update.
-func (tx *Transaction) IsUpdate() bool {
-	if tx.inputStatic != nil {
-		return tx.candidateTopo.static == tx.inputStatic
-	}
-	return tx.candidateTopo.dynamic == tx.inputDynamic
-}
-
-// topo stores the currently active static and dynamic topologies.
-type topo struct {
-	static  *topology.Topo
-	dynamic *topology.Topo
-}
-
-// Get returns the dynamic topology if it is set and has not expired. Otherwise,
-// the static topology is returned.
-func (t *topo) Get() *topology.Topo {
-	if t.dynamic != nil && t.dynamic.Active(time.Now()) {
-		return t.dynamic
-	}
-	return t.static
-}
-
-// state keeps track of the active topologies and enforces update rules.
-type state struct {
-	sync.RWMutex
-	topo      topo
-	validator validator
-	clbks     Callbacks
-}
-
-func newState(id string, svc proto.ServiceType, clbks Callbacks) *state {
-	s := &state{
-		validator: validatorFactory(id, svc),
-		clbks:     clbks,
-	}
-	return s
-}
-
-// setDynamic atomically sets the dynamic topology.
-func (s *state) setDynamic(dynamic *topology.Topo) (*topology.Topo, bool, error) {
-	s.Lock()
-	defer s.Unlock()
-	if err := s.dynamicPreCheck(dynamic); err != nil {
-		return nil, false, err
-	}
-	if err := s.validator.Validate(dynamic, s.topo.static, false); err != nil {
-		return nil, false, err
-	}
-	if keepOld(dynamic, s.topo.dynamic) {
-		return s.topo.Get(), false, nil
-	}
-	s.updateDynamic(dynamic)
-	return s.topo.Get(), true, nil
-}
-
-func (s *state) updateDynamic(dynamic *topology.Topo) {
-	s.topo.dynamic = dynamic
-	cl := metrics.CurrentLabels{Type: metrics.Dynamic}
-	metrics.Current.Active().Set(1)
-	metrics.Current.Timestamp(cl).Set(metrics.Timestamp(dynamic.Timestamp))
-	metrics.Current.Expiry(cl).Set(metrics.Expiry(dynamic.Expiry()))
-}
-
-func (s *state) beginSetDynamic(dynamic *topology.Topo) (Transaction, error) {
-	s.Lock()
-	defer s.Unlock()
-	if err := s.dynamicPreCheck(dynamic); err != nil {
-		return Transaction{}, err
-	}
-	if err := s.validator.Validate(dynamic, s.topo.static, false); err != nil {
-		return Transaction{}, err
-	}
-	tx := Transaction{
-		candidateTopo:   s.topo,
-		staticAtTxStart: s.topo.static,
-		inputDynamic:    dynamic,
-	}
-	if !keepOld(tx.inputDynamic, tx.candidateTopo.dynamic) {
-		// The dynamic topology is only updated if it differs and is valid longer.
-		tx.candidateTopo.dynamic = dynamic
-	}
-	return tx, nil
-}
-
-func (s *state) dynamicPreCheck(dynamic *topology.Topo) error {
-	if dynamic == nil {
-		return serrors.New("Provided topology must not be nil")
-	}
-	if s.topo.static == nil {
-		return serrors.New("Static topology must be set")
-	}
-	now := time.Now()
-	if !dynamic.Active(now) {
-		return common.NewBasicError("Dynamic topology must be active", nil,
-			"ts", dynamic.Timestamp, "now", now, "expiry", dynamic.Expiry())
-	}
-	return nil
-}
-
-// setStatic atomically sets the static topology.
-func (s *state) setStatic(static *topology.Topo, allowed bool) (*topology.Topo, bool, error) {
-	s.Lock()
-	defer s.Unlock()
-	if err := s.validator.Validate(static, s.topo.static, allowed); err != nil {
-		return nil, false, err
-	}
-	// Only update static topology if the new one is different or valid for longer.
-	if keepOld(static, s.topo.static) {
-		return s.topo.Get(), false, nil
-	}
-	s.updateStatic(static)
-	return s.topo.Get(), true, nil
-}
-
-func (s *state) beginSetStatic(static *topology.Topo, allowed bool) (Transaction, error) {
-	s.Lock()
-	defer s.Unlock()
-	if err := s.validator.Validate(static, s.topo.static, allowed); err != nil {
-		return Transaction{}, err
-	}
-	tx := Transaction{
-		candidateTopo:   s.topo,
-		staticAtTxStart: s.topo.static,
-		inputStatic:     static,
-	}
-	if keepOld(tx.inputStatic, tx.staticAtTxStart) {
-		return tx, nil
-	}
-	// Drop dynamic from candidate topo if it will be dropped when committing the transaction.
-	if s.validator.MustDropDynamic(tx.inputStatic, tx.staticAtTxStart) {
-		tx.candidateTopo.dynamic = nil
-	}
-	tx.candidateTopo.static = static
-	return tx, nil
-}
-
-// updateStatic updates the static topology, if necessary, and calls the corresponding callbacks.
-func (s *state) updateStatic(static *topology.Topo) {
-	// Drop dynamic topology if necessary.
-	if s.validator.MustDropDynamic(static, s.topo.static) && s.topo.dynamic != nil {
-		s.topo.dynamic = nil
-		call(s.clbks.DropDynamic)
-		metrics.Current.Active().Set(0)
-	}
-	s.topo.static = static
-	call(s.clbks.UpdateStatic)
-	cl := metrics.CurrentLabels{Type: metrics.Static}
-	metrics.Current.Timestamp(cl).Set(metrics.Timestamp(static.Timestamp))
-	metrics.Current.Expiry(cl).Set(metrics.Expiry(static.Expiry()))
-}
-
-func keepOld(newTopo, oldTopo *topology.Topo) bool {
-	return topoEq(newTopo, oldTopo) && !expiresLater(newTopo, oldTopo)
-}
-
-func topoEq(newTopo, oldTopo *topology.Topo) bool {
-	return cmp.Equal(newTopo, oldTopo, cmpopts.IgnoreFields(
-		topology.Topo{}, "Timestamp", "TimestampHuman", "TTL"))
-}
-
-func expiresLater(newTopo, oldTopo *topology.Topo) bool {
-	if oldTopo == nil {
-		return true
-	}
-	newExpiry := newTopo.Expiry()
-	oldExpiry := oldTopo.Expiry()
-	return !oldExpiry.IsZero() && (newExpiry.IsZero() || newExpiry.After(oldExpiry))
-}
-
-func call(clbk func()) {
-	if clbk != nil {
-		go func() {
-			defer log.LogPanicAndExit()
-			clbk()
-		}()
-	}
-}
-
-func incUpdateMetric(l metrics.UpdateLabels) {
-	metrics.Updates.Last(l).SetToCurrentTime()
-	metrics.Updates.Total(l).Inc()
-}
diff --git a/go/proto/cert_mgmt.capnp.go b/go/proto/cert_mgmt.capnp.go
index 54ffa59820..0097da823f 100644
--- a/go/proto/cert_mgmt.capnp.go
+++ b/go/proto/cert_mgmt.capnp.go
@@ -4,7 +4,6 @@ package proto
 
 import (
 	strconv "strconv"
-
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/ctrl_pld.capnp.go b/go/proto/ctrl_pld.capnp.go
index 3444ba1427..3bb43e5811 100644
--- a/go/proto/ctrl_pld.capnp.go
+++ b/go/proto/ctrl_pld.capnp.go
@@ -4,7 +4,6 @@ package proto
 
 import (
 	strconv "strconv"
-
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/drkey_mgmt.capnp.go b/go/proto/drkey_mgmt.capnp.go
index c67722da46..344162dff8 100644
--- a/go/proto/drkey_mgmt.capnp.go
+++ b/go/proto/drkey_mgmt.capnp.go
@@ -4,7 +4,6 @@ package proto
 
 import (
 	strconv "strconv"
-
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/path_mgmt.capnp.go b/go/proto/path_mgmt.capnp.go
index 15de82ba81..15446c469f 100644
--- a/go/proto/path_mgmt.capnp.go
+++ b/go/proto/path_mgmt.capnp.go
@@ -4,7 +4,6 @@ package proto
 
 import (
 	strconv "strconv"
-
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/sciond.capnp.go b/go/proto/sciond.capnp.go
index 9776830bd9..3c18142e3c 100644
--- a/go/proto/sciond.capnp.go
+++ b/go/proto/sciond.capnp.go
@@ -4,7 +4,6 @@ package proto
 
 import (
 	strconv "strconv"
-
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/proto/sig.capnp.go b/go/proto/sig.capnp.go
index e9b63f7153..3f53f57636 100644
--- a/go/proto/sig.capnp.go
+++ b/go/proto/sig.capnp.go
@@ -4,7 +4,6 @@ package proto
 
 import (
 	strconv "strconv"
-
 	capnp "zombiezen.com/go/capnproto2"
 	text "zombiezen.com/go/capnproto2/encoding/text"
 	schemas "zombiezen.com/go/capnproto2/schemas"
diff --git a/go/protobuf/BUILD.bazel b/go/protobuf/BUILD.bazel
deleted file mode 100644
index fe9a5b973d..0000000000
--- a/go/protobuf/BUILD.bazel
+++ /dev/null
@@ -1,16 +0,0 @@
-load("@io_bazel_rules_go//go:def.bzl", "go_library")
-
-go_library(
-    name = "go_default_library",
-    srcs = [
-        "common.pb.go",
-        "conf_agent.pb.go",
-        "sig_mgmt.pb.go",
-    ],
-    importpath = "github.com/scionproto/scion/go/protobuf",
-    visibility = ["//visibility:public"],
-    deps = [
-        "@com_github_golang_protobuf//proto:go_default_library",
-        "@org_golang_google_grpc//:go_default_library",
-    ],
-)

From 4945f055d3fcbe2f5f6abf977e8392bbcb9db0e1 Mon Sep 17 00:00:00 2001
From: Lukas Vogel <lukedirtwalker@gmail.com>
Date: Mon, 7 Oct 2019 10:02:05 +0200
Subject: [PATCH 4/4] ignore gen file

---
 scion.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/scion.sh b/scion.sh
index e099687de6..d2c331b1c1 100755
--- a/scion.sh
+++ b/scion.sh
@@ -330,7 +330,7 @@ go_lint() {
     local ret=0
     lint_step "impi"
     # Skip CGO (https://github.com/pavius/impi/issues/5) files.
-    $TMPDIR/impi --local github.com/scionproto/scion --scheme stdThirdPartyLocal --skip '/c\.go$' --skip 'mock_' --skip 'go/proto/.*\.capnp\.go' ./go/... || ret=1
+    $TMPDIR/impi --local github.com/scionproto/scion --scheme stdThirdPartyLocal --skip '/c\.go$' --skip 'mock_' --skip 'go/proto/.*\.capnp\.go' --skip 'go/proto/structs.gen.go' ./go/... || ret=1
     lint_step "gofmt"
     # TODO(sustrik): At the moment there are no bazel rules for gofmt.
     # See: https://github.com/bazelbuild/rules_go/issues/511