diff --git a/dc/m6220-proxy/BUILD.bazel b/dc/m6220-proxy/BUILD.bazel
index 50fa692..1d737b5 100644
--- a/dc/m6220-proxy/BUILD.bazel
+++ b/dc/m6220-proxy/BUILD.bazel
@@ -10,8 +10,8 @@
     visibility = ["//visibility:private"],
     deps = [
         "//dc/m6220-proxy/proto:go_default_library",
+        "//dc/proto:go_default_library",
         "//go/mirko:go_default_library",
-        "//proto/infra:go_default_library",
         "@com_github_golang_glog//:go_default_library",
         "@com_github_ziutek_telnet//:go_default_library",
         "@org_golang_google_grpc//codes:go_default_library",
diff --git a/dc/m6220-proxy/main.go b/dc/m6220-proxy/main.go
index 6fd972d..f4c348b 100644
--- a/dc/m6220-proxy/main.go
+++ b/dc/m6220-proxy/main.go
@@ -15,7 +15,7 @@
 	"google.golang.org/grpc/status"
 
 	pb "code.hackerspace.pl/hscloud/dc/m6220-proxy/proto"
-	ipb "code.hackerspace.pl/hscloud/proto/infra"
+	dpb "code.hackerspace.pl/hscloud/dc/proto"
 )
 
 var (
@@ -70,7 +70,7 @@
 	return res, nil
 }
 
