diff --git a/api/event.go b/api/event.go
index 7852946bd1a509114faef4694f08713b9ee387ce..64db960c6c9500ed106d3b2c8ba0cad453575b34 100644
--- a/api/event.go
+++ b/api/event.go
@@ -35,14 +35,12 @@ func (e reportableEvent) String() string {
 // Holds state for the event reporting system
 type eventManager struct {
 	eventCh  chan reportableEvent
-	eventCbs []EventCallbackFunction
-	eventLck sync.Mutex
+	eventCbs sync.Map
 }
 
 func newEventManager() *eventManager {
 	return &eventManager{
-		eventCh:  make(chan reportableEvent, 1000),
-		eventCbs: make([]EventCallbackFunction, 0),
+		eventCh: make(chan reportableEvent, 1000),
 	}
 }
 
@@ -67,25 +65,20 @@ func (e *eventManager) ReportEvent(priority int, category, evtType,
 // RegisterEventCallback records the given function to receive
 // ReportableEvent objects. It returns the internal index
 // of the callback so that it can be deleted later.
-func (e *eventManager) RegisterEventCallback(myFunc EventCallbackFunction) int {
-	e.eventLck.Lock()
-	defer e.eventLck.Unlock()
-	e.eventCbs = append(e.eventCbs, myFunc)
-	return len(e.eventCbs) - 1
+func (e *eventManager) RegisterEventCallback(name string,
+	myFunc EventCallbackFunction) error {
+	_, existsAlready := e.eventCbs.LoadOrStore(name, myFunc)
+	if existsAlready {
+		return errors.Errorf("Key %s already exists as event callback",
+			name)
+	}
+	return nil
 }
 
 // UnregisterEventCallback deletes the callback identified by the
 // index. It returns an error if it fails.
-func (e *eventManager) UnregisterEventCallback(index int) error {
-	e.eventLck.Lock()
-	defer e.eventLck.Unlock()
-	if index > 0 && index < len(e.eventCbs) {
-		e.eventCbs = append(e.eventCbs[:index], e.eventCbs[index+1:]...)
-	} else {
-		return errors.Errorf("Index %d out of bounds: %d -> %d",
-			index, 0, len(e.eventCbs))
-	}
-	return nil
+func (e *eventManager) UnregisterEventCallback(name string) {
+	e.eventCbs.Delete(name)
 }
 
 func (e *eventManager) eventService() (stoppable.Stoppable, error) {
@@ -109,10 +102,12 @@ func (e *eventManager) reportEventsHandler(stop *stoppable.Single) {
 			// against it. It's the users responsibility not to let
 			// the event queue explode. The API will report errors
 			// in the logging any time the event queue gets full.
-			for i := 0; i < len(e.eventCbs); i++ {
-				e.eventCbs[i](evt.Priority, evt.Category,
-					evt.EventType, evt.Details)
-			}
+			e.eventCbs.Range(func(name, myFunc interface{}) bool {
+				f := myFunc.(EventCallbackFunction)
+				f(evt.Priority, evt.Category, evt.EventType,
+					evt.Details)
+				return true
+			})
 		}
 	}
 }
@@ -126,12 +121,13 @@ func (c *Client) ReportEvent(priority int, category, evtType, details string) {
 // RegisterEventCallback records the given function to receive
 // ReportableEvent objects. It returns the internal index
 // of the callback so that it can be deleted later.
-func (c *Client) RegisterEventCallback(myFunc EventCallbackFunction) int {
-	return c.events.RegisterEventCallback(myFunc)
+func (c *Client) RegisterEventCallback(name string,
+	myFunc EventCallbackFunction) error {
+	return c.events.RegisterEventCallback(name, myFunc)
 }
 
 // UnregisterEventCallback deletes the callback identified by the
 // index. It returns an error if it fails.
-func (c *Client) UnregisterEventCallback(index int) error {
-	return c.events.UnregisterEventCallback(index)
+func (c *Client) UnregisterEventCallback(name string) {
+	c.events.UnregisterEventCallback(name)
 }
diff --git a/bindings/event.go b/bindings/event.go
index 895f347d2539e848b8a58afa98fcd29102b8ff38..95f32800a11fac5f252286b3bc22bebf26c557c3 100644
--- a/bindings/event.go
+++ b/bindings/event.go
@@ -14,12 +14,13 @@ import (
 // RegisterEventCallback records the given function to receive
 // ReportableEvent objects. It returns the internal index
 // of the callback so that it can be deleted later.
-func (c *Client) RegisterEventCallback(myFunc api.EventCallbackFunction) int {
-	return c.api.RegisterEventCallback(myFunc)
+func (c *Client) RegisterEventCallback(name string,
+	myFunc api.EventCallbackFunction) error {
+	return c.api.RegisterEventCallback(name, myFunc)
 }
 
 // UnregisterEventCallback deletes the callback identified by the
 // index. It returns an error if it fails.
-func (c *Client) UnregisterEventCallback(index int) error {
-	return c.api.UnregisterEventCallback(index)
+func (c *Client) UnregisterEventCallback(name string) {
+	c.api.UnregisterEventCallback(name)
 }