diff --git a/Dockerfile b/Dockerfile
index a03a39f..6595eda 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -37,6 +37,7 @@
     && go get -v github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway \
     && go get -v github.com/golang/protobuf/protoc-gen-go \
     && go get github.com/Shopify/sarama \
+    && go get github.com/Sirupsen/logrus\
     &&  protoc -I proto -I${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis --go_out=plugins=grpc:proto/  proto/*.proto
 RUN CGO_ENABLED=0 GOOS=linux go build -o main .
 
diff --git a/main.go b/main.go
index 9a09388..4e7f52c 100644
--- a/main.go
+++ b/main.go
@@ -27,6 +27,7 @@
 	"crypto/tls"
 	empty "github.com/golang/protobuf/ptypes/empty"
         importer "./proto"
+        log "github.com/Sirupsen/logrus"
 	"time"
 )
 
@@ -41,8 +42,10 @@
 
 var DataProducer sarama.AsyncProducer
 
-var default_events = [...]string{"ResourceAdded","ResourceRemoved","Alert"}
 
+var    vendor_default_events = map[string][]string{
+        "edgecore": {"ResourceAdded","ResourceRemoved","Alert"},
+    }
 var redfish_services = [...]string{"/Chassis", "/Systems","/EthernetSwitches"}
 
 type scheduler struct  {
@@ -54,6 +57,7 @@
 	subscriptions map[string]uint
 	datacollector scheduler
 	freqchan   chan uint32
+        vendor string
 }
 
 type Server struct {
@@ -63,11 +67,10 @@
 	devicechan   chan *importer.DeviceInfo
 }
 
-func (s *Server) GetEventList(c context.Context, info *importer.DeviceInfo) (*importer.EventList, error) {
+func (s *Server) GetEventList(c context.Context, info *importer.DeviceInfo) (*importer.SupportedEventList, error) {
 	fmt.Println("Received GetEventList\n")
-	eventstobesubscribed:= new(importer.EventList)
-	eventstobesubscribed.EventIpAddress = info.IpAddress
-	eventstobesubscribed.Events = append(eventstobesubscribed.Events,"ResourceAdded","ResourceRemoved","Alert")
+	eventstobesubscribed:= new(importer.SupportedEventList)
+	eventstobesubscribed.Events = vendor_default_events[info.Vendor]
 	return eventstobesubscribed, nil
 }
 
@@ -82,11 +85,17 @@
 	//Call API to subscribe events
 	ip_address := subeventlist.EventIpAddress
 	for _, event := range subeventlist.Events {
-		rtn, id := add_subscription(ip_address, event)
-		if rtn {
-			s.devicemap[ip_address].subscriptions[event] = id
-			fmt.Println("subscription added", event, id)
-		}
+                if _, ok := s.devicemap[ip_address].subscriptions[event]; !ok {
+                 rtn, id := add_subscription(ip_address, event)
+                        if rtn {
+                                 s.devicemap[ip_address].subscriptions[event] = id
+                                fmt.Println("subscription added", event, id)
+                        }
+                } else {
+                                log.WithFields(log.Fields{
+                                  "Event": event,
+                                }).Info("Already Subscribed")
+                }
 	}
 	return &empty.Empty{}, nil
 }
@@ -96,11 +105,17 @@
        ip_address := unsubeventlist.EventIpAddress
        //Call API to unsubscribe events
         for _, event := range unsubeventlist.Events {
-                rtn := remove_subscription(ip_address, s.devicemap[ip_address].subscriptions[event] )
-                if rtn {
-                        delete(s.devicemap[ip_address].subscriptions, event)
-                        fmt.Println("subscription removed", event)
-                }
+                if _, ok := s.devicemap[ip_address].subscriptions[event]; ok {
+                 rtn := remove_subscription(ip_address, s.devicemap[ip_address].subscriptions[event] )
+                        if rtn {
+                                delete(s.devicemap[ip_address].subscriptions, event)
+                                fmt.Println("subscription removed", event)
+                        }
+                } else {
+                                log.WithFields(log.Fields{
+                                  "Event": event,
+                                }).Info("was not Subscribed")
+                        }
         }
 
        return &empty.Empty{}, nil
@@ -112,7 +127,7 @@
 	donechan := s.devicemap[ip_address].datacollector.quit
 	for {
 		select {
-		case freq := <- freqchan:
+		case freq := <-freqchan:
 			ticker.Stop()
 			ticker = *time.NewTicker(time.Duration(freq) * time.Second)
 		case <-ticker.C:
@@ -142,12 +157,15 @@
 			quit: make(chan bool),
 		},
 		freqchan:        make(chan uint32),
+                vendor: info.Vendor,
 	}
+        //default_events := [...]string{}
 	s.devicemap[info.IpAddress] = &d
 	ip_address:= info.IpAddress
 	fmt.Println("Configuring  %s ...", ip_address)
 	// call subscription function with info.IpAddress
 	http.DefaultTransport.(*http.Transport).TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
+	default_events := vendor_default_events[info.Vendor]
 	for _, event := range default_events {
 		rtn, id := add_subscription(ip_address, event)
 		if rtn {
@@ -231,8 +249,14 @@
 }
 
 func init() {
+        Formatter := new(log.TextFormatter)
+        Formatter.TimestampFormat = "02-01-2006 15:04:05"
+        Formatter.FullTimestamp = true
+        log.SetFormatter(Formatter)
 	fmt.Println("Connecting to broker: ")
 	fmt.Println("Listening to  http server")
+        log.Info("log Connecting to broker:")
+        log.Info("log Listening to  http server ")
 }
 
 
diff --git a/proto/importer.proto b/proto/importer.proto
index 6a582a2..2397e32 100644
--- a/proto/importer.proto
+++ b/proto/importer.proto
@@ -8,22 +8,26 @@
 
 
 message DeviceInfo {
-    string ip_address = 1;
-    uint32 frequency = 2;
+	string ip_address = 1;
+	uint32 frequency = 2;
+        string vendor = 3;
 }
 
 message EventList {
-       string event_ip_address = 1;
+	string event_ip_address = 1;
         repeated string events = 2;
 }
 
+message SupportedEventList {
+        repeated string events = 1;
+}
 
 service device_management {
     rpc SendDeviceInfo(DeviceInfo) returns (google.protobuf.Empty) {}
 
     rpc SetFrequency(DeviceInfo) returns (google.protobuf.Empty) {}
 
-    rpc GetEventList(DeviceInfo) returns (EventList) {}
+    rpc GetEventList(DeviceInfo) returns (SupportedEventList) {}
 
     rpc SubsrcribeGivenEvents(EventList)  returns (google.protobuf.Empty) {}
 
