diff --git a/chunk/chunk.go b/chunk/chunk.go
new file mode 100644
index 0000000..1dde057
--- /dev/null
+++ b/chunk/chunk.go
@@ -0,0 +1,76 @@
+package main
+
+import "context"
+import "flag"
+import "fmt"
+import "log"
+import "net"
+import "time"
+
+import "google.golang.org/grpc"
+
+import pc "pcloud"
+
+var masterAddress string
+var selfAddress string
+
+func init() {
+	flag.StringVar(&masterAddress, "master", "localhost:123", "Metadata storage address.")
+	flag.StringVar(&selfAddress, "self", "", "Metadata storage address.")
+}
+
+type chunkStorage struct {
+}
+
+func (s *chunkStorage) ListChunks(
+	ctx context.Context,
+	request *pc.ListChunksRequest) (*pc.ListChunksResponse, error) {
+	return nil, nil
+}
+
+func (s *chunkStorage) ReadChunk(
+	ctx context.Context,
+	request *pc.ReadChunkRequest) (*pc.ReadChunkResponse, error) {
+	return nil, nil
+}
+
+func (s *chunkStorage) StoreChunk(
+	ctx context.Context,
+	request *pc.StoreChunkRequest) (*pc.StoreChunkResponse, error) {
+	return nil, nil
+}
+
+func main() {
+	flag.Parse()
+	log.Print("Chunk server starting")
+
+	// Create Master server client.
+	var opts []grpc.DialOption
+	opts = append(opts, grpc.WithInsecure())
+	opts = append(opts, grpc.WithBlock())
+	conn, err := grpc.Dial(masterAddress, opts...)
+	if err != nil {
+		log.Fatalf("Failed to dial %s: %v", masterAddress, err)
+	}
+	defer conn.Close()
+	client := pc.NewMetadataStorageClient(conn)
+
+	// Register current Chunk server with Master.
+	ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
+	_, err = client.AddChunkServer(
+		ctx,
+		&pc.AddChunkServerRequest{Address: selfAddress})
+	if err != nil {
+		log.Fatalf("failed to register chunk server: %v", err)
+	}
+	log.Print("Registered myself")
+
+	// Start RPC server
+	lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 234))
+	if err != nil {
+		log.Fatalf("failed to listen: %v", err)
+	}
+	server := grpc.NewServer()
+	pc.RegisterChunkStorageServer(server, &chunkStorage{})
+	server.Serve(lis)
+}
