diff --git a/credentials/credentials.go b/credentials/credentials.go
index 53707902..8d4c57cc 100644
--- a/credentials/credentials.go
+++ b/credentials/credentials.go
@@ -151,14 +151,16 @@ func (c *tlsCreds) ClientHandshake(addr string, rawConn net.Conn, timeout time.D
 			errChannel <- timeoutError{}
 		})
 	}
+	// use local cfg to avoid clobbering ServerName if using multiple endpoints
+	cfg := *c.config
 	if c.config.ServerName == "" {
 		colonPos := strings.LastIndex(addr, ":")
 		if colonPos == -1 {
 			colonPos = len(addr)
 		}
-		c.config.ServerName = addr[:colonPos]
+		cfg.ServerName = addr[:colonPos]
 	}
-	conn := tls.Client(rawConn, c.config)
+	conn := tls.Client(rawConn, &cfg)
 	if timeout == 0 {
 		err = conn.Handshake()
 	} else {
diff --git a/reflection/serverreflection.go b/reflection/serverreflection.go
index 0daa096f..c3327ac5 100644
--- a/reflection/serverreflection.go
+++ b/reflection/serverreflection.go
@@ -214,7 +214,7 @@ func (s *serverReflectionServer) serviceMetadataForSymbol(name string) (interfac
 		return nil, fmt.Errorf("unknown symbol: %v", name)
 	}
 
-	// Search for method name in info.Methods.
+	// Search the method name in info.Methods.
 	var found bool
 	for _, m := range info.Methods {
 		if m.Name == name[pos+1:] {
diff --git a/server.go b/server.go
index f7b8319b..a2b2b94d 100644
--- a/server.go
+++ b/server.go
@@ -245,7 +245,7 @@ func (s *Server) register(sd *ServiceDesc, ss interface{}) {
 	s.m[sd.ServiceName] = srv
 }
 
-// MethodInfo contains information about an RPC.
+// MethodInfo contains the information of an RPC including its method name and type.
 type MethodInfo struct {
 	// Name is the method name only, without the service name or package name.
 	Name string
@@ -320,9 +320,11 @@ func (s *Server) Serve(lis net.Listener) error {
 	s.lis[lis] = true
 	s.mu.Unlock()
 	defer func() {
-		lis.Close()
 		s.mu.Lock()
-		delete(s.lis, lis)
+		if s.lis != nil && s.lis[lis] {
+			lis.Close()
+			delete(s.lis, lis)
+		}
 		s.mu.Unlock()
 	}()
 	for {