diff --git a/state/state.go b/state/state.go
index 5f7cc56..e9ccce6 100644
--- a/state/state.go
+++ b/state/state.go
@@ -1,7 +1,16 @@
 package state
 
 import (
+	"context"
+	"fmt"
+	"sync"
+
+	"google.golang.org/grpc"
+
+	cpb "code.hackerspace.pl/q3k/topo/proto/config"
 	pb "code.hackerspace.pl/q3k/topo/proto/control"
+
+	"code.hackerspace.pl/q3k/hspki"
 )
 
 type SwitchportState struct {
@@ -11,14 +20,57 @@
 type SwitchState struct {
 	Name  string
 	Ports []*SwitchportState
+	Stub  pb.SwitchControlClient
+}
+
+func (s *SwitchState) Fetch(ctx context.Context) error {
+	req := pb.GetPortsRequest{}
+	res, err := s.Stub.GetPorts(ctx, &req)
+	if err != nil {
+		return fmt.Errorf("GetPorts: %v", err)
+	}
+	s.Ports = make([]*SwitchportState, len(res.Ports))
+	for i, port := range res.Ports {
+		s.Ports[i] = &SwitchportState{port}
+	}
+	return nil
 }
 
 type StateManager struct {
 	Switches map[string]*SwitchState
+	Conns    map[string]*grpc.ClientConn
+	Mu       sync.RWMutex
 }
 
 func NewManager() *StateManager {
 	return &StateManager{
 		Switches: make(map[string]*SwitchState),
+		Conns:    make(map[string]*grpc.ClientConn),
 	}
 }
+
+func (s *StateManager) FetchState(ctx context.Context, conf *cpb.Config) error {
+	s.Mu.Lock()
+	defer s.Mu.Unlock()
+	for _, sw := range conf.Switch {
+		conn, ok := s.Conns[sw.ControlAddress]
+		if !ok {
+			var err error
+			conn, err = grpc.Dial(sw.ControlAddress, hspki.WithClientHSPKI())
+			if err != nil {
+				return fmt.Errorf("when connecting to switch %s: %v", sw.Name, err)
+			}
+			s.Conns[sw.ControlAddress] = conn
+		}
+
+		s.Switches[sw.Name] = &SwitchState{
+			Name: sw.Name,
+			Stub: pb.NewSwitchControlClient(conn),
+		}
+		err := s.Switches[sw.Name].Fetch(ctx)
+		if err != nil {
+			return fmt.Errorf("%q.Fetch: %v", sw.Name, err)
+		}
+	}
+	return nil
+}