-func (s *service) parseInterfaceStatus(res *ipb.GetPortsResponse, lines []string) error {
+func (s *service) parseInterfaceStatus(res *dpb.GetPortsResponse, lines []string) error {
 	if len(lines) < 4 {
 		return fmt.Errorf("need at least 4 lines of output, got %d", len(lines))
 	}
@@ -104,20 +104,20 @@
 		speedStr := parts[len(parts)-4]
 		stateStr := parts[len(parts)-2]
 
-		port := &ipb.SwitchPort{
+		port := &dpb.SwitchPort{
 			Name: portName,
 		}
 		if speedStr == "100" {
-			port.Speed = ipb.SwitchPort_SPEED_100M
+			port.Speed = dpb.SwitchPort_SPEED_100M
 		} else if speedStr == "1000" {
-			port.Speed = ipb.SwitchPort_SPEED_1G
+			port.Speed = dpb.SwitchPort_SPEED_1G
 		} else if speedStr == "10000" {
-			port.Speed = ipb.SwitchPort_SPEED_10G
+			port.Speed = dpb.SwitchPort_SPEED_10G
 		}
 		if stateStr == "Up" {
-			port.LinkState = ipb.SwitchPort_LINKSTATE_UP
+			port.LinkState = dpb.SwitchPort_LINKSTATE_UP
 		} else if stateStr == "Down" {
-			port.LinkState = ipb.SwitchPort_LINKSTATE_DOWN
+			port.LinkState = dpb.SwitchPort_LINKSTATE_DOWN
 		}
 
 		res.Ports = append(res.Ports, port)
@@ -126,7 +126,7 @@
 	return nil
 }
 
-func (s *service) parseInterfaceConfig(port *ipb.SwitchPort, lines []string) error {
+func (s *service) parseInterfaceConfig(port *dpb.SwitchPort, lines []string) error {
 	glog.Infof("%+v", port)
 	for _, line := range lines {
 		glog.Infof("%s: %q", port.Name, line)
@@ -137,23 +137,23 @@
 
 		if len(parts) >= 2 && parts[0] == "switchport" {
 			if parts[1] == "mode" {
-				if port.PortMode != ipb.SwitchPort_PORTMODE_INVALID {
+				if port.PortMode != dpb.SwitchPort_PORTMODE_INVALID {
 					return fmt.Errorf("redefinition of switchport mode")
 				}
 				if parts[2] == "access" {
-					port.PortMode = ipb.SwitchPort_PORTMODE_SWITCHPORT_UNTAGGED
+					port.PortMode = dpb.SwitchPort_PORTMODE_SWITCHPORT_UNTAGGED
 				} else if parts[2] == "trunk" {
-					port.PortMode = ipb.SwitchPort_PORTMODE_SWITCHPORT_TAGGED
+					port.PortMode = dpb.SwitchPort_PORTMODE_SWITCHPORT_TAGGED
 				} else if parts[2] == "general" {
-					port.PortMode = ipb.SwitchPort_PORTMODE_SWITCHPORT_GENERIC
+					port.PortMode = dpb.SwitchPort_PORTMODE_SWITCHPORT_GENERIC
 				} else {
-					port.PortMode = ipb.SwitchPort_PORTMODE_MANGLED
+					port.PortMode = dpb.SwitchPort_PORTMODE_MANGLED
 				}
 			}
 
 			if parts[1] == "access" {
-				if port.PortMode == ipb.SwitchPort_PORTMODE_INVALID {
-					port.PortMode = ipb.SwitchPort_PORTMODE_SWITCHPORT_UNTAGGED
+				if port.PortMode == dpb.SwitchPort_PORTMODE_INVALID {
+					port.PortMode = dpb.SwitchPort_PORTMODE_SWITCHPORT_UNTAGGED
 				}
 				if len(parts) > 3 && parts[2] == "vlan" {
 					vlan, err := strconv.Atoi(parts[3])
@@ -183,34 +183,34 @@
 			}
 			port.Mtu = int32(mtu)
 		} else if len(parts) >= 2 && parts[0] == "spanning-tree" && parts[1] == "portfast" {
-			port.SpanningTreeMode = ipb.SwitchPort_SPANNING_TREE_MODE_PORTFAST
+			port.SpanningTreeMode = dpb.SwitchPort_SPANNING_TREE_MODE_PORTFAST
 		}
 	}
 
 	// no mode -> access
-	if port.PortMode == ipb.SwitchPort_PORTMODE_INVALID {
-		port.PortMode = ipb.SwitchPort_PORTMODE_SWITCHPORT_UNTAGGED
+	if port.PortMode == dpb.SwitchPort_PORTMODE_INVALID {
+		port.PortMode = dpb.SwitchPort_PORTMODE_SWITCHPORT_UNTAGGED
 	}
 
 	// apply defaults
 	if port.Mtu == 0 {
 		port.Mtu = 1500
 	}
-	if port.SpanningTreeMode == ipb.SwitchPort_SPANNING_TREE_MODE_INVALID {
-		port.SpanningTreeMode = ipb.SwitchPort_SPANNING_TREE_MODE_AUTO_PORTFAST
+	if port.SpanningTreeMode == dpb.SwitchPort_SPANNING_TREE_MODE_INVALID {
+		port.SpanningTreeMode = dpb.SwitchPort_SPANNING_TREE_MODE_AUTO_PORTFAST
 	}
 
 	// sanitize
-	if port.PortMode == ipb.SwitchPort_PORTMODE_SWITCHPORT_UNTAGGED {
+	if port.PortMode == dpb.SwitchPort_PORTMODE_SWITCHPORT_UNTAGGED {
 		port.VlanTagged = []int32{}
 		port.Prefixes = []string{}
 		if port.VlanNative == 0 {
 			port.VlanNative = 1
 		}
-	} else if port.PortMode == ipb.SwitchPort_PORTMODE_SWITCHPORT_TAGGED {
+	} else if port.PortMode == dpb.SwitchPort_PORTMODE_SWITCHPORT_TAGGED {
 		port.VlanNative = 0
 		port.Prefixes = []string{}
-	} else if port.PortMode == ipb.SwitchPort_PORTMODE_SWITCHPORT_GENERIC {
+	} else if port.PortMode == dpb.SwitchPort_PORTMODE_SWITCHPORT_GENERIC {
 		port.Prefixes = []string{}
 		if port.VlanNative == 0 {
 			port.VlanNative = 1
@@ -219,13 +219,13 @@
 	return nil
 }
 
-func (s *service) GetPorts(ctx context.Context, req *ipb.GetPortsRequest) (*ipb.GetPortsResponse, error) {
+func (s *service) GetPorts(ctx context.Context, req *dpb.GetPortsRequest) (*dpb.GetPortsResponse, error) {
 	cli, err := s.connect()
 	if err != nil {
 		return nil, status.Error(codes.Unavailable, "could not connect to switch")
 	}
 	defer s.disconnect()
-	res := &ipb.GetPortsResponse{}
+	res := &dpb.GetPortsResponse{}
 
 	statusLines, _, err := cli.runCommand(ctx, "show interface status")
 	if err != nil {
@@ -267,7 +267,7 @@
 	}
 
 	pb.RegisterM6220ProxyServer(m.GRPC(), s)
-	ipb.RegisterSwitchControlServer(m.GRPC(), s)
+	dpb.RegisterSwitchControlServer(m.GRPC(), s)
 
 	if err := m.Serve(); err != nil {
 		glog.Exitf("Serve(): %v", err)
