diff --git a/include/grpc++/server.h b/include/grpc++/server.h
index 3e544059747291fb3d352d1aaa9d8df5161242c5..489937712ec16db3c3d234c573870f0fcd4e4065 100644
--- a/include/grpc++/server.h
+++ b/include/grpc++/server.h
@@ -88,6 +88,8 @@ class Server final : public ServerInterface, private GrpcLibraryCodegen {
     virtual void PostSynchronousRequest(ServerContext* context) = 0;
     /// Called before server is started.
     virtual void PreServerStart(Server* server) {}
+    /// Called after a server port is added.
+    virtual void AddPort(Server* server, int port) {}
   };
   /// Set the global callback object. Can only be called once. Does not take
   /// ownership of callbacks, and expects the pointed to object to be alive
diff --git a/src/cpp/server/server_cc.cc b/src/cpp/server/server_cc.cc
index e874892e73c0a173fb680fb0767a3846e34a2b5c..ce173a1ee2d0542bdceefd5a0cde6985373384d4 100644
--- a/src/cpp/server/server_cc.cc
+++ b/src/cpp/server/server_cc.cc
@@ -489,7 +489,9 @@ void Server::RegisterAsyncGenericService(AsyncGenericService* service) {
 int Server::AddListeningPort(const grpc::string& addr,
                              ServerCredentials* creds) {
   GPR_ASSERT(!started_);
-  return creds->AddPortToServer(addr, server_);
+  int port = creds->AddPortToServer(addr, server_);
+  global_callbacks_->AddPort(this, port);
+  return port;
 }
 
 bool Server::Start(ServerCompletionQueue** cqs, size_t num_cqs) {