Add ability to have several servers
diff --git a/core/kg/server/grpc_server.go b/core/kg/server/grpc_server.go
new file mode 100644
index 0000000..c36c7d2
--- /dev/null
+++ b/core/kg/server/grpc_server.go
@@ -0,0 +1,62 @@
+package server
+
+import (
+	"net"
+	"os"
+
+	"github.com/giolekva/pcloud/core/kg/log"
+	"github.com/giolekva/pcloud/core/kg/store"
+	"google.golang.org/grpc"
+)
+
+const listenerPort = ":9081"
+
+// GRPCServerImpl grpc server implementation
+type GRPCServerImpl struct {
+	Log   *log.Logger
+	srv   *grpc.Server
+	store store.Store
+}
+
+var _ Server = &GRPCServerImpl{}
+
+// NewGRPCServer creates new GRPC Server
+func NewGRPCServer(logger *log.Logger) Server {
+	a := &GRPCServerImpl{
+		Log: logger,
+	}
+
+	pwd, _ := os.Getwd()
+	a.Log.Info("GRPC server current working", log.String("directory", pwd))
+	return a
+}
+
+// Start method starts an app
+func (a *GRPCServerImpl) Start() error {
+	a.Log.Info("Starting GRPC Server...")
+
+	// settings := model.NewConfig().SqlSettings
+	// a.store = sqlstore.New(settings)
+
+	lis, err := net.Listen("tcp", listenerPort)
+	if err != nil {
+		a.Log.Error("failed to listen: %v", log.Err(err))
+		return err
+	}
+
+	a.srv = grpc.NewServer()
+
+	a.Log.Info("GRPC Server is listening on", log.String("port", listenerPort))
+	if err := a.srv.Serve(lis); err != nil {
+		a.Log.Error("failed to serve: %v", log.Err(err))
+		return err
+	}
+	return nil
+}
+
+// Shutdown method shuts server down
+func (a *GRPCServerImpl) Shutdown() error {
+	a.Log.Info("Stopping GRPC Server...")
+	a.srv.GracefulStop()
+	return nil
+}
diff --git a/core/kg/server/server.go b/core/kg/server/server.go
deleted file mode 100644
index 12c2905..0000000
--- a/core/kg/server/server.go
+++ /dev/null
@@ -1,58 +0,0 @@
-package server
-
-import (
-	"net"
-	"os"
-
-	"github.com/giolekva/pcloud/core/kg/log"
-	"github.com/giolekva/pcloud/core/kg/store"
-	"google.golang.org/grpc"
-)
-
-const listenerPort = ":9081"
-
-// Server type defines application global state
-type Server struct {
-	Log   *log.Logger
-	srv   *grpc.Server
-	store store.Store
-}
-
-// NewServer creates new Server
-func NewServer(logger *log.Logger) (*Server, error) {
-	a := &Server{
-		Log: logger,
-	}
-
-	pwd, _ := os.Getwd()
-	a.Log.Info("Current working", log.String("directory", pwd))
-	return a, nil
-}
-
-// Start method starts an app
-func (a *Server) Start() error {
-	// settings := model.NewConfig().SqlSettings
-	// a.store = sqlstore.New(settings)
-
-	lis, err := net.Listen("tcp", listenerPort)
-	if err != nil {
-		a.Log.Error("failed to listen: %v", log.Err(err))
-		return err
-	}
-
-	a.srv = grpc.NewServer()
-
-	a.Log.Info("Server is listening on", log.String("port", listenerPort))
-	if err := a.srv.Serve(lis); err != nil {
-		a.Log.Error("failed to serve: %v", log.Err(err))
-		return err
-	}
-	a.Log.Info("Server stopped")
-	return nil
-}
-
-// Shutdown method shuts server down
-func (a *Server) Shutdown() {
-	a.Log.Info("Stopping Server...")
-	a.srv.GracefulStop()
-}
diff --git a/core/kg/server/servers.go b/core/kg/server/servers.go
new file mode 100644
index 0000000..d197666
--- /dev/null
+++ b/core/kg/server/servers.go
@@ -0,0 +1,69 @@
+package server
+
+import (
+	"os"
+
+	"github.com/giolekva/pcloud/core/kg/log"
+	"github.com/vardius/shutdown"
+)
+
+// Server interface
+type Server interface {
+	Start() error
+	Shutdown() error
+}
+
+// Servers represents different server services
+type Servers struct {
+	servers []Server
+	logger  *log.Logger
+}
+
+// New provides new service application
+func New(logger *log.Logger) *Servers {
+	return &Servers{
+		logger: logger,
+	}
+}
+
+// AddServers adds servers to service
+func (ss *Servers) AddServers(servers ...Server) {
+	ss.servers = append(ss.servers, servers...)
+}
+
+// Run runs the service application
+func (ss *Servers) Run() {
+	for _, server := range ss.servers {
+		go func(server Server) {
+			if err := server.Start(); err != nil {
+				ss.logger.Error("can't start server", log.Err(err))
+				os.Exit(1)
+			}
+		}(server)
+	}
+	shutdown.GracefulStop(func() { ss.shutdown() })
+}
+
+func (ss *Servers) shutdown() {
+	ss.logger.Info("shutting down...")
+
+	errCh := make(chan error, len(ss.servers))
+
+	for _, server := range ss.servers {
+		go func(server Server) {
+			errCh <- server.Shutdown()
+		}(server)
+	}
+
+	for i := 0; i < len(ss.servers); i++ {
+		if err := <-errCh; err != nil {
+			go func(err error) {
+				ss.logger.Error("shutdown error", log.Err(err))
+				os.Exit(1)
+			}(err)
+			return
+		}
+	}
+
+	ss.logger.Info("gracefully stopped")
+}