keycloak-aplcache

KEYCLOAK-392 Admin events

3/30/2015 9:05:58 AM

Changes

services/src/main/java/org/keycloak/services/managers/EventsManager.java 65(+0 -65)

Details

diff --git a/broker/oidc/src/main/java/org/keycloak/broker/oidc/OIDCIdentityProvider.java b/broker/oidc/src/main/java/org/keycloak/broker/oidc/OIDCIdentityProvider.java
index e712dd4..b4058b1 100755
--- a/broker/oidc/src/main/java/org/keycloak/broker/oidc/OIDCIdentityProvider.java
+++ b/broker/oidc/src/main/java/org/keycloak/broker/oidc/OIDCIdentityProvider.java
@@ -25,6 +25,7 @@ import org.keycloak.broker.provider.FederatedIdentity;
 import org.keycloak.broker.provider.IdentityBrokerException;
 import org.keycloak.events.Errors;
 import org.keycloak.events.EventBuilder;
+import org.keycloak.events.EventGroup;
 import org.keycloak.events.EventType;
 import org.keycloak.jose.jws.JWSInput;
 import org.keycloak.models.RealmModel;
@@ -32,7 +33,6 @@ import org.keycloak.models.UserSessionModel;
 import org.keycloak.representations.AccessTokenResponse;
 import org.keycloak.representations.IDToken;
 import org.keycloak.services.managers.AuthenticationManager;
-import org.keycloak.services.managers.EventsManager;
 import org.keycloak.services.messages.Messages;
 import org.keycloak.services.resources.IdentityBrokerService;
 import org.keycloak.services.resources.RealmsResource;
@@ -88,14 +88,14 @@ public class OIDCIdentityProvider extends AbstractOAuth2IdentityProvider<OIDCIde
             UserSessionModel userSession = session.sessions().getUserSession(realm, state);
             if (userSession == null) {
                 logger.error("no valid user session");
-                EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder();
+                EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection);
                 event.event(EventType.LOGOUT);
                 event.error(Errors.USER_SESSION_NOT_FOUND);
                 return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.IDENTITY_PROVIDER_UNEXPECTED_ERROR);
             }
             if (userSession.getState() != UserSessionModel.State.LOGGING_OUT) {
                 logger.error("usersession in different state");
-                EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder();
+                EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection);
                 event.event(EventType.LOGOUT);
                 event.error(Errors.USER_SESSION_NOT_FOUND);
                 return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.SESSION_NOT_ACTIVE);
diff --git a/broker/saml/src/main/java/org/keycloak/broker/saml/SAMLEndpoint.java b/broker/saml/src/main/java/org/keycloak/broker/saml/SAMLEndpoint.java
index ae6fbe4..f5e2fdf 100755
--- a/broker/saml/src/main/java/org/keycloak/broker/saml/SAMLEndpoint.java
+++ b/broker/saml/src/main/java/org/keycloak/broker/saml/SAMLEndpoint.java
@@ -9,6 +9,7 @@ import org.keycloak.broker.provider.IdentityProvider;
 import org.keycloak.events.Details;
 import org.keycloak.events.Errors;
 import org.keycloak.events.EventBuilder;
+import org.keycloak.events.EventGroup;
 import org.keycloak.events.EventType;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
@@ -18,7 +19,6 @@ import org.keycloak.protocol.saml.SAMLRequestParser;
 import org.keycloak.protocol.saml.SamlProtocol;
 import org.keycloak.protocol.saml.SamlProtocolUtils;
 import org.keycloak.services.managers.AuthenticationManager;
-import org.keycloak.services.managers.EventsManager;
 import org.keycloak.services.messages.Messages;
 import org.keycloak.services.resources.flows.Flows;
 import org.picketlink.common.constants.GeneralConstants;
@@ -163,7 +163,7 @@ public class SAMLEndpoint {
         }
 
         public Response execute(String samlRequest, String samlResponse, String relayState) {
-            event = new EventsManager(realm, session, clientConnection).createEventBuilder();
+            event = new EventBuilder(EventGroup.USER, realm, session, clientConnection);
             Response response = basicChecks(samlRequest, samlResponse);
             if (response != null) return response;
             if (samlRequest != null) return handleSamlRequest(samlRequest, relayState);
diff --git a/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.0.0.Final.xml b/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.0.0.Final.xml
index 1700e39..edc976e 100644
--- a/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.0.0.Final.xml
+++ b/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.0.0.Final.xml
@@ -92,7 +92,6 @@
             <column name="SESSION_ID" type="VARCHAR(255)"/>
             <column name="TIME" type="BIGINT"/>
             <column name="TYPE" type="VARCHAR(255)"/>
-            <column name="EVENT_GROUP" type="VARCHAR(255)"/>
             <column name="USER_ID" type="VARCHAR(255)"/>
         </createTable>
         <createTable tableName="FED_PROVIDERS">
@@ -197,12 +196,6 @@
             </column>
             <column name="VALUE" type="VARCHAR(255)"/>
         </createTable>
-        <createTable tableName="REALM_ENABLED_EVENT_TYPES">
-            <column name="REALM_ID" type="VARCHAR(36)">
-                <constraints nullable="false"/>
-            </column>
-            <column name="VALUE" type="VARCHAR(255)"/>
-        </createTable>
         <createTable tableName="REALM_REQUIRED_CREDENTIAL">
             <column name="TYPE" type="VARCHAR(255)">
                 <constraints nullable="false"/>
@@ -412,7 +405,6 @@
         <addForeignKeyConstraint baseColumnNames="CHILD_ROLE" baseTableName="COMPOSITE_ROLE" constraintName="FK_GR7THLLB9LU8Q4VQA4524JJY8" referencedColumnNames="ID" referencedTableName="KEYCLOAK_ROLE"/>
         <addForeignKeyConstraint baseColumnNames="ROLE_ID" baseTableName="REALM_DEFAULT_ROLES" constraintName="FK_H4WPD7W4HSOOLNI3H0SW7BTJE" referencedColumnNames="ID" referencedTableName="KEYCLOAK_ROLE"/>
         <addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_EVENTS_LISTENERS" constraintName="FK_H846O4H0W8EPX5NXEV9F5Y69J" referencedColumnNames="ID" referencedTableName="REALM"/>
-        <addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_ENABLED_EVENT_TYPES" constraintName="FK_H846O4H0W8EPX5NWEDRF5Y69J" referencedColumnNames="ID" referencedTableName="REALM"/>
         <addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_APPLICATION" constraintName="FK_L5QGA3RFME47335JY8JXYXH3I" referencedColumnNames="ID" referencedTableName="CLIENT"/>
         <addForeignKeyConstraint baseColumnNames="CLIENT_ID" baseTableName="WEB_ORIGINS" constraintName="FK_LOJPHO213XCX4WNKOG82SSRFY" referencedColumnNames="ID" referencedTableName="CLIENT"/>
         <addForeignKeyConstraint baseColumnNames="APPLICATION_ID" baseTableName="APPLICATION_DEFAULT_ROLES" constraintName="FK_MAYLTS7KLWQW2H8M2B5JOYTKY" referencedColumnNames="ID" referencedTableName="CLIENT"/>
diff --git a/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.2.0.Beta1.xml b/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.2.0.Beta1.xml
index b8d20a5..54f7e08 100755
--- a/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.2.0.Beta1.xml
+++ b/connections/jpa-liquibase/src/main/resources/META-INF/jpa-changelog-1.2.0.Beta1.xml
@@ -161,5 +161,18 @@
         <dropTable tableName="REALM_SOCIAL_CONFIG" cascadeConstraints="true" />
         <dropColumn tableName="CLIENT" columnName="ALLOWED_CLAIMS_MASK" />
 
+        <createTable tableName="REALM_ENABLED_EVENT_TYPES">
+            <column name="REALM_ID" type="VARCHAR(36)">
+                <constraints nullable="false"/>
+            </column>
+            <column name="VALUE" type="VARCHAR(255)"/>
+        </createTable>
+        <addForeignKeyConstraint baseColumnNames="REALM_ID" baseTableName="REALM_ENABLED_EVENT_TYPES" constraintName="FK_H846O4H0W8EPX5NWEDRF5Y69J" referencedColumnNames="ID" referencedTableName="REALM"/>
+
+        <addColumn tableName="EVENT_ENTITY">
+            <column name="EVENT_GROUP" type="VARCHAR(255)"/>
+            <column name="REPRESENTATION" type="BLOB"/>
+        </addColumn>
+        
     </changeSet>
 </databaseChangeLog>
diff --git a/events/api/src/main/java/org/keycloak/events/Details.java b/events/api/src/main/java/org/keycloak/events/Details.java
index 75c71ff..e0a3fc6 100755
--- a/events/api/src/main/java/org/keycloak/events/Details.java
+++ b/events/api/src/main/java/org/keycloak/events/Details.java
@@ -13,10 +13,7 @@ public interface Details {
     String RESPONSE_TYPE = "response_type";
     String AUTH_METHOD = "auth_method";
     String IDENTITY_PROVIDER = "identity_provider";
-    String IDENTITY_PROVIDER_IDENTITY = "identity_provider_identity";
-    String IDENTITY_PROVIDER_ALIAS = "identity_provider_alias";
-    String IDENTITY_PROVIDER_FACTORY = "identity_provider_factory";
-    String IDENTITY_PROVIDER_FACTORY_IDENTITY = "identity_provider_factory_identity";
+    String IDENTITY_PROVIDER_USERNAME = "identity_provider_identity";
     String REGISTER_METHOD = "register_method";
     String USERNAME = "username";
     String REMEMBER_ME = "remember_me";
@@ -26,20 +23,10 @@ public interface Details {
     String UPDATED_REFRESH_TOKEN_ID = "updated_refresh_token_id";
     String NODE_HOST = "node_host";
     String REASON = "reason";
-    
-    String REALM_ID = "realm_id";
-    String REALM_NAME = "realm_name";
-    String REALM_REQUIRED_SSL = "realm_required_ssl";
-    
+
+    String REALM = "realm";
+    String REPRESENTATION = "representation";
+
     String APPLICATION_CLUSTER_NODE = "application_cluster_node";
-    
-    String ROLE_ID = "role_id";
-    String ROLE_NAME = "role_name";
-    
-    String PROVIDER_ID = "provider_id";
-    String PROVIDER_NAME = "provider_name";
-    
-    String SERVER_VERSION = "server_version";
-    String SERVER_TIME = "server_time";
-    
+
 }
diff --git a/events/api/src/main/java/org/keycloak/events/Event.java b/events/api/src/main/java/org/keycloak/events/Event.java
index cebd418..af60333 100644
--- a/events/api/src/main/java/org/keycloak/events/Event.java
+++ b/events/api/src/main/java/org/keycloak/events/Event.java
@@ -12,7 +12,7 @@ public class Event {
 
     private EventType type;
     
-    private EventGroup eventGroup;
+    private EventGroup group;
 
     private String realmId;
 
@@ -26,6 +26,8 @@ public class Event {
 
     private String error;
 
+    private String representation;
+
     private Map<String, String> details;
 
     public long getTime() {
@@ -44,12 +46,12 @@ public class Event {
         this.type = type;
     }
     
-    public EventGroup getEventGroup() {
-        return eventGroup;
+    public EventGroup getGroup() {
+        return group;
     }
 
-    public void setEventGroup(EventGroup group) {
-        this.eventGroup = group;
+    public void setGroup(EventGroup group) {
+        this.group = group;
     }
 
     public String getRealmId() {
@@ -100,6 +102,14 @@ public class Event {
         this.error = error;
     }
 
+    public String getRepresentation() {
+        return representation;
+    }
+
+    public void setRepresentation(String representation) {
+        this.representation = representation;
+    }
+
     public Map<String, String> getDetails() {
         return details;
     }
@@ -112,14 +122,15 @@ public class Event {
         Event clone = new Event();
         clone.time = time;
         clone.type = type;
-        clone.eventGroup = eventGroup;
+        clone.group = group;
         clone.realmId = realmId;
         clone.clientId = clientId;
         clone.userId = userId;
         clone.sessionId = sessionId;
         clone.ipAddress = ipAddress;
         clone.error = error;
-        clone.details = details != null ? new HashMap<String, String>(details) : null;
+        clone.details = details != null ? new HashMap<>(details) : null;
+        clone.representation = representation;
         return clone;
     }
 
diff --git a/events/api/src/main/java/org/keycloak/events/EventBuilder.java b/events/api/src/main/java/org/keycloak/events/EventBuilder.java
index 0ad60ac..de8fcc8 100644
--- a/events/api/src/main/java/org/keycloak/events/EventBuilder.java
+++ b/events/api/src/main/java/org/keycloak/events/EventBuilder.java
@@ -1,16 +1,18 @@
 package org.keycloak.events;
 
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
 import org.jboss.logging.Logger;
+import org.keycloak.ClientConnection;
 import org.keycloak.models.ClientModel;
+import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.models.UserModel;
 import org.keycloak.models.UserSessionModel;
+import org.keycloak.util.JsonSerialization;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -18,30 +20,48 @@ import org.keycloak.models.UserSessionModel;
 public class EventBuilder {
 
     private static final Logger log = Logger.getLogger(EventBuilder.class);
-    
-    // These events are excluded by default and not persisted.
-    private EventType[] events = {EventType.VIEW_REALM,
-            EventType.VIEW_REALM_APPLICATIONS, EventType.VIEW_APPLICATION, EventType.VIEW_APPLICATION_USER_SESSIONS,
-            EventType.VIEW_IDENTITY_PROVIDER, EventType.VIEW_IDENTITY_PROVIDERS, EventType.VIEW_OAUTH_CLIENT,
-            EventType.VIEW_OAUTH_CLIENTS, EventType.VIEW_PROVIDER, EventType.VIEW_PROVIDER_FACTORIES, EventType.VIEW_USER,
-            EventType.VIEW_USER_SESSIONS, EventType.VIEW_USER_SOCIAL_LOGINS, EventType.VIEW_ROLE, EventType.VIEW_ROLES,
-            EventType.VIEW_CLIENT_CERTIFICATE, EventType.VIEW_SERVER_INFO };
-    
-    private Event event;
+
+    private EventStoreProvider store;
     private List<EventListenerProvider> listeners;
-    private Set<EventType> enabledEventTypes;
-    private Set<EventType> excludedEvents = new HashSet<EventType>(Arrays.asList(events));;
+    private RealmModel realm;
+    private Event event;
 
-    public EventBuilder(List<EventListenerProvider> listeners, Set<EventType> enabledEventTypes, RealmModel realm, String ipAddress) {
-        this.listeners = listeners;
-        this.enabledEventTypes = enabledEventTypes;
-        this.event = new Event();
+    public EventBuilder(EventGroup group, RealmModel realm, KeycloakSession session, ClientConnection clientConnection) {
+        this.realm = realm;
+
+        event = new Event();
+        event.setGroup(group);
+
+        if (realm.isEventsEnabled()) {
+            EventStoreProvider store = session.getProvider(EventStoreProvider.class);
+            if (store != null) {
+                this.store = store;
+            } else {
+                log.error("Events enabled, but no event store provider configured");
+            }
+        }
+
+        if (realm.getEventsListeners() != null && !realm.getEventsListeners().isEmpty()) {
+            this.listeners = new LinkedList<>();
+            for (String id : realm.getEventsListeners()) {
+                EventListenerProvider listener = session.getProvider(EventListenerProvider.class, id);
+                if (listener != null) {
+                    listeners.add(listener);
+                } else {
+                    log.error("Event listener '" + id + "' registered, but provider not found");
+                }
+            }
+        }
 
         realm(realm);
-        ipAddress(ipAddress);
+        ipAddress(clientConnection.getRemoteAddr());
     }
 
-    EventBuilder() {
+    private EventBuilder(EventStoreProvider store, List<EventListenerProvider> listeners, RealmModel realm, Event event) {
+        this.store = store;
+        this.listeners = listeners;
+        this.realm = realm;
+        this.event = event;
     }
 
     public EventBuilder realm(RealmModel realm) {
@@ -94,11 +114,6 @@ public class EventBuilder {
         return this;
     }
 
-    public EventBuilder eventGroup(EventGroup e) {
-        event.setEventGroup(e);
-        return this;
-    }
-
     public EventBuilder detail(String key, String value) {
         if (value == null || value.equals("")) {
             return this;
@@ -107,9 +122,18 @@ public class EventBuilder {
         if (event.getDetails() == null) {
             event.setDetails(new HashMap<String, String>());
         }
+        event.getDetails().put(key, value);
+        return this;
+    }
 
-        if (value != null && !value.isEmpty()) {
-            event.getDetails().put(key, value);
+    public EventBuilder representation(Object value) {
+        if (value == null || value.equals("")) {
+            return this;
+        }
+        try {
+            event.setRepresentation(JsonSerialization.writeValueAsPrettyString(value));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
         }
         return this;
     }
@@ -136,37 +160,26 @@ public class EventBuilder {
     }
 
     public EventBuilder clone() {
-        EventBuilder clone = new EventBuilder();
-        clone.listeners = listeners;
-        clone.event = event.clone();
-        return clone;
-    }
-
-    public EventBuilder reset() {
-        Event old = event;
-
-        event = new Event();
-        event.setRealmId(old.getRealmId());
-        event.setIpAddress(old.getIpAddress());
-        event.setClientId(old.getClientId());
-        event.setUserId(old.getUserId());
-
-        return this;
+        return new EventBuilder(store, listeners, realm, event.clone());
     }
 
     private void send() {
         event.setTime(System.currentTimeMillis());
 
+        if (store != null) {
+            if (realm.getEnabledEventTypes() != null && !realm.getEnabledEventTypes().isEmpty() ? realm.getEnabledEventTypes().contains(event.getType().name()) : event.getType().isSaveByDefault()) {
+                try {
+                    store.onEvent(event);
+                } catch (Throwable t) {
+                    log.error("Failed to save event", t);
+                }
+            }
+        }
+
         if (listeners != null) {
             for (EventListenerProvider l : listeners) {
                 try {
-                    if (enabledEventTypes != null && enabledEventTypes.size() > 0) {
-                        if (enabledEventTypes.contains(event.getType())) {
-                            l.onEvent(event);
-                        }
-                    } else if (!excludedEvents.contains(event.getType())) {
-                        l.onEvent(event);
-                    }
+                    l.onEvent(event);
                 } catch (Throwable t) {
                     log.error("Failed to send type to " + l, t);
                 }
diff --git a/events/api/src/main/java/org/keycloak/events/EventGroup.java b/events/api/src/main/java/org/keycloak/events/EventGroup.java
index fccdb27..f4ce2d3 100644
--- a/events/api/src/main/java/org/keycloak/events/EventGroup.java
+++ b/events/api/src/main/java/org/keycloak/events/EventGroup.java
@@ -6,7 +6,6 @@ package org.keycloak.events;
 public enum EventGroup {
     
     ADMIN,
-    USER,
-    EMAIL,
+    USER
     
 }
diff --git a/events/api/src/main/java/org/keycloak/events/EventType.java b/events/api/src/main/java/org/keycloak/events/EventType.java
index 3a0dc5e..d4638c2 100755
--- a/events/api/src/main/java/org/keycloak/events/EventType.java
+++ b/events/api/src/main/java/org/keycloak/events/EventType.java
@@ -5,119 +5,125 @@ package org.keycloak.events;
  */
 public enum EventType {
 
-    LOGIN,
-    LOGIN_ERROR,
-    REGISTER,
-    REGISTER_ERROR,
-    LOGOUT,
-    LOGOUT_ERROR,
-    CODE_TO_TOKEN,
-    CODE_TO_TOKEN_ERROR,
-    REFRESH_TOKEN,
-    VALIDATE_ACCESS_TOKEN,
-    VALIDATE_ACCESS_TOKEN_ERROR,
-    REFRESH_TOKEN_ERROR,
-    SOCIAL_LINK,
-    SOCIAL_LINK_ERROR,
-    REMOVE_FEDERATED_IDENTITY,
-    REMOVE_SOCIAL_LINK_ERROR,
-
-    UPDATE_EMAIL,
-    UPDATE_EMAIL_ERROR,
-    UPDATE_PROFILE,
-    UPDATE_PROFILE_ERROR,
-    UPDATE_PASSWORD,
-    UPDATE_PASSWORD_ERROR,
-    UPDATE_TOTP,
-    UPDATE_TOTP_ERROR,
-    VERIFY_EMAIL,
-    VERIFY_EMAIL_ERROR,
-
-    REMOVE_TOTP,
-    REMOVE_TOTP_ERROR,
-
-    SEND_VERIFY_EMAIL,
-    SEND_VERIFY_EMAIL_ERROR,
-    SEND_RESET_PASSWORD,
-    SEND_RESET_PASSWORD_ERROR,
-    RESET_PASSWORD,
-    RESET_PASSWORD_ERROR,
-
-    INVALID_SIGNATURE_ERROR,
-    REGISTER_NODE,
-    UNREGISTER_NODE,
-
-    USER_INFO_REQUEST,
-    USER_INFO_REQUEST_ERROR,
-
-    IDENTITY_PROVIDER_LOGIN,
-    IDENTITY_PROVIDER_LOGIN_ERROR,
-    IDENTITY_PROVIDER_RESPONSE,
-    IDENTITY_PROVIDER_RESPONSE_ERROR,
-    IDENTITY_PROVIDER_RETRIEVE_TOKEN,
-    IDENTITY_PROVIDER_RETRIEVE_TOKEN_ERROR,
-    IDENTITY_PROVIDER_ACCCOUNT_LINKING,
-    IDENTITY_PROVIDER_ACCCOUNT_LINKING_ERROR,
-    
-    VIEW_REALM,
-    UPDATE_REALM,
-    DELETE_REALM,
-    IMPORT_REALM,
-    UPLOAD_REALM,
-    VIEW_REALM_APPLICATIONS,
-    SET_REALM_USER_PERMISSIONS,
-    SET_REALM_ADAPTER_CONFIGURATION,
-    
-    CREATE_APPLICATION,
-    UPDATE_APPLICATION,
-    VIEW_APPLICATION,
-    DELETE_APPLICATION,
-    
-    VIEW_APPLICATION_USER_SESSIONS,
-    INVALIDATE_APPLICATION_USER_SESSIONS,
-    INVALIDATE_APPLICATION_USER_SESSION,
-    REGISTER_APPLICATION_CLUSTER_NODE,
-    UNREGISTER_APPLICATION_CLUSTER_NODE,
-    
-    VIEW_CLIENT_CERTIFICATE,
-    GENERATE_CLIENT_CERTIFICATE,
-    UPLOAD_CLIENT_CERTIFICATE,
-    DOWNLOAD_CLIENT_CERTIFICATE,
-    
-    VIEW_IDENTITY_PROVIDER,
-    VIEW_IDENTITY_PROVIDERS,
-    IMPORT_IDENTITY_PROVIDER_CONFIG,
-    CREATE_IDENTITY_PROVIDER,
-    UPDATE_IDENTITY_PROVIDER,
-    DELETE_IDENTITY_PROVIDER,
-    
-    CREATE_OAUTH_CLIENT,
-    UPDATE_OAUTH_CLIENT,
-    VIEW_OAUTH_CLIENT,
-    VIEW_OAUTH_CLIENTS,
-    DELETE_OAUTH_CLIENT,
-    
-    VIEW_ROLE,
-    VIEW_ROLES,
-    CREATE_ROLE,
-    UPDATE_ROLE,
-    DELETE_ROLE,
-    MAKE_ROLE_COMPOSITE,
-    
-    UPDATE_USER,
-    CREATE_USER,
-    VIEW_USER,
-    DELETE_USER,
-    VIEW_USER_SESSIONS,
-    VIEW_USER_SOCIAL_LOGINS,
-    INVALIDATE_USER_SESSIONS,
+    LOGIN(true),
+    LOGIN_ERROR(true),
+    REGISTER(true),
+    REGISTER_ERROR(true),
+    LOGOUT(true),
+    LOGOUT_ERROR(true),
+
+    CODE_TO_TOKEN(true),
+    CODE_TO_TOKEN_ERROR(true),
+
+    REFRESH_TOKEN(false),
+    REFRESH_TOKEN_ERROR(false),
+    VALIDATE_ACCESS_TOKEN(false),
+    VALIDATE_ACCESS_TOKEN_ERROR(false),
+
+    FEDERATED_IDENTITY_LINK(true),
+    FEDERATED_IDENTITY_LINK_ERROR(true),
+    REMOVE_FEDERATED_IDENTITY(true),
+    REMOVE_FEDERATED_IDENTITY_ERROR(true),
+
+    UPDATE_EMAIL(true),
+    UPDATE_EMAIL_ERROR(true),
+    UPDATE_PROFILE(true),
+    UPDATE_PROFILE_ERROR(true),
+    UPDATE_PASSWORD(true),
+    UPDATE_PASSWORD_ERROR(true),
+    UPDATE_TOTP(true),
+    UPDATE_TOTP_ERROR(true),
+    VERIFY_EMAIL(true),
+    VERIFY_EMAIL_ERROR(true),
+
+    REMOVE_TOTP(true),
+    REMOVE_TOTP_ERROR(true),
+
+    SEND_VERIFY_EMAIL(true),
+    SEND_VERIFY_EMAIL_ERROR(true),
+    SEND_RESET_PASSWORD(true),
+    SEND_RESET_PASSWORD_ERROR(true),
+    RESET_PASSWORD(true),
+    RESET_PASSWORD_ERROR(true),
+
+    INVALID_SIGNATURE_ERROR(false),
+    REGISTER_NODE(false),
+    UNREGISTER_NODE(false),
+
+    USER_INFO_REQUEST(false),
+    USER_INFO_REQUEST_ERROR(false),
+
+    IDENTITY_PROVIDER_LOGIN(false),
+    IDENTITY_PROVIDER_LOGIN_ERROR(false),
+    IDENTITY_PROVIDER_RESPONSE(false),
+    IDENTITY_PROVIDER_RESPONSE_ERROR(false),
+    IDENTITY_PROVIDER_RETRIEVE_TOKEN(false),
+    IDENTITY_PROVIDER_RETRIEVE_TOKEN_ERROR(false),
+    IDENTITY_PROVIDER_ACCCOUNT_LINKING(false),
+    IDENTITY_PROVIDER_ACCCOUNT_LINKING_ERROR(false),
     
-    CREATE_PROVIDER,
-    VIEW_PROVIDER,
-    VIEW_PROVIDER_FACTORIES,
-    UPDATE_PROVIDER,
-    DELETE_PROVIDER,
+    VIEW_REALM(false),
+    CREATE_REALM(false),
+    UPDATE_REALM(false),
+    DELETE_REALM(false),
+
+    VIEW_APPLICATIONS(false),
+    VIEW_APPLICATION(false),
+    CREATE_APPLICATION(false),
+    UPDATE_APPLICATION(false),
+    DELETE_APPLICATION(false),
     
-    VIEW_SERVER_INFO,
+    VIEW_APPLICATION_USER_SESSIONS(false),
+    LOGOUT_APPLICATION_USERS(false),
+    LOGOUT_USER(false),
+
+    REGISTER_APPLICATION_CLUSTER_NODE(false),
+    UNREGISTER_APPLICATION_CLUSTER_NODE(false),
     
+    VIEW_CLIENT_CERTIFICATE(false),
+    UPDATE_CLIENT_CERTIFICATE(false),
+
+    VIEW_IDENTITY_PROVIDERS(false),
+    VIEW_IDENTITY_PROVIDER(false),
+    CREATE_IDENTITY_PROVIDER(false),
+    UPDATE_IDENTITY_PROVIDER(false),
+    DELETE_IDENTITY_PROVIDER(false),
+
+    VIEW_OAUTH_CLIENTS(false),
+    VIEW_OAUTH_CLIENT(false),
+    CREATE_OAUTH_CLIENT(false),
+    UPDATE_OAUTH_CLIENT(false),
+    DELETE_OAUTH_CLIENT(false),
+
+    VIEW_ROLES(false),
+    VIEW_ROLE(false),
+    CREATE_ROLE(false),
+    UPDATE_ROLE(false),
+    DELETE_ROLE(false),
+
+    VIEW_USERS(false),
+    VIEW_USER(false),
+    CREATE_USER(false),
+    UPDATE_USER(false),
+    DELETE_USER(false),
+
+    VIEW_USER_SESSIONS(false),
+    LOGOUT_USER_SESSIONS(false),
+
+    VIEW_FEDERATION_PROVIDERS(false),
+    VIEW_FEDERATION_PROVIDER(false),
+    CREATE_FEDERATION_PROVIDER(false),
+    UPDATE_FEDERATION_PROVIDER(false),
+    DELETE_FEDERATION_PROVIDER(false);
+
+    private boolean saveByDefault;
+
+    EventType(boolean saveByDefault) {
+        this.saveByDefault = saveByDefault;
+    }
+
+    public boolean isSaveByDefault() {
+        return saveByDefault;
+    }
+
 }
diff --git a/events/jpa/src/main/java/org/keycloak/events/jpa/EventEntity.java b/events/jpa/src/main/java/org/keycloak/events/jpa/EventEntity.java
index 9f0aec2..e6ca877 100644
--- a/events/jpa/src/main/java/org/keycloak/events/jpa/EventEntity.java
+++ b/events/jpa/src/main/java/org/keycloak/events/jpa/EventEntity.java
@@ -3,6 +3,7 @@ package org.keycloak.events.jpa;
 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.Id;
+import javax.persistence.Lob;
 import javax.persistence.Table;
 
 /**
@@ -23,7 +24,7 @@ public class EventEntity {
     private String type;
     
     @Column(name="EVENT_GROUP")
-    private String eventGroup;
+    private String group;
 
     @Column(name="REALM_ID")
     private String realmId;
@@ -46,6 +47,10 @@ public class EventEntity {
     @Column(name="DETAILS_JSON", length = 2550)
     private String detailsJson;
 
+    @Column(name="REPRESENTATION")
+    @Lob
+    private String representation;
+
     public String getId() {
         return id;
     }
@@ -70,12 +75,12 @@ public class EventEntity {
         this.type = type;
     }
 
-    public String getEventGroup() {
-        return eventGroup;
+    public String getGroup() {
+        return group;
     }
 
-    public void setEventGroup(String eventGroup) {
-        this.eventGroup = eventGroup;
+    public void setGroup(String group) {
+        this.group = group;
     }
     
     public String getRealmId() {
@@ -134,4 +139,11 @@ public class EventEntity {
         this.detailsJson = detailsJson;
     }
 
+    public String getRepresentation() {
+        return representation;
+    }
+
+    public void setRepresentation(String representation) {
+        this.representation = representation;
+    }
 }
diff --git a/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java b/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java
index c604426..08b432e 100755
--- a/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java
+++ b/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProvider.java
@@ -10,11 +10,9 @@ import org.keycloak.events.EventStoreProvider;
 import org.keycloak.events.EventType;
 
 import javax.persistence.EntityManager;
-import javax.persistence.EntityTransaction;
 
 import java.io.IOException;
 import java.util.Map;
-import java.util.Set;
 import java.util.UUID;
 
 /**
@@ -28,12 +26,9 @@ public class JpaEventStoreProvider implements EventStoreProvider {
     private static final Logger logger = Logger.getLogger(JpaEventStoreProvider.class);
 
     private EntityManager em;
-    private EntityTransaction tx;
-    private Set<EventType> includedEvents;
 
-    public JpaEventStoreProvider(EntityManager em, Set<EventType> includedEvents) {
+    public JpaEventStoreProvider(EntityManager em) {
         this.em = em;
-        this.includedEvents = includedEvents;
     }
 
     @Override
@@ -58,9 +53,7 @@ public class JpaEventStoreProvider implements EventStoreProvider {
 
     @Override
     public void onEvent(Event event) {
-        if (includedEvents.contains(event.getType())) {
-            em.persist(convert(event));
-        }
+        em.persist(convert(event));
     }
 
     @Override
@@ -72,13 +65,14 @@ public class JpaEventStoreProvider implements EventStoreProvider {
         e.setId(UUID.randomUUID().toString());
         e.setTime(o.getTime());
         e.setType(o.getType().toString());
-        e.setEventGroup(o.getEventGroup().toString());
+        e.setGroup(o.getGroup().toString());
         e.setRealmId(o.getRealmId());
         e.setClientId(o.getClientId());
         e.setUserId(o.getUserId());
         e.setSessionId(o.getSessionId());
         e.setIpAddress(o.getIpAddress());
         e.setError(o.getError());
+        e.setRepresentation(o.getRepresentation());
         try {
             e.setDetailsJson(mapper.writeValueAsString(o.getDetails()));
         } catch (IOException ex) {
@@ -91,13 +85,14 @@ public class JpaEventStoreProvider implements EventStoreProvider {
         Event e = new Event();
         e.setTime(o.getTime());
         e.setType(EventType.valueOf(o.getType()));
-        e.setEventGroup(EventGroup.valueOf(o.getEventGroup()));
+        e.setGroup(EventGroup.valueOf(o.getGroup()));
         e.setRealmId(o.getRealmId());
         e.setClientId(o.getClientId());
         e.setUserId(o.getUserId());
         e.setSessionId(o.getSessionId());
         e.setIpAddress(o.getIpAddress());
         e.setError(o.getError());
+        e.setRepresentation(o.getRepresentation());
         try {
             Map<String, String> details = mapper.readValue(o.getDetailsJson(), mapType);
             e.setDetails(details);
diff --git a/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProviderFactory.java b/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProviderFactory.java
index 819c58f..0d95457 100755
--- a/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProviderFactory.java
+++ b/events/jpa/src/main/java/org/keycloak/events/jpa/JpaEventStoreProviderFactory.java
@@ -18,33 +18,14 @@ public class JpaEventStoreProviderFactory implements EventStoreProviderFactory {
 
     public static final String ID = "jpa";
 
-    private Set<EventType> includedEvents = new HashSet<EventType>();
-
     @Override
     public EventStoreProvider create(KeycloakSession session) {
         JpaConnectionProvider connection = session.getProvider(JpaConnectionProvider.class);
-        return new JpaEventStoreProvider(connection.getEntityManager(), includedEvents);
+        return new JpaEventStoreProvider(connection.getEntityManager());
     }
 
     @Override
     public void init(Config.Scope config) {
-        String[] include = config.getArray("include-events");
-        if (include != null) {
-            for (String i : include) {
-                includedEvents.add(EventType.valueOf(i.toUpperCase()));
-            }
-        } else {
-            for (EventType i : EventType.values()) {
-                includedEvents.add(i);
-            }
-        }
-
-        String[] exclude = config.getArray("exclude-events");
-        if (exclude != null) {
-            for (String e : exclude) {
-                includedEvents.remove(EventType.valueOf(e.toUpperCase()));
-            }
-        }
     }
 
     @Override
diff --git a/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProvider.java b/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProvider.java
index 8118189..50de4d7 100755
--- a/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProvider.java
+++ b/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProvider.java
@@ -12,7 +12,6 @@ import org.keycloak.events.EventType;
 
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Set;
 
 /**
  * @author <a href="mailto:sthorger@redhat.com">Stian Thorgersen</a>
@@ -20,11 +19,9 @@ import java.util.Set;
 public class MongoEventStoreProvider implements EventStoreProvider {
 
     private DBCollection events;
-    private Set<EventType> includedEvents;
 
-    public MongoEventStoreProvider(DBCollection events, Set<EventType> includedEvents) {
+    public MongoEventStoreProvider(DBCollection events) {
         this.events = events;
-        this.includedEvents = includedEvents;
     }
 
     @Override
@@ -52,9 +49,7 @@ public class MongoEventStoreProvider implements EventStoreProvider {
 
     @Override
     public void onEvent(Event event) {
-        if (includedEvents.contains(event.getType())) {
-            events.insert(convert(event));
-        }
+       events.insert(convert(event));
     }
 
     @Override
@@ -65,13 +60,14 @@ public class MongoEventStoreProvider implements EventStoreProvider {
         BasicDBObject e = new BasicDBObject();
         e.put("time", o.getTime());
         e.put("type", o.getType().toString());
-        e.put("group", o.getEventGroup().toString());
+        e.put("group", o.getGroup().toString());
         e.put("realmId", o.getRealmId());
         e.put("clientId", o.getClientId());
         e.put("userId", o.getUserId());
         e.put("sessionId", o.getSessionId());
         e.put("ipAddress", o.getIpAddress());
         e.put("error", o.getError());
+        e.put("representation", o.getRepresentation());
 
         BasicDBObject details = new BasicDBObject();
         if (o.getDetails() != null) {
@@ -88,13 +84,14 @@ public class MongoEventStoreProvider implements EventStoreProvider {
         Event e = new Event();
         e.setTime(o.getLong("time"));
         e.setType(EventType.valueOf(o.getString("type")));
-        e.setEventGroup(EventGroup.valueOf(o.getString("group")));
+        e.setGroup(EventGroup.valueOf(o.getString("group")));
         e.setRealmId(o.getString("realmId"));
         e.setClientId(o.getString("clientId"));
         e.setUserId(o.getString("userId"));
         e.setSessionId(o.getString("sessionId"));
         e.setIpAddress(o.getString("ipAddress"));
         e.setError(o.getString("error"));
+        e.setRepresentation(o.getString("representation"));
 
         BasicDBObject d = (BasicDBObject) o.get("details");
         if (d != null) {
diff --git a/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProviderFactory.java b/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProviderFactory.java
index 517bad6..ecf21a4 100755
--- a/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProviderFactory.java
+++ b/events/mongo/src/main/java/org/keycloak/events/mongo/MongoEventStoreProviderFactory.java
@@ -23,8 +23,6 @@ public class MongoEventStoreProviderFactory implements EventStoreProviderFactory
 
     public static final String ID = "mongo";
 
-    private Set<EventType> includedEvents = new HashSet<EventType>();
-
     @Override
     public EventStoreProvider create(KeycloakSession session) {
         MongoConnectionProvider connection = session.getProvider(MongoConnectionProvider.class);
@@ -32,28 +30,11 @@ public class MongoEventStoreProviderFactory implements EventStoreProviderFactory
         DBCollection collection = connection.getDB().getCollection("events");
         collection.setWriteConcern(WriteConcern.UNACKNOWLEDGED);
 
-        return new MongoEventStoreProvider(collection, includedEvents);
+        return new MongoEventStoreProvider(collection);
     }
 
     @Override
     public void init(Config.Scope config) {
-        String[] include = config.getArray("include-events");
-        if (include != null) {
-            for (String i : include) {
-                includedEvents.add(EventType.valueOf(i.toUpperCase()));
-            }
-        } else {
-            for (EventType i : EventType.values()) {
-                includedEvents.add(i);
-            }
-        }
-
-        String[] exclude = config.getArray("exclude-events");
-        if (exclude != null) {
-            for (String e : exclude) {
-                includedEvents.remove(EventType.valueOf(e.toUpperCase()));
-            }
-        }
     }
 
     @Override
diff --git a/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProvider.java b/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProvider.java
index efe716f..d980af3 100755
--- a/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProvider.java
+++ b/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProvider.java
@@ -24,7 +24,7 @@ public class MemEventStoreProvider implements EventStoreProvider {
 
     @Override
     public EventQuery createQuery() {
-        return new MemEventQuery(new LinkedList<Event>(events));
+        return new MemEventQuery(new LinkedList<>(events));
     }
 
     @Override
@@ -59,7 +59,9 @@ public class MemEventStoreProvider implements EventStoreProvider {
 
     @Override
     public void onEvent(Event event) {
-        events.add(0, event);
+        if (!excludedEvents.contains(event.getType())) {
+            events.add(0, event);
+        }
     }
 
     @Override
diff --git a/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProviderFactory.java b/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProviderFactory.java
index a7dd5b3..83fd80e 100755
--- a/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProviderFactory.java
+++ b/examples/providers/event-store-mem/src/main/java/org/keycloak/examples/providers/events/MemEventStoreProviderFactory.java
@@ -34,7 +34,7 @@ public class MemEventStoreProviderFactory implements EventStoreProviderFactory {
 
         String excludes = config.get("excludes");
         if (excludes != null) {
-            excludedEvents = new HashSet<EventType>();
+            excludedEvents = new HashSet<>();
             for (String e : excludes.split(",")) {
                 excludedEvents.add(EventType.valueOf(e));
             }
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js
index fc0ac6d..e38c29c 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/app.js
@@ -244,6 +244,9 @@ module.config([ '$routeProvider', function($routeProvider) {
             resolve : {
                 realm : function(RealmLoader) {
                     return RealmLoader();
+                },
+                serverInfo : function(ServerInfoLoader) {
+                    return ServerInfoLoader();
                 }
             },
             controller : 'RealmEventsCtrl'
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js
index 3aa8fb1..bb7620e 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/js/controllers/realm.js
@@ -1238,19 +1238,12 @@ module.controller('RealmEventsConfigCtrl', function($scope, eventsConfig, RealmE
     });
 
     $scope.eventListeners = serverInfo.eventListeners;
-    
-    // Admin can choose any number of these eventTypes for persistence.
-	// By default, admin view events are not persisted.
-    $scope.enabledEventTypes = [{tag:'LOGIN'}, {tag:'REGISTER'}, {tag:'LOGOUT'}, {tag:'CODE_TO_TOKEN'},
-    	{tag:'REFRESH_TOKEN'}, {tag:'VALIDATE_ACCESS_TOKEN'}, {tag:'LOGIN_ERROR'}, {tag:'REGISTER_ERROR'},
-    	{tag:'LOGOUT_ERROR'}, {tag:'CODE_TO_TOKEN_ERROR'}, {tag:'REFRESH_TOKEN_ERROR'}, {tag:'VALIDATE_ACCESS_TOKEN_ERROR'},
-    	{tag:'UPDATE_EMAIL'}, {tag:'UPDATE_PROFILE'}, {tag:'UPDATE_PASSWORD'}, {tag:'UPDATE_TOTP'},
-    	{tag:'UPLOAD_REALM'}, {tag:'IMPORT_REALM'}, {tag:'UPDATE_REALM'}, {tag:'DELETE_REALM'},
-    	{tag:'CREATE_USER'}, {tag:'UPDATE_USER'}, {tag:'DELETE_USER'}, {tag:'VIEW_USER_SESSIONS'},
-    	{tag:'CREATE_APPLICATION'}, {tag:'UPDATE_APPLICATION'}, {tag:'DELETE_APPLICATION'}, {tag:'VIEW_APPLICATION'},
-    	{tag:'CREATE_OAUTH_CLIENT'}, {tag:'UPDATE_OAUTH_CLIENT'}, {tag:'VIEW_OAUTH_CLIENT'}, {tag:'DELETE_OAUTH_CLIENT'},
-    	{tag:'CREATE_PROVIDER'}, {tag:'UPDATE_PROVIDER'}, {tag:'DELETE_PROVIDER'}, {tag:'VIEW_ROLE'},
-    	{tag:'CREATE_ROLE'}, {tag:'UPDATE_ROLE'}, {tag:'DELETE_ROLE'}, {tag:'VIEW_SERVER_INFO'}]
+
+    $scope.eventSelectOptions = {
+        'multiple': true,
+        'simple_tags': true,
+        'tags': serverInfo.eventTypes
+    };
 
     var oldCopy = angular.copy($scope.eventsConfig);
     $scope.changed = false;
@@ -1291,22 +1284,15 @@ module.controller('RealmEventsConfigCtrl', function($scope, eventsConfig, RealmE
     };
 });
 
-module.controller('RealmEventsCtrl', function($scope, RealmEvents, realm) {
+module.controller('RealmEventsCtrl', function($scope, RealmEvents, realm, serverInfo) {
     $scope.realm = realm;
     $scope.page = 0;
     
-    // Admin can filter events view by selecting any one or multiple of these events.
-    $scope.eventTypes = [{tag:'LOGIN'}, {tag:'REGISTER'}, {tag:'LOGOUT'}, {tag:'CODE_TO_TOKEN'}, 
-                         {tag:'REFRESH_TOKEN'}, {tag:'LOGIN_ERROR'}, {tag:'REGISTER_ERROR'}, {tag:'LOGOUT_ERROR'},
-                         {tag:'CODE_TO_TOKEN_ERROR'}, {tag:'REFRESH_TOKEN_ERROR'}, {tag:'VALIDATE_ACCESS_TOKEN'}, {tag:'VALIDATE_ACCESS_TOKEN_ERROR'}, 
-                         {tag:'SOCIAL_LINK'}, {tag:'SOCIAL_LINK_ERROR'}, {tag:'REMOVE_FEDERATED_IDENTITY'}, {tag:'REMOVE_SOCIAL_LINK_ERROR'},
-                         {tag:'UPDATE_EMAIL'}, {tag:'UPDATE_PROFILE'}, {tag:'UPDATE_PASSWORD'}, {tag:'UPDATE_TOTP'},
-                         {tag:'UPLOAD_REALM'}, {tag:'IMPORT_REALM'}, {tag:'UPDATE_REALM'}, {tag:'DELETE_REALM'},
-                     	 {tag:'CREATE_USER'}, {tag:'UPDATE_USER'}, {tag:'DELETE_USER'}, {tag:'VIEW_USER_SESSIONS'},
-                     	 {tag:'CREATE_APPLICATION'}, {tag:'UPDATE_APPLICATION'}, {tag:'DELETE_APPLICATION'}, {tag:'VIEW_APPLICATION'},
-                     	 {tag:'CREATE_OAUTH_CLIENT'}, {tag:'UPDATE_OAUTH_CLIENT'}, {tag:'VIEW_OAUTH_CLIENT'}, {tag:'DELETE_OAUTH_CLIENT'},
-                     	 {tag:'CREATE_PROVIDER'}, {tag:'UPDATE_PROVIDER'}, {tag:'DELETE_PROVIDER'}, {tag:'VIEW_ROLE'},
-                     	 {tag:'CREATE_ROLE'}, {tag:'UPDATE_ROLE'}, {tag:'DELETE_ROLE'}, {tag:'VIEW_SERVER_INFO'}];
+    $scope.eventSelectOptions = {
+        'multiple': true,
+        'simple_tags': true,
+        'tags': serverInfo.eventTypes
+    };
 
     $scope.query = {
         id : realm.realm,
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events.html
index b743752..b6379c6 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events.html
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events.html
@@ -31,13 +31,11 @@
                     </div>
                     <form class="form-horizontal">
                         <div class="form-group" data-ng-show="filter">
-      			            <label class="col-sm-2 control-label" for="eventType">Event Type</label>
+      			    <label class="col-sm-2 control-label" for="eventTypes">Event Type</label>
                     	    <div class="col-sm-5">
-                                <select ui-select2 id="reqActions" ng-model="query.type" data-placeholder="Select event types..." multiple>
-                                    <option ng-repeat="event in eventTypes">{{event.tag}}</option>
-                                </select>
-			                </div>
-			            </div>
+                                <input ui-select2="eventSelectOptions" id="eventTypes" ng-model="query.type" data-placeholder="Select event types..."/>
+			    </div>
+			</div>
                         <div class="form-group" data-ng-show="filter">
                             <label class="col-sm-2 control-label" for="client">Client</label>
                             <div class="col-sm-4">
@@ -58,7 +56,7 @@
                             </div>
                         </div>
                         <div class="form-group" data-ng-show="filter">
-                            <label class="col-sm-2 control-label" for="toDate">Date (To)</label>
+                            <label class="col-sm-2 control-label" for="dateTo">Date (To)</label>
                             <div class="col-sm-4">
                                 <input class="form-control" type="date" id="dateTo" name="dateTo" data-ng-model="query.dateTo">
                             </div>
@@ -109,6 +107,16 @@
                                     </table>
                                 </td>
                             </tr>
+                            <tr data-ng-show="event.representation">
+                                <td>Representation</td>
+                                <td>
+                                    <button type="button" class="btn btn-default btn-xs" ng-click="collapseRep = !collapseRep">
+                                        <span class="glyphicon glyphicon-plus" data-ng-show="!collapseRep"></span>
+                                        <span class="glyphicon glyphicon-minus" data-ng-show="collapseRep"></span>
+                                    </button>
+                                    <pre data-ng-show="collapseRep">{{event.representation}}</pre>
+                                </td>
+                            </tr>
                         </table>
                     </td>
                 </tr>
diff --git a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events-config.html b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events-config.html
index 38d5864..3575e5b 100755
--- a/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events-config.html
+++ b/forms/common-themes/src/main/resources/theme/base/admin/resources/partials/realm-events-config.html
@@ -18,6 +18,17 @@
                     </div>
                     <span tooltip-placement="right" tooltip="If enabled events are saved to the database which makes events available to the admin and account management consoles." class="fa fa-info-circle"></span>
                 </div>
+
+                <div class="form-group" data-ng-show="eventsConfig.eventsEnabled">
+                    <label class="col-sm-2 control-label" for="enabledEventTypes" class="control-label">Saved Types</label>
+
+                    <div class="col-sm-5">
+                        <input ui-select2="eventSelectOptions" id="enabledEventTypes" ng-model="eventsConfig.enabledEventTypes" data-placeholder="Select event types..."/>
+                    </div>
+
+                    <span tooltip-placement="right" tooltip="Configure what event types are saved. By default events related to login and users modifying their accounts are persisted." class="fa fa-info-circle"></span>
+                </div>
+
                 <div class="form-group" data-ng-show="access.manageEvents && eventsConfig.eventsEnabled">
                     <label class="col-sm-2 control-label" for="password">Clear Events</label>
                     <div class="col-sm-5">
@@ -52,19 +63,6 @@
 
                     <span tooltip-placement="right" tooltip="Configure what listeners receive events for the realm." class="fa fa-info-circle"></span>
                 </div>
-                
-                <div class="form-group" data-ng-show="eventsConfig.eventsEnabled">
-                    <label class="col-sm-2 control-label" for="enabledEventTypes" class="control-label">Event Types</label>
-
-                    <div class="col-sm-5">
-                        <select ui-select2 ng-model="eventsConfig.enabledEventTypes" data-placeholder="Select an event type(s)..." multiple>
-                            <option ng-repeat="type in enabledEventTypes" value="{{type.tag}}">{{type.tag}}</option>
-                        </select>
-                    </div>
-
-                    <span tooltip-placement="right" tooltip="Configure what event types persist for the realm." class="fa fa-info-circle"></span>
-                </div>
-                
             </fieldset>
 
             <div class="pull-right form-actions" data-ng-show="access.manageEvents">
diff --git a/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java b/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java
index 975bf29..448871b 100755
--- a/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java
+++ b/model/file/src/main/java/org/keycloak/models/file/adapter/RealmAdapter.java
@@ -46,7 +46,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-
 import org.keycloak.connections.file.InMemoryModel;
 import org.keycloak.models.ModelDuplicateException;
 import org.keycloak.models.UserModel;
diff --git a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
index 9a01119..9f6245a 100755
--- a/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
+++ b/model/jpa/src/main/java/org/keycloak/models/jpa/RealmAdapter.java
@@ -23,7 +23,6 @@ import org.keycloak.models.utils.KeycloakModelUtils;
 
 import javax.persistence.EntityManager;
 import javax.persistence.TypedQuery;
-
 import java.security.Key;
 import java.security.PrivateKey;
 import java.security.PublicKey;
diff --git a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java
index 12f9e77..cff2ae5 100755
--- a/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java
+++ b/model/mongo/src/main/java/org/keycloak/models/mongo/keycloak/adapters/RealmAdapter.java
@@ -2,7 +2,6 @@ package org.keycloak.models.mongo.keycloak.adapters;
 
 import com.mongodb.DBObject;
 import com.mongodb.QueryBuilder;
-
 import org.keycloak.connections.mongo.api.context.MongoStoreInvocationContext;
 import org.keycloak.enums.SslRequired;
 import org.keycloak.models.ApplicationModel;
diff --git a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/AuthorizationEndpoint.java b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/AuthorizationEndpoint.java
index 9cb6c0e..66197b7 100755
--- a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/AuthorizationEndpoint.java
+++ b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/AuthorizationEndpoint.java
@@ -9,7 +9,6 @@ import org.keycloak.constants.AdapterConstants;
 import org.keycloak.events.Details;
 import org.keycloak.events.Errors;
 import org.keycloak.events.EventBuilder;
-import org.keycloak.events.EventGroup;
 import org.keycloak.events.EventType;
 import org.keycloak.login.LoginFormsProvider;
 import org.keycloak.models.ApplicationModel;
@@ -36,7 +35,6 @@ import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
-
 import java.util.List;
 
 /**
@@ -90,7 +88,7 @@ public class AuthorizationEndpoint {
         this.authManager = authManager;
         this.realm = realm;
         this.event = event;
-        event.eventGroup(EventGroup.USER).event(EventType.LOGIN);
+        event.event(EventType.LOGIN);
     }
 
     @GET
diff --git a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/LogoutEndpoint.java b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/LogoutEndpoint.java
index eb27a27..a61c811 100755
--- a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/LogoutEndpoint.java
+++ b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/LogoutEndpoint.java
@@ -9,7 +9,6 @@ import org.keycloak.OAuthErrorException;
 import org.keycloak.events.Details;
 import org.keycloak.events.Errors;
 import org.keycloak.events.EventBuilder;
-import org.keycloak.events.EventGroup;
 import org.keycloak.events.EventType;
 import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.ClientModel;
@@ -71,7 +70,7 @@ public class LogoutEndpoint {
         this.tokenManager = tokenManager;
         this.authManager = authManager;
         this.realm = realm;
-        this.event = event.eventGroup(EventGroup.USER);
+        this.event = event;
     }
 
     /**
diff --git a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/TokenEndpoint.java b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/TokenEndpoint.java
index cbeca60..bd211e4 100755
--- a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/TokenEndpoint.java
+++ b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/TokenEndpoint.java
@@ -9,7 +9,6 @@ import org.keycloak.constants.AdapterConstants;
 import org.keycloak.events.Details;
 import org.keycloak.events.Errors;
 import org.keycloak.events.EventBuilder;
-import org.keycloak.events.EventGroup;
 import org.keycloak.events.EventType;
 import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.ClientModel;
@@ -41,7 +40,6 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
-
 import java.util.Map;
 
 /**
@@ -87,7 +85,7 @@ public class TokenEndpoint {
         this.tokenManager = tokenManager;
         this.authManager = authManager;
         this.realm = realm;
-        this.event = event.eventGroup(EventGroup.USER);
+        this.event = event;
     }
 
     @POST
diff --git a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/UserInfoEndpoint.java b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/UserInfoEndpoint.java
index bdb807b..c600df7 100755
--- a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/UserInfoEndpoint.java
+++ b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/UserInfoEndpoint.java
@@ -20,7 +20,6 @@ package org.keycloak.protocol.oidc.endpoints;
 import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.spi.HttpRequest;
 import org.jboss.resteasy.spi.HttpResponse;
-import org.jboss.resteasy.spi.UnauthorizedException;
 import org.keycloak.ClientConnection;
 import org.keycloak.OAuthErrorException;
 import org.keycloak.RSATokenVerifier;
@@ -37,8 +36,6 @@ import org.keycloak.protocol.oidc.TokenManager;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.services.ErrorResponseException;
 import org.keycloak.services.managers.AppAuthManager;
-import org.keycloak.services.managers.AuthenticationManager;
-import org.keycloak.services.managers.EventsManager;
 import org.keycloak.services.resources.Cors;
 import org.keycloak.services.resources.flows.Urls;
 
@@ -55,7 +52,6 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.UriInfo;
-
 import java.util.HashMap;
 import java.util.Map;
 
@@ -115,8 +111,7 @@ public class UserInfoEndpoint {
     }
 
     private Response issueUserInfo(String tokenString) {
-        EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder()
-                .eventGroup(EventGroup.USER)
+        EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection)
                 .event(EventType.USER_INFO_REQUEST)
                 .detail(Details.AUTH_METHOD, Details.VALIDATE_ACCESS_TOKEN);
 
diff --git a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/ValidateTokenEndpoint.java b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/ValidateTokenEndpoint.java
index a3258a6..31499d1 100644
--- a/services/src/main/java/org/keycloak/protocol/oidc/endpoints/ValidateTokenEndpoint.java
+++ b/services/src/main/java/org/keycloak/protocol/oidc/endpoints/ValidateTokenEndpoint.java
@@ -9,7 +9,6 @@ import org.keycloak.RSATokenVerifier;
 import org.keycloak.events.Details;
 import org.keycloak.events.Errors;
 import org.keycloak.events.EventBuilder;
-import org.keycloak.events.EventGroup;
 import org.keycloak.events.EventType;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
@@ -23,7 +22,6 @@ import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.*;
-
 import java.util.HashMap;
 import java.util.Map;
 
@@ -53,7 +51,7 @@ public class ValidateTokenEndpoint {
     public ValidateTokenEndpoint(TokenManager tokenManager, RealmModel realm, EventBuilder event) {
         this.tokenManager = tokenManager;
         this.realm = realm;
-        this.event = event.eventGroup(EventGroup.USER);
+        this.event = event;
     }
 
     /**
diff --git a/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocol.java b/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocol.java
index 3b528e2..5815037 100755
--- a/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocol.java
+++ b/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocol.java
@@ -26,7 +26,6 @@ import org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor;
 import org.keycloak.OAuth2Constants;
 import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
-import org.keycloak.events.EventGroup;
 import org.keycloak.events.EventType;
 import org.keycloak.models.ApplicationModel;
 import org.keycloak.models.ClientSessionModel;
@@ -186,7 +185,7 @@ public class OIDCLoginProtocol implements LoginProtocol {
     public Response finishLogout(UserSessionModel userSession) {
         String redirectUri = userSession.getNote(OIDCLoginProtocol.LOGOUT_REDIRECT_URI);
         String state = userSession.getNote(OIDCLoginProtocol.LOGOUT_STATE_PARAM);
-        event.eventGroup(EventGroup.USER).event(EventType.LOGOUT);
+        event.event(EventType.LOGOUT);
         if (redirectUri != null) {
             event.detail(Details.REDIRECT_URI, redirectUri);
         }
diff --git a/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocolService.java b/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocolService.java
index 431d05e..6c327b1 100755
--- a/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocolService.java
+++ b/services/src/main/java/org/keycloak/protocol/oidc/OIDCLoginProtocolService.java
@@ -4,7 +4,6 @@ import org.jboss.logging.Logger;
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
 import org.keycloak.OAuth2Constants;
 import org.keycloak.events.EventBuilder;
-import org.keycloak.events.EventGroup;
 import org.keycloak.jose.jwk.JWK;
 import org.keycloak.jose.jwk.JWKBuilder;
 import org.keycloak.login.LoginFormsProvider;
@@ -59,7 +58,7 @@ public class OIDCLoginProtocolService {
     public OIDCLoginProtocolService(RealmModel realm, EventBuilder event, AuthenticationManager authManager) {
         this.realm = realm;
         this.tokenManager = new TokenManager();
-        this.event = event.eventGroup(EventGroup.USER);
+        this.event = event;
         this.authManager = authManager;
     }
 
diff --git a/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java b/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java
index 53012e8..023dd3d 100755
--- a/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java
+++ b/services/src/main/java/org/keycloak/services/managers/AuthenticationManager.java
@@ -44,7 +44,6 @@ import javax.ws.rs.core.MultivaluedMap;
 import javax.ws.rs.core.NewCookie;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
-
 import java.net.URI;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -183,7 +182,7 @@ public class AuthenticationManager {
         expireRememberMeCookie(realm, uriInfo, connection);
         userSession.setState(UserSessionModel.State.LOGGED_OUT);
         String method = userSession.getNote(KEYCLOAK_LOGOUT_PROTOCOL);
-        EventBuilder event = new EventsManager(realm, session, connection).createEventBuilder();
+        EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, connection);
         LoginProtocol protocol = session.getProvider(LoginProtocol.class, method);
         protocol.setRealm(realm)
                 .setHttpHeaders(headers)
@@ -376,7 +375,7 @@ public class AuthenticationManager {
         logger.debugv("processAccessCode: go to oauth page?: {0}",
                 !isResource);
 
-        event.eventGroup(EventGroup.USER).detail(Details.CODE_ID, clientSession.getId());
+        event.detail(Details.CODE_ID, clientSession.getId());
 
         Set<UserModel.RequiredAction> requiredActions = user.getRequiredActions();
         if (!requiredActions.isEmpty()) {
diff --git a/services/src/main/java/org/keycloak/services/resources/AccountService.java b/services/src/main/java/org/keycloak/services/resources/AccountService.java
index f8cc72a..6a0e0b5 100755
--- a/services/src/main/java/org/keycloak/services/resources/AccountService.java
+++ b/services/src/main/java/org/keycloak/services/resources/AccountService.java
@@ -25,13 +25,11 @@ import org.jboss.logging.Logger;
 import org.jboss.resteasy.spi.BadRequestException;
 import org.jboss.resteasy.spi.HttpRequest;
 import org.keycloak.ClientConnection;
-import org.keycloak.OAuth2Constants;
 import org.keycloak.account.AccountPages;
 import org.keycloak.account.AccountProvider;
 import org.keycloak.events.Details;
 import org.keycloak.events.Event;
 import org.keycloak.events.EventBuilder;
-import org.keycloak.events.EventGroup;
 import org.keycloak.events.EventStoreProvider;
 import org.keycloak.events.EventType;
 import org.keycloak.models.*;
@@ -47,7 +45,6 @@ import org.keycloak.services.managers.AppAuthManager;
 import org.keycloak.services.managers.Auth;
 import org.keycloak.services.managers.AuthenticationManager;
 import org.keycloak.services.managers.ClientSessionCode;
-import org.keycloak.services.managers.ResourceAdminManager;
 import org.keycloak.services.messages.Messages;
 import org.keycloak.services.resources.flows.Flows;
 import org.keycloak.services.resources.flows.OAuthRedirect;
@@ -72,7 +69,6 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.core.Variant;
-
 import java.lang.reflect.Method;
 import java.net.URI;
 import java.util.HashSet;
@@ -100,7 +96,7 @@ public class AccountService {
     }
 
     private static final EventType[] LOG_EVENTS = {EventType.LOGIN, EventType.LOGOUT, EventType.REGISTER, EventType.REMOVE_FEDERATED_IDENTITY, EventType.REMOVE_TOTP, EventType.SEND_RESET_PASSWORD,
-            EventType.SEND_VERIFY_EMAIL, EventType.SOCIAL_LINK, EventType.UPDATE_EMAIL, EventType.UPDATE_PASSWORD, EventType.UPDATE_PROFILE, EventType.UPDATE_TOTP, EventType.VERIFY_EMAIL};
+            EventType.SEND_VERIFY_EMAIL, EventType.FEDERATED_IDENTITY_LINK, EventType.UPDATE_EMAIL, EventType.UPDATE_PASSWORD, EventType.UPDATE_PROFILE, EventType.UPDATE_TOTP, EventType.VERIFY_EMAIL};
 
     private static final Set<String> LOG_DETAILS = new HashSet<String>();
     static {
@@ -143,7 +139,7 @@ public class AccountService {
     public AccountService(RealmModel realm, ApplicationModel application, EventBuilder event) {
         this.realm = realm;
         this.application = application;
-        this.event = event.eventGroup(EventGroup.USER);
+        this.event = event;
         this.authManager = new AppAuthManager();
     }
 
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java b/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java
index 19c876f..8ed297a 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/AdminConsole.java
@@ -6,11 +6,8 @@ import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.spi.HttpRequest;
 import org.jboss.resteasy.spi.HttpResponse;
 import org.jboss.resteasy.spi.NotFoundException;
-import org.keycloak.ClientConnection;
-import org.keycloak.Version;
-import org.keycloak.events.Details;
-import org.keycloak.events.EventBuilder;
-import org.keycloak.events.EventType;
+import org.keycloak.ClientConnection;
+import org.keycloak.Version;
 import org.keycloak.freemarker.BrowserSecurityHeaderSetup;
 import org.keycloak.freemarker.FreeMarkerException;
 import org.keycloak.freemarker.FreeMarkerUtil;
@@ -40,7 +37,6 @@ import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.ext.Providers;
-
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
@@ -72,11 +68,6 @@ public class AdminConsole {
     @Context
     protected KeycloakSession session;
 
-    /*
-    @Context
-    protected ResourceContext resourceContext;
-    */
-
     @Context
     protected Providers providers;
 
@@ -85,11 +76,9 @@ public class AdminConsole {
 
     protected AppAuthManager authManager;
     protected RealmModel realm;
-    private EventBuilder event;
 
-    public AdminConsole(RealmModel realm, EventBuilder event) {
+    public AdminConsole(RealmModel realm) {
         this.realm = realm;
-        this.event = event.detail(Details.REALM_NAME, realm.getName());
         this.authManager = new AppAuthManager();
     }
 
@@ -169,12 +158,6 @@ public class AdminConsole {
         if (consoleApp == null) {
             throw new NotFoundException("Could not find admin console application");
         }
-        
-        event.event(EventType.SET_REALM_ADAPTER_CONFIGURATION)
-            .client(consoleApp)
-            .detail(Details.REALM_REQUIRED_SSL, realm.getSslRequired().name().toLowerCase())
-            .success();
-        
         return new ApplicationManager().toInstallationRepresentation(realm, consoleApp, keycloak.getBaseUri(uriInfo));
 
     }
@@ -219,8 +202,6 @@ public class AdminConsole {
             logger.debug("setting up realm access for a realm user");
             addRealmAccess(realm, user, realmAccess);
         }
-        
-        event.event(EventType.SET_REALM_USER_PERMISSIONS).user(user).success();
 
         return Response.ok(new WhoAmI(user.getId(), realm.getName(), displayName, createRealm, realmAccess)).build();
     }
@@ -264,14 +245,12 @@ public class AdminConsole {
     @NoCache
     public Response logout() {
         URI redirect = AdminRoot.adminConsoleUrl(uriInfo).build(realm.getName());
-        
-        event.event(EventType.LOGOUT).detail(Details.REDIRECT_URI, redirect.toString()).success();
-                
+
         return Response.status(302).location(
                 OIDCLoginProtocolService.logoutUrl(uriInfo).queryParam("redirect_uri", redirect.toString()).build(realm.getName())
         ).build();
     }
-    
+
     protected RealmModel getAdminstrationRealm(RealmManager realmManager) {
         return realmManager.getKeycloakAdminstrationRealm();
     }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java b/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java
index f50bcd5..01ad41f 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/AdminRoot.java
@@ -8,7 +8,6 @@ import org.jboss.resteasy.spi.NotFoundException;
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
 import org.jboss.resteasy.spi.UnauthorizedException;
 import org.keycloak.ClientConnection;
-import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventGroup;
 import org.keycloak.jose.jws.JWSInput;
@@ -19,7 +18,6 @@ import org.keycloak.protocol.oidc.TokenManager;
 import org.keycloak.representations.AccessToken;
 import org.keycloak.services.managers.AppAuthManager;
 import org.keycloak.services.managers.AuthenticationManager;
-import org.keycloak.services.managers.EventsManager;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.services.resources.Cors;
 
@@ -126,9 +124,7 @@ public class AdminRoot {
     public AdminConsole getAdminConsole(final @PathParam("realm") String name) {
         RealmManager realmManager = new RealmManager(session);
         RealmModel realm = locateRealm(name, realmManager);
-        EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder();
-        event.eventGroup(EventGroup.ADMIN).detail(Details.REALM_NAME, realm.getName());
-        AdminConsole service = new AdminConsole(realm, event);
+        AdminConsole service = new AdminConsole(realm);
         ResteasyProviderFactory.getInstance().injectProperties(service);
         return service;
     }
@@ -191,11 +187,11 @@ public class AdminRoot {
 
         Cors.add(request).allowedOrigins(auth.getToken()).allowedMethods("GET", "PUT", "POST", "DELETE").auth().build(response);
 
-        EventBuilder event = new EventsManager(auth.getRealm(), session, clientConnection).createEventBuilder();
-        event.eventGroup(EventGroup.ADMIN);
+        EventBuilder event = new EventBuilder(EventGroup.ADMIN, auth.getRealm(), session, clientConnection);
+        event.user(auth.getUser()).client(auth.getClient());
+
         RealmsAdminResource adminResource = new RealmsAdminResource(auth, tokenManager, event);
         ResteasyProviderFactory.getInstance().injectProperties(adminResource);
-        //resourceContext.initResource(adminResource);
         return adminResource;
     }
 
@@ -214,12 +210,9 @@ public class AdminRoot {
             logger.debug("authenticated admin access for: " + auth.getUser().getUsername());
         }
         Cors.add(request).allowedOrigins(auth.getToken()).allowedMethods("GET", "PUT", "POST", "DELETE").auth().build(response);
-        
-        EventBuilder event = new EventsManager(auth.getRealm(), session, clientConnection).createEventBuilder();
-        event.eventGroup(EventGroup.ADMIN);
-        ServerInfoAdminResource adminResource = new ServerInfoAdminResource(event);
+
+        ServerInfoAdminResource adminResource = new ServerInfoAdminResource();
         ResteasyProviderFactory.getInstance().injectProperties(adminResource);
-        //resourceContext.initResource(adminResource);
         return adminResource;
     }
 
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java
index 9ec26ee..0c8e21f 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/ApplicationResource.java
@@ -81,7 +81,7 @@ public class ApplicationResource {
         this.application = applicationModel;
         this.session = session;
         this.event = event;
-        
+
         auth.init(RealmAuth.Resource.APPLICATION);
     }
 
@@ -106,7 +106,7 @@ public class ApplicationResource {
         try {
             RepresentationToModel.updateApplication(rep, application);
             
-            event.event(EventType.UPDATE_APPLICATION).client(application).success();
+            event.event(EventType.UPDATE_APPLICATION).representation(rep).success();
                     
             return Response.noContent().build();
         } catch (ModelDuplicateException e) {
@@ -125,10 +125,12 @@ public class ApplicationResource {
     @Produces(MediaType.APPLICATION_JSON)
     public ApplicationRepresentation getApplication() {
         auth.requireView();
-        
-        event.event(EventType.VIEW_APPLICATION).client(application).success();
 
-        return ModelToRepresentation.toRepresentation(application);
+        ApplicationRepresentation rep = ModelToRepresentation.toRepresentation(application);
+
+        event.event(EventType.VIEW_APPLICATION).representation(rep).success();
+
+        return rep;
     }
 
     /**
@@ -187,8 +189,9 @@ public class ApplicationResource {
     @NoCache
     public void deleteApplication() {
         auth.requireManage();
-        
-        event.event(EventType.DELETE_APPLICATION).client(application).success();
+
+        ApplicationRepresentation rep = getApplication();
+        event.event(EventType.DELETE_APPLICATION).representation(rep).success();
 
         new ApplicationManager(new RealmManager(session)).removeApplication(realm, application);
     }
@@ -346,7 +349,7 @@ public class ApplicationResource {
             sessions.add(rep);
         }
         
-        event.event(EventType.VIEW_APPLICATION_USER_SESSIONS).client(application).success();
+        event.event(EventType.VIEW_APPLICATION_USER_SESSIONS).representation(sessions).success();
         
         return sessions;
     }
@@ -360,7 +363,7 @@ public class ApplicationResource {
     public GlobalRequestResult logoutAll() {
         auth.requireManage();
         
-        event.event(EventType.INVALIDATE_APPLICATION_USER_SESSIONS).client(application).success();
+        event.event(EventType.LOGOUT_APPLICATION_USERS).success();
         
         return new ResourceAdminManager().logoutApplication(uriInfo.getRequestUri(), realm, application);
     }
@@ -378,7 +381,7 @@ public class ApplicationResource {
             throw new NotFoundException("User not found");
         }
         
-        event.event(EventType.INVALIDATE_APPLICATION_USER_SESSION).client(application).user(user).success();
+        event.event(EventType.LOGOUT_USER).success();
 
         new ResourceAdminManager().logoutUserFromApplication(uriInfo.getRequestUri(), realm, application, user, session);
     }
@@ -401,7 +404,7 @@ public class ApplicationResource {
         if (logger.isDebugEnabled()) logger.debug("Register node: " + node);
         application.registerNode(node, Time.currentTime());
         
-        event.event(EventType.REGISTER_APPLICATION_CLUSTER_NODE).client(application)
+        event.event(EventType.REGISTER_APPLICATION_CLUSTER_NODE)
             .detail(Details.APPLICATION_CLUSTER_NODE, node)
             .success();
     }
@@ -425,7 +428,7 @@ public class ApplicationResource {
 
         application.unregisterNode(node);
         
-        event.event(EventType.UNREGISTER_APPLICATION_CLUSTER_NODE).client(application)
+        event.event(EventType.UNREGISTER_APPLICATION_CLUSTER_NODE)
             .detail(Details.APPLICATION_CLUSTER_NODE, node)
             .success();
     }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ApplicationsResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ApplicationsResource.java
index f907a04..6bc6c2b 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/ApplicationsResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/ApplicationsResource.java
@@ -4,7 +4,6 @@ import org.jboss.logging.Logger;
 import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.spi.NotFoundException;
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
-import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventType;
 import org.keycloak.models.ApplicationModel;
@@ -78,7 +77,7 @@ public class ApplicationsResource {
             }
         }
         
-        event.event(EventType.VIEW_REALM_APPLICATIONS).success();
+        event.event(EventType.VIEW_APPLICATIONS).representation(rep).success();
         
         return rep;
     }
@@ -94,16 +93,16 @@ public class ApplicationsResource {
     @Consumes(MediaType.APPLICATION_JSON)
     public Response createApplication(final @Context UriInfo uriInfo, final ApplicationRepresentation rep) {
         auth.requireManage();
-        
+
         try {
             ApplicationModel applicationModel = RepresentationToModel.createApplication(session, realm, rep, true);
-            
-            event.event(EventType.CREATE_APPLICATION).client(applicationModel).success();
+
+            event.event(EventType.CREATE_APPLICATION).representation(rep).success();
+
             return Response.created(uriInfo.getAbsolutePathBuilder().path(getApplicationPath(applicationModel)).build()).build();
         } catch (ModelDuplicateException e) {
             return Flows.errors().exists("Application " + rep.getName() + " already exists");
         }
-        
     }
 
     protected String getApplicationPath(ApplicationModel applicationModel) {
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ClientAttributeCertificateResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ClientAttributeCertificateResource.java
index 670f671..e2f01e5 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/ClientAttributeCertificateResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/ClientAttributeCertificateResource.java
@@ -6,7 +6,6 @@ import org.jboss.resteasy.plugins.providers.multipart.MultipartFormDataInput;
 import org.jboss.resteasy.spi.BadRequestException;
 import org.jboss.resteasy.spi.NotAcceptableException;
 import org.jboss.resteasy.spi.NotFoundException;
-import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventType;
 import org.keycloak.models.ClientModel;
@@ -101,7 +100,7 @@ public class ClientAttributeCertificateResource {
         info.setCertificate(client.getAttribute(certificateAttribute));
         info.setPrivateKey(client.getAttribute(privateAttribute));
         
-        event.event(EventType.VIEW_CLIENT_CERTIFICATE).client(client).success();
+        event.event(EventType.VIEW_CLIENT_CERTIFICATE).representation(info).success();
 
         return info;
     }
@@ -142,7 +141,7 @@ public class ClientAttributeCertificateResource {
         info.setCertificate(client.getAttribute(certificateAttribute));
         info.setPrivateKey(client.getAttribute(privateAttribute));
         
-        event.event(EventType.GENERATE_CLIENT_CERTIFICATE).client(client).success();
+        event.event(EventType.UPDATE_CLIENT_CERTIFICATE).representation(info).success();
                 
         return info;
     }
@@ -200,9 +199,9 @@ public class ClientAttributeCertificateResource {
             client.setAttribute(certificateAttribute, certPem);
             info.setCertificate(certPem);
         }
-        
-        event.event(EventType.UPLOAD_CLIENT_CERTIFICATE).client(client).success();
-                
+
+        event.event(EventType.UPDATE_CLIENT_CERTIFICATE).representation(info).success();
+
         return info;
     }
 
@@ -329,7 +328,7 @@ public class ClientAttributeCertificateResource {
             stream.close();
             byte[] rtn = stream.toByteArray();
             
-            event.event(EventType.DOWNLOAD_CLIENT_CERTIFICATE).client(client).success();
+            event.event(EventType.VIEW_CLIENT_CERTIFICATE).representation(rtn).success();
             
             return rtn;
         } catch (Exception e) {
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/IdentityProviderResource.java b/services/src/main/java/org/keycloak/services/resources/admin/IdentityProviderResource.java
index de931b5..8572612 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/IdentityProviderResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/IdentityProviderResource.java
@@ -4,7 +4,6 @@ import org.jboss.logging.Logger;
 import org.jboss.resteasy.annotations.cache.NoCache;
 import org.keycloak.broker.provider.IdentityProvider;
 import org.keycloak.broker.provider.IdentityProviderFactory;
-import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventType;
 import org.keycloak.models.ClientIdentityProviderMappingModel;
@@ -61,29 +60,31 @@ public class IdentityProviderResource {
     @NoCache
     @Produces("application/json")
     public IdentityProviderRepresentation getIdentityProvider() {
-        
+        IdentityProviderRepresentation rep = ModelToRepresentation.toRepresentation(this.identityProviderModel);
+
         event.event(EventType.VIEW_IDENTITY_PROVIDER)
-            .detail(Details.IDENTITY_PROVIDER, identityProviderModel.getProviderId())
-            .detail(Details.IDENTITY_PROVIDER_ALIAS, identityProviderModel.getAlias())
+            .representation(rep)
             .success();
-        
-        return ModelToRepresentation.toRepresentation(this.identityProviderModel);
+
+        return rep;
     }
 
     @DELETE
     @NoCache
     public Response delete() {
         this.auth.requireManage();
+
+        IdentityProviderRepresentation rep = getIdentityProvider();
+
         removeClientIdentityProviders(this.realm.getApplications(), this.identityProviderModel);
         removeClientIdentityProviders(this.realm.getOAuthClients(), this.identityProviderModel);
-
-        this.realm.removeIdentityProviderByAlias(this.identityProviderModel.getAlias());
+
+        this.realm.removeIdentityProviderByAlias(this.identityProviderModel.getAlias());
         
         event.event(EventType.DELETE_IDENTITY_PROVIDER)
-            .detail(Details.IDENTITY_PROVIDER, identityProviderModel.getProviderId())
-            .detail(Details.IDENTITY_PROVIDER_ALIAS, identityProviderModel.getAlias())
+            .representation(rep)
             .success();
-
+
         return Response.noContent().build();
     }
 
@@ -110,8 +111,7 @@ public class IdentityProviderResource {
             }
             
             event.event(EventType.UPDATE_IDENTITY_PROVIDER)
-                .detail(Details.IDENTITY_PROVIDER, identityProviderModel.getProviderId())
-                .detail(Details.IDENTITY_PROVIDER_ALIAS, identityProviderModel.getAlias())
+                .representation(providerRep)
                 .success();
 
             return Response.noContent().build();
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/IdentityProvidersResource.java b/services/src/main/java/org/keycloak/services/resources/admin/IdentityProvidersResource.java
index 19ec301..95dd7d4 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/IdentityProvidersResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/IdentityProvidersResource.java
@@ -8,7 +8,6 @@ import org.jboss.resteasy.spi.NotFoundException;
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
 import org.keycloak.broker.provider.IdentityProvider;
 import org.keycloak.broker.provider.IdentityProviderFactory;
-import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventType;
 import org.keycloak.models.IdentityProviderModel;
@@ -70,8 +69,7 @@ public class IdentityProvidersResource {
 
         if (providerFactory != null) {
             event.event(EventType.VIEW_IDENTITY_PROVIDERS)
-                .detail(Details.IDENTITY_PROVIDER_FACTORY, providerFactory.getId())
-                .detail(Details.IDENTITY_PROVIDER_FACTORY_IDENTITY, providerFactory.getName())
+                .representation(providerFactory)
                 .success();
             
             return Response.ok(providerFactory).build();
@@ -93,9 +91,8 @@ public class IdentityProvidersResource {
         IdentityProviderFactory providerFactory = getProviderFactorytById(providerId);
         Map<String, String> config = providerFactory.parseConfig(inputStream);
         
-        event.event(EventType.IMPORT_IDENTITY_PROVIDER_CONFIG)
-            .detail(Details.IDENTITY_PROVIDER_FACTORY, providerFactory.getId())
-            .detail(Details.IDENTITY_PROVIDER_FACTORY_IDENTITY, providerFactory.getName())
+        event.event(EventType.CREATE_IDENTITY_PROVIDER)
+            .representation(config)
             .success();
         
         return config;
@@ -120,9 +117,8 @@ public class IdentityProvidersResource {
         IdentityProviderFactory providerFactory = getProviderFactorytById(providerId);
         Map<String, String> config = providerFactory.parseConfig(inputStream);
         
-        event.event(EventType.IMPORT_IDENTITY_PROVIDER_CONFIG)
-            .detail(Details.IDENTITY_PROVIDER_FACTORY, providerFactory.getId())
-            .detail(Details.IDENTITY_PROVIDER_FACTORY_IDENTITY, providerFactory.getName())
+        event.event(EventType.CREATE_IDENTITY_PROVIDER)
+            .representation(config)
             .success();
         
         return config;
@@ -141,7 +137,7 @@ public class IdentityProvidersResource {
             representations.add(ModelToRepresentation.toRepresentation(identityProviderModel));
         }
         
-        event.event(EventType.VIEW_IDENTITY_PROVIDERS).success();
+        event.event(EventType.VIEW_IDENTITY_PROVIDERS).representation(representations).success();
 
         return representations;
     }
@@ -156,8 +152,7 @@ public class IdentityProvidersResource {
             this.realm.addIdentityProvider(RepresentationToModel.toModel(representation));
             
             event.event(EventType.CREATE_IDENTITY_PROVIDER)
-                .detail(Details.IDENTITY_PROVIDER, representation.getProviderId())
-                .detail(Details.IDENTITY_PROVIDER_ALIAS, representation.getAlias())
+                .representation(representation)
                 .success();
             
             return Response.created(uriInfo.getAbsolutePathBuilder().path(representation.getProviderId()).build()).build();
@@ -181,13 +176,12 @@ public class IdentityProvidersResource {
         if (identityProviderModel == null) {
             throw new NotFoundException("Could not find identity provider: " + alias);
         }
-        
+
         IdentityProviderResource identityProviderResource = new IdentityProviderResource(this.auth, realm, session, identityProviderModel, event);
         ResteasyProviderFactory.getInstance().injectProperties(identityProviderResource);
         
         event.event(EventType.VIEW_IDENTITY_PROVIDER)
-            .detail(Details.IDENTITY_PROVIDER, identityProviderModel.getProviderId())
-            .detail(Details.IDENTITY_PROVIDER_ALIAS, identityProviderModel.getAlias())
+            .representation(identityProviderResource)
             .success();
 
         return identityProviderResource;
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientResource.java b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientResource.java
index ea9a69a..cc455c4 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientResource.java
@@ -4,7 +4,6 @@ import org.jboss.logging.Logger;
 import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.spi.NotFoundException;
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
-import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventType;
 import org.keycloak.models.KeycloakSession;
@@ -108,7 +107,7 @@ public class OAuthClientResource  {
 
         try {
             RepresentationToModel.updateOAuthClient(session, rep, oauthClient);
-            event.event(EventType.UPDATE_OAUTH_CLIENT).client(oauthClient).success();
+            event.event(EventType.UPDATE_OAUTH_CLIENT).representation(rep).success();
             
             return Response.noContent().build();
         } catch (ModelDuplicateException e) {
@@ -126,10 +125,12 @@ public class OAuthClientResource  {
     @Produces(MediaType.APPLICATION_JSON)
     public OAuthClientRepresentation getOAuthClient() {
         auth.requireView();
-        
-        event.event(EventType.VIEW_OAUTH_CLIENT).client(oauthClient).success();
-        
-        return ModelToRepresentation.toRepresentation(oauthClient);
+
+        OAuthClientRepresentation rep = ModelToRepresentation.toRepresentation(oauthClient);
+
+        event.event(EventType.VIEW_OAUTH_CLIENT).representation(rep).success();
+
+        return rep;
     }
 
     /**
@@ -160,8 +161,10 @@ public class OAuthClientResource  {
     @NoCache
     public void deleteOAuthClient() {
         auth.requireManage();
-        
-        event.event(EventType.DELETE_OAUTH_CLIENT).client(oauthClient).success();
+
+        OAuthClientRepresentation rep = getOAuthClient();
+
+        event.event(EventType.DELETE_OAUTH_CLIENT).representation(rep).success();
         
         new OAuthClientManager(new RealmManager(session)).removeClient(realm, oauthClient);
     }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java
index f76e002..4cd0ad1 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/OAuthClientsResource.java
@@ -4,7 +4,6 @@ import org.jboss.logging.Logger;
 import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.spi.NotFoundException;
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
-import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventType;
 import org.keycloak.models.KeycloakSession;
@@ -52,7 +51,7 @@ public class OAuthClientsResource {
         this.realm = realm;
         this.session = session;
         this.event = event;
-        
+
         auth.init(RealmAuth.Resource.CLIENT);
     }
 
@@ -79,7 +78,7 @@ public class OAuthClientsResource {
             }
         }
         
-        event.event(EventType.VIEW_OAUTH_CLIENTS).success();
+        event.event(EventType.VIEW_OAUTH_CLIENTS).representation(rep).success();
         
         return rep;
     }
@@ -98,13 +97,12 @@ public class OAuthClientsResource {
 
         try {
             OAuthClientModel oauth = RepresentationToModel.createOAuthClient(session, rep, realm);
-            event.event(EventType.CREATE_OAUTH_CLIENT).client(oauth).success();
+            event.event(EventType.CREATE_OAUTH_CLIENT).representation(rep).success();
             
             return Response.created(uriInfo.getAbsolutePathBuilder().path(getClientPath(oauth)).build()).build();
         } catch (ModelDuplicateException e) {
             return Flows.errors().exists("Client " + rep.getName() + " already exists");
         }
-        
     }
 
     protected String getClientPath(OAuthClientModel oauth) {
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
index 75a5416..59b4d0b 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmAdminResource.java
@@ -77,13 +77,13 @@ public class RealmAdminResource {
 
     @Context
     protected HttpHeaders headers;
-
+
     public RealmAdminResource(RealmAuth auth, RealmModel realm, TokenManager tokenManager, EventBuilder event) {
         this.auth = auth;
         this.realm = realm;
         this.tokenManager = tokenManager;
         this.event = event;
-        
+
         auth.init(RealmAuth.Resource.REALM);
     }
 
@@ -181,7 +181,7 @@ public class RealmAdminResource {
                 rep.setUserCacheEnabled(cache.isEnabled());
             }
             
-            event.event(EventType.VIEW_REALM).success();
+            event.event(EventType.VIEW_REALM).representation(rep).success();
             
             return rep;
         } else {
@@ -189,9 +189,9 @@ public class RealmAdminResource {
 
             RealmRepresentation rep = new RealmRepresentation();
             rep.setRealm(realm.getName());
-            
-            event.event(EventType.VIEW_REALM).success();
-            
+
+            event.event(EventType.VIEW_REALM).representation(rep).success();
+
             return rep;
         }
     }
@@ -226,9 +226,9 @@ public class RealmAdminResource {
             for (final UserFederationProviderModel fedProvider : federationProviders) {
                 usersSyncManager.refreshPeriodicSyncForProvider(session.getKeycloakSessionFactory(), session.getProvider(TimerProvider.class), fedProvider, realm.getId());
             }
-            
-            event.event(EventType.UPDATE_REALM).success();
-            
+
+            event.event(EventType.UPDATE_REALM).representation(rep).success();
+
             return Response.noContent().build();
         } catch (ModelDuplicateException e) {
             return Flows.errors().exists("Realm " + rep.getRealm() + " already exists");
@@ -243,11 +243,13 @@ public class RealmAdminResource {
     public void deleteRealm() {
         auth.requireManage();
 
+        RealmRepresentation rep = getRealm();
+
         if (!new RealmManager(session).removeRealm(realm)) {
             throw new NotFoundException("Realm doesn't exist");
         }
         
-        event.event(EventType.DELETE_REALM).success();
+        event.event(EventType.DELETE_REALM).representation(rep).success();
     }
 
     /**
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java
index 947e732..5bf3120 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/RealmsAdminResource.java
@@ -8,7 +8,6 @@ import org.jboss.resteasy.spi.NotFoundException;
 import org.jboss.resteasy.spi.ResteasyProviderFactory;
 import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
-import org.keycloak.events.EventGroup;
 import org.keycloak.events.EventType;
 import org.keycloak.models.AdminRoles;
 import org.keycloak.models.ApplicationModel;
@@ -142,7 +141,9 @@ public class RealmsAdminResource {
             URI location = AdminRoot.realmsUrl(uriInfo).path(realm.getName()).build();
             logger.debugv("imported realm success, sending back: {0}", location.toString());
             
-            event.event(EventType.IMPORT_REALM).detail(Details.REALM_NAME, realm.getName()).success();
+            event.event(EventType.CREATE_REALM)
+                    .representation(rep)
+                    .success();
             
             return Response.created(location).build();
         } catch (ModelDuplicateException e) {
@@ -191,9 +192,9 @@ public class RealmsAdminResource {
                 return Response.created(location).build();
             }
             
-            event.event(EventType.UPLOAD_REALM).detail(Details.REALM_NAME, realm.getName()).success();
+            event.event(EventType.CREATE_REALM).representation(rep).success();
         }
-        
+
         return Response.noContent().build();
     }
 
@@ -235,8 +236,8 @@ public class RealmsAdminResource {
         } else {
             realmAuth = new RealmAuth(auth, realm.getApplicationByName(realmManager.getRealmAdminApplicationName(auth.getRealm())));
         }
-        
-        event.detail(Details.REALM_NAME, realm.getName());
+
+        event.detail(Details.REALM, realm.getName());
         RealmAdminResource adminResource = new RealmAdminResource(realmAuth, realm, tokenManager, event);
         ResteasyProviderFactory.getInstance().injectProperties(adminResource);
         //resourceContext.initResource(adminResource);
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RoleByIdResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RoleByIdResource.java
index 0775976..bab2f7e 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/RoleByIdResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/RoleByIdResource.java
@@ -3,7 +3,6 @@ package org.keycloak.services.resources.admin;
 import org.jboss.logging.Logger;
 import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.spi.NotFoundException;
-import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventType;
 import org.keycloak.models.ApplicationModel;
@@ -63,13 +62,14 @@ public class RoleByIdResource extends RoleResource {
     public RoleRepresentation getRole(final @PathParam("role-id") String id) {
         RoleModel roleModel = getRoleModel(id);
         auth.requireView();
-        
+
+        RoleRepresentation rep = getRole(roleModel);
+
         event.event(EventType.VIEW_ROLE)
-            .detail(Details.ROLE_ID, roleModel.getId())
-            .detail(Details.ROLE_NAME, roleModel.getName())
+            .representation(rep)
             .success();
         
-        return getRole(roleModel);
+        return rep;
     }
 
     protected RoleModel getRoleModel(String id) {
@@ -102,13 +102,13 @@ public class RoleByIdResource extends RoleResource {
     @DELETE
     @NoCache
     public void deleteRole(final @PathParam("role-id") String id) {
+        RoleRepresentation rep = getRole(id);
         RoleModel role = getRoleModel(id);
         auth.requireManage();
         deleteRole(role);
         
         event.event(EventType.DELETE_ROLE)
-            .detail(Details.ROLE_ID, role.getId())
-            .detail(Details.ROLE_NAME, role.getName())
+            .representation(rep)
             .success();
     }
 
@@ -127,8 +127,7 @@ public class RoleByIdResource extends RoleResource {
         updateRole(rep, role);
         
         event.event(EventType.UPDATE_ROLE)
-            .detail(Details.ROLE_ID, role.getId())
-            .detail(Details.ROLE_NAME, role.getName())
+            .representation(rep)
             .success();
     }
 
@@ -145,10 +144,11 @@ public class RoleByIdResource extends RoleResource {
         RoleModel role = getRoleModel(id);
         auth.requireManage();
         addComposites(roles, role);
-        
-        event.event(EventType.MAKE_ROLE_COMPOSITE)
-            .detail(Details.ROLE_ID, role.getId())
-            .detail(Details.ROLE_NAME, role.getName())
+
+        RoleRepresentation rep = getRole(id);
+
+        event.event(EventType.UPDATE_ROLE)
+            .representation(rep)
             .success();
     }
 
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/RoleContainerResource.java b/services/src/main/java/org/keycloak/services/resources/admin/RoleContainerResource.java
index f01841d..9293d5c 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/RoleContainerResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/RoleContainerResource.java
@@ -2,7 +2,6 @@ package org.keycloak.services.resources.admin;
 
 import org.jboss.resteasy.annotations.cache.NoCache;
 import org.jboss.resteasy.spi.NotFoundException;
-import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventType;
 import org.keycloak.models.ApplicationModel;
@@ -65,7 +64,7 @@ public class RoleContainerResource extends RoleResource {
             roles.add(ModelToRepresentation.toRepresentation(roleModel));
         }
         
-        event.event(EventType.VIEW_ROLES).success();
+        event.event(EventType.VIEW_ROLES).representation(roles).success();
         
         return roles;
     }
@@ -87,8 +86,7 @@ public class RoleContainerResource extends RoleResource {
             role.setDescription(rep.getDescription());
             
             event.event(EventType.CREATE_ROLE)
-                .detail(Details.ROLE_ID, role.getId())
-                .detail(Details.ROLE_NAME, role.getName())
+                .representation(rep)
                 .success();
             
             return Response.created(uriInfo.getAbsolutePathBuilder().path(role.getName()).build()).build();
@@ -114,13 +112,14 @@ public class RoleContainerResource extends RoleResource {
         if (roleModel == null) {
             throw new NotFoundException("Could not find role: " + roleName);
         }
-        
+
+        RoleRepresentation rep = getRole(roleModel);
+
         event.event(EventType.VIEW_ROLE)
-            .detail(Details.ROLE_ID, roleModel.getId())
-            .detail(Details.ROLE_NAME, roleModel.getName())
+            .representation(rep)
             .success();
-        
-        return getRole(roleModel);
+
+        return rep;
     }
 
     /**
@@ -134,6 +133,7 @@ public class RoleContainerResource extends RoleResource {
     public void deleteRole(final @PathParam("role-name") String roleName) {
         auth.requireManage();
 
+        RoleRepresentation rep = getRole(roleName);
         RoleModel role = roleContainer.getRole(roleName);
         if (role == null) {
             throw new NotFoundException("Could not find role: " + roleName);
@@ -141,8 +141,7 @@ public class RoleContainerResource extends RoleResource {
         deleteRole(role);
         
         event.event(EventType.DELETE_ROLE)
-            .detail(Details.ROLE_ID, role.getId())
-            .detail(Details.ROLE_NAME, role.getName())
+            .representation(rep)
             .success();
     }
 
@@ -167,8 +166,7 @@ public class RoleContainerResource extends RoleResource {
             updateRole(rep, role);
             
             event.event(EventType.UPDATE_ROLE)
-                .detail(Details.ROLE_ID, role.getId())
-                .detail(Details.ROLE_NAME, role.getName())
+                .representation(rep)
                 .success();
             
             return Response.noContent().build();
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java b/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java
index df75c51..ec72cc1 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/ServerInfoAdminResource.java
@@ -3,8 +3,6 @@ package org.keycloak.services.resources.admin;
 import org.keycloak.Version;
 import org.keycloak.broker.provider.IdentityProvider;
 import org.keycloak.broker.provider.IdentityProviderFactory;
-import org.keycloak.events.Details;
-import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventListenerProvider;
 import org.keycloak.events.EventType;
 import org.keycloak.exportimport.ApplicationImporter;
@@ -19,16 +17,13 @@ import org.keycloak.protocol.LoginProtocolFactory;
 import org.keycloak.protocol.ProtocolMapper;
 import org.keycloak.provider.ProviderFactory;
 import org.keycloak.provider.Spi;
-import org.keycloak.representations.idm.IdentityProviderRepresentation;
 import org.keycloak.representations.idm.ProtocolMapperRepresentation;
 import org.keycloak.representations.idm.ProtocolMapperTypeRepresentation;
 import org.keycloak.social.SocialIdentityProvider;
 
 import javax.ws.rs.GET;
 import javax.ws.rs.core.Context;
-
 import java.util.Collections;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.LinkedList;
@@ -44,13 +39,7 @@ public class ServerInfoAdminResource {
 
     @Context
     private KeycloakSession session;
-    
-    private EventBuilder event;
-    
-    public ServerInfoAdminResource(EventBuilder event) {
-        this.event = event;
-    }
-    
+
     /**
      * Returns a list of themes, social providers, auth providers, and event listeners available on this server
      *
@@ -70,12 +59,7 @@ public class ServerInfoAdminResource {
         setProviders(info);
         setProtocolMapperTypes(info);
         setBuiltinProtocolMappers(info);
-        
-        event.event(EventType.VIEW_SERVER_INFO)
-            .detail(Details.SERVER_VERSION, info.version)
-            .detail(Details.SERVER_TIME, info.serverTime)
-            .success();
-        
+        setEventTypes(info);
         return info;
     }
 
@@ -194,6 +178,15 @@ public class ServerInfoAdminResource {
         }
     }
 
+    private void setEventTypes(ServerInfoRepresentation info) {
+        List<String> eventTypes = new LinkedList<>();
+        for (EventType t : EventType.values()) {
+            eventTypes.add(t.name());
+        }
+        Collections.sort(eventTypes);
+        info.setEventTypes(eventTypes);
+    }
+
     public static class ServerInfoRepresentation {
 
         private String version;
@@ -213,6 +206,8 @@ public class ServerInfoAdminResource {
         private Map<String, List<ProtocolMapperTypeRepresentation>> protocolMapperTypes;
         private Map<String, List<ProtocolMapperRepresentation>> builtinProtocolMappers;
 
+        private List<String> eventTypes;
+
         public ServerInfoRepresentation() {
         }
 
@@ -263,6 +258,14 @@ public class ServerInfoAdminResource {
         public void setBuiltinProtocolMappers(Map<String, List<ProtocolMapperRepresentation>> builtinProtocolMappers) {
             this.builtinProtocolMappers = builtinProtocolMappers;
         }
+
+        public List<String> getEventTypes() {
+            return eventTypes;
+        }
+
+        public void setEventTypes(List<String> eventTypes) {
+            this.eventTypes = eventTypes;
+        }
     }
 
 }
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java
index 1dad039..06a8523 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UserFederationResource.java
@@ -11,7 +11,6 @@ import org.keycloak.models.UserFederationProvider;
 import org.keycloak.models.UserFederationProviderFactory;
 import org.keycloak.models.UserFederationProviderModel;
 import org.keycloak.constants.KerberosConstants;
-import org.keycloak.events.Details;
 import org.keycloak.events.EventBuilder;
 import org.keycloak.events.EventType;
 import org.keycloak.models.utils.ModelToRepresentation;
@@ -49,12 +48,12 @@ public class UserFederationResource {
     protected RealmModel realm;
 
     protected  RealmAuth auth;
-    
+
     private EventBuilder event;
-    
+
     @Context
     protected UriInfo uriInfo;
-    
+
     @Context
     protected KeycloakSession session;
 
@@ -85,13 +84,13 @@ public class UserFederationResource {
             providers.add(rep);
         }
         
-        event.event(EventType.VIEW_PROVIDER_FACTORIES).success();
+        event.event(EventType.VIEW_FEDERATION_PROVIDERS).representation(providers).success();
         
         return providers;
     }
 
     /**
-     * Get a provider
+     * Get List of available provider factories
      *
      * @return
      */
@@ -109,7 +108,7 @@ public class UserFederationResource {
             rep.setId(factory.getId());
             rep.setOptions(((UserFederationProviderFactory)factory).getConfigurationOptions());
             
-            event.event(EventType.VIEW_PROVIDER).detail(Details.PROVIDER_ID, rep.getId()).success();
+            event.event(EventType.VIEW_FEDERATION_PROVIDER).representation(rep).success();
             
             return rep;
         }
@@ -135,12 +134,11 @@ public class UserFederationResource {
                 rep.getFullSyncPeriod(), rep.getChangedSyncPeriod(), rep.getLastSync());
         new UsersSyncManager().refreshPeriodicSyncForProvider(session.getKeycloakSessionFactory(), session.getProvider(TimerProvider.class), model, realm.getId());
         checkKerberosCredential(model);
-        
-        event.event(EventType.CREATE_PROVIDER)
-            .detail(Details.PROVIDER_ID, model.getId())
-            .detail(Details.PROVIDER_NAME, model.getProviderName())
+
+        event.event(EventType.CREATE_FEDERATION_PROVIDER)
+            .representation(rep)
             .success();
-        
+
         return Response.created(uriInfo.getAbsolutePathBuilder().path(model.getId()).build()).build();
     }
 
@@ -164,10 +162,9 @@ public class UserFederationResource {
         realm.updateUserFederationProvider(model);
         new UsersSyncManager().refreshPeriodicSyncForProvider(session.getKeycloakSessionFactory(), session.getProvider(TimerProvider.class), model, realm.getId());
         checkKerberosCredential(model);
-        
-        event.event(EventType.UPDATE_PROVIDER)
-            .detail(Details.PROVIDER_ID, model.getId())
-            .detail(Details.PROVIDER_NAME, model.getProviderName())
+
+        event.event(EventType.UPDATE_FEDERATION_PROVIDER)
+            .representation(rep)
             .success();
     }
 
@@ -184,13 +181,13 @@ public class UserFederationResource {
         auth.requireView();
         for (UserFederationProviderModel model : realm.getUserFederationProviders()) {
             if (model.getId().equals(id)) {
-                
-                event.event(EventType.VIEW_PROVIDER)
-                    .detail(Details.PROVIDER_ID, model.getId())
-                    .detail(Details.PROVIDER_NAME, model.getProviderName())
+                UserFederationProviderRepresentation rep = ModelToRepresentation.toRepresentation(model);
+
+                event.event(EventType.VIEW_FEDERATION_PROVIDER)
+                    .representation(rep)
                     .success();
                 
-                return ModelToRepresentation.toRepresentation(model);
+                return rep;
             }
         }
         
@@ -206,13 +203,14 @@ public class UserFederationResource {
     @Path("instances/{id}")
     public void deleteProviderInstance(@PathParam("id") String id) {
         auth.requireManage();
+
+        UserFederationProviderRepresentation rep = getProviderInstance(id);
         UserFederationProviderModel model = new UserFederationProviderModel(id, null, null, -1, null, -1, -1, 0);
         realm.removeUserFederationProvider(model);
         new UsersSyncManager().removePeriodicSyncForProvider(session.getProvider(TimerProvider.class), model);
         
-        event.event(EventType.DELETE_PROVIDER)
-            .detail(Details.PROVIDER_ID, model.getId())
-            .detail(Details.PROVIDER_NAME, model.getProviderName())
+        event.event(EventType.DELETE_FEDERATION_PROVIDER)
+            .representation(rep)
             .success();
     }
 
diff --git a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
index f66ec2e..3cc0895 100755
--- a/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/admin/UsersResource.java
@@ -39,7 +39,6 @@ import org.keycloak.representations.idm.UserSessionRepresentation;
 import org.keycloak.services.managers.AuthenticationManager;
 import org.keycloak.services.managers.ClientSessionCode;
 import org.keycloak.services.managers.RealmManager;
-import org.keycloak.services.managers.ResourceAdminManager;
 import org.keycloak.services.managers.UserManager;
 import org.keycloak.services.resources.flows.Flows;
 import org.keycloak.services.resources.flows.Urls;
@@ -96,7 +95,7 @@ public class UsersResource {
 
     @Context
     protected HttpHeaders headers;
-    
+
     public UsersResource(RealmModel realm, RealmAuth auth, TokenManager tokenManager, EventBuilder event) {
         this.auth = auth;
         this.realm = realm;
@@ -127,14 +126,13 @@ public class UsersResource {
             updateUserFromRep(user, rep);
 
             event.event(EventType.UPDATE_USER)
-                .user(user)
-                .detail(Details.USERNAME, user.getUsername())
+                .representation(rep)
                 .success();
             
             if (session.getTransaction().isActive()) {
                 session.getTransaction().commit();
             }
-            
+
             return Response.noContent().build();
         } catch (ModelDuplicateException e) {
             return Flows.errors().exists("User exists with same username or email");
@@ -166,16 +164,15 @@ public class UsersResource {
         try {
             UserModel user = session.users().addUser(realm, rep.getUsername());
             updateUserFromRep(user, rep);
-            
+
             event.event(EventType.CREATE_USER)
-                .user(user)
-                .detail(Details.USERNAME, user.getUsername())
+                .representation(rep)
                 .success();
-            
+
             if (session.getTransaction().isActive()) {
                 session.getTransaction().commit();
             }
-            
+
             return Response.created(uriInfo.getAbsolutePathBuilder().path(user.getUsername()).build()).build();
         } catch (ModelDuplicateException e) {
             if (session.getTransaction().isActive()) {
@@ -236,13 +233,14 @@ public class UsersResource {
         if (user == null) {
             throw new NotFoundException("User not found");
         }
-        
+
+        UserRepresentation rep = ModelToRepresentation.toRepresentation(user);
+
         event.event(EventType.VIEW_USER)
-            .user(user)
-            .detail(Details.USERNAME, user.getUsername())
+            .representation(rep)
             .success();
-        
-        return ModelToRepresentation.toRepresentation(user);
+
+        return rep;
     }
 
     /**
@@ -269,8 +267,7 @@ public class UsersResource {
         }
         
         event.event(EventType.VIEW_USER_SESSIONS)
-            .user(user)
-            .detail(Details.USERNAME, user.getUsername())
+            .representation(reps)
             .success();
 
         return reps;
@@ -305,9 +302,8 @@ public class UsersResource {
             }
         }
         
-        event.event(EventType.VIEW_USER_SOCIAL_LOGINS)
-            .user(user)
-            .detail(Details.USERNAME, user.getUsername())
+        event.event(EventType.VIEW_USER)
+            .representation(result)
             .success();
         
         return result;
@@ -366,9 +362,7 @@ public class UsersResource {
             AuthenticationManager.backchannelLogout(session, realm, userSession, uriInfo, clientConnection, headers);
         }
         
-        event.event(EventType.INVALIDATE_USER_SESSIONS)
-            .user(user)
-            .detail(Details.USERNAME, user.getUsername())
+        event.event(EventType.LOGOUT_USER_SESSIONS)
             .success();
     }
 
@@ -383,6 +377,7 @@ public class UsersResource {
     public Response deleteUser(final @PathParam("username") String username) {
         auth.requireManage();
 
+        UserRepresentation rep = getUser(username);
         UserModel user = session.users().getUserByUsername(username, realm);
         if (user == null) {
             throw new NotFoundException("User not found");
@@ -392,8 +387,7 @@ public class UsersResource {
         if (removed) {
             
             event.event(EventType.DELETE_USER)
-                .user(user)
-                .detail(Details.USERNAME, user.getUsername())
+                .representation(rep)
                 .success();
             
             return Response.noContent().build();
diff --git a/services/src/main/java/org/keycloak/services/resources/IdentityBrokerService.java b/services/src/main/java/org/keycloak/services/resources/IdentityBrokerService.java
index 251130d..3f41801 100755
--- a/services/src/main/java/org/keycloak/services/resources/IdentityBrokerService.java
+++ b/services/src/main/java/org/keycloak/services/resources/IdentityBrokerService.java
@@ -46,7 +46,6 @@ import org.keycloak.services.managers.AppAuthManager;
 import org.keycloak.services.managers.AuthenticationManager;
 import org.keycloak.services.managers.AuthenticationManager.AuthResult;
 import org.keycloak.services.managers.ClientSessionCode;
-import org.keycloak.services.managers.EventsManager;
 import org.keycloak.services.messages.Messages;
 import org.keycloak.services.resources.flows.Flows;
 import org.keycloak.services.resources.flows.Urls;
@@ -62,7 +61,6 @@ import javax.ws.rs.PathParam;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.*;
 import javax.ws.rs.core.Response.Status;
-
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
@@ -111,7 +109,7 @@ public class IdentityBrokerService implements IdentityProvider.AuthenticationCal
     }
 
     public void init() {
-        this.event = new EventsManager(this.realmModel, this.session, this.clientConnection).createEventBuilder().event(EventType.IDENTITY_PROVIDER_LOGIN).eventGroup(EventGroup.USER);
+        this.event = new EventBuilder(EventGroup.USER, realmModel, session, clientConnection).event(EventType.IDENTITY_PROVIDER_LOGIN);
     }
 
     @GET
@@ -256,7 +254,7 @@ public class IdentityBrokerService implements IdentityProvider.AuthenticationCal
 
         this.event.event(EventType.IDENTITY_PROVIDER_LOGIN)
                 .detail(Details.REDIRECT_URI, clientSession.getRedirectUri())
-                .detail(Details.IDENTITY_PROVIDER_IDENTITY, federatedIdentity.getUsername());
+                .detail(Details.IDENTITY_PROVIDER_USERNAME, federatedIdentity.getUsername());
 
         UserModel federatedUser = this.session.users().getUserByFederatedIdentity(federatedIdentityModel, this.realmModel);
 
@@ -516,7 +514,7 @@ public class IdentityBrokerService implements IdentityProvider.AuthenticationCal
 
         this.event.clone().user(federatedUser).event(EventType.REGISTER)
                 .detail(Details.IDENTITY_PROVIDER, federatedIdentityModel.getIdentityProvider())
-                .detail(Details.IDENTITY_PROVIDER_IDENTITY, updatedIdentity.getUsername())
+                .detail(Details.IDENTITY_PROVIDER_USERNAME, updatedIdentity.getUsername())
                 .removeDetail("auth_method")
                 .success();
 
diff --git a/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java b/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java
index a802182..186c068 100755
--- a/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java
+++ b/services/src/main/java/org/keycloak/services/resources/LoginActionsService.java
@@ -64,7 +64,6 @@ import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
 import javax.ws.rs.ext.Providers;
-
 import java.util.LinkedList;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
@@ -134,7 +133,7 @@ public class LoginActionsService {
     public LoginActionsService(RealmModel realm, AuthenticationManager authManager, EventBuilder event) {
         this.realm = realm;
         this.authManager = authManager;
-        this.event = event.eventGroup(EventGroup.USER);
+        this.event = event;
     }
 
     private boolean checkSsl() {
@@ -539,7 +538,7 @@ public class LoginActionsService {
         AttributeFormDataProcessor.process(formData, realm, user);
 
         event.user(user).success();
-        event.reset();
+        event = new EventBuilder(EventGroup.USER, realm, session, clientConnection);
 
         return processLogin(code, formData);
     }
diff --git a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
index 22aab14..a28839c 100755
--- a/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
+++ b/services/src/main/java/org/keycloak/services/resources/RealmsResource.java
@@ -16,7 +16,6 @@ import org.keycloak.protocol.oidc.OIDCLoginProtocol;
 import org.keycloak.protocol.oidc.OIDCLoginProtocolService;
 import org.keycloak.services.managers.AuthenticationManager;
 import org.keycloak.services.managers.BruteForceProtector;
-import org.keycloak.services.managers.EventsManager;
 import org.keycloak.services.managers.RealmManager;
 import org.keycloak.wellknown.WellKnownProvider;
 
@@ -92,7 +91,7 @@ public class RealmsResource {
         // backward compatibility
         RealmManager realmManager = new RealmManager(session);
         RealmModel realm = locateRealm(name, realmManager);
-        EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder();
+        EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection);
         AuthenticationManager authManager = new AuthenticationManager(protector);
 
         LoginProtocolFactory factory = (LoginProtocolFactory)session.getKeycloakSessionFactory().getProviderFactory(LoginProtocol.class, OIDCLoginProtocol.LOGIN_PROTOCOL);
@@ -108,7 +107,7 @@ public class RealmsResource {
                                             final @PathParam("protocol") String protocol) {
         RealmManager realmManager = new RealmManager(session);
         RealmModel realm = locateRealm(name, realmManager);
-        EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder();
+        EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection);
         AuthenticationManager authManager = new AuthenticationManager(protector);
 
         LoginProtocolFactory factory = (LoginProtocolFactory)session.getKeycloakSessionFactory().getProviderFactory(LoginProtocol.class, protocol);
@@ -130,8 +129,7 @@ public class RealmsResource {
     public LoginActionsService getLoginActionsService(final @PathParam("realm") String name) {
         RealmManager realmManager = new RealmManager(session);
         RealmModel realm = locateRealm(name, realmManager);
-        EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder();
-        event.eventGroup(EventGroup.USER);
+        EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection);
         AuthenticationManager authManager = new AuthenticationManager(protector);
         LoginActionsService service = new LoginActionsService(realm, authManager, event);
         ResteasyProviderFactory.getInstance().injectProperties(service);
@@ -144,8 +142,7 @@ public class RealmsResource {
     public ClientsManagementService getClientsManagementService(final @PathParam("realm") String name) {
         RealmManager realmManager = new RealmManager(session);
         RealmModel realm = locateRealm(name, realmManager);
-        EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder();
-        event.eventGroup(EventGroup.USER);
+        EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection);
         ClientsManagementService service = new ClientsManagementService(realm, event);
         ResteasyProviderFactory.getInstance().injectProperties(service);
         return service;
@@ -171,8 +168,7 @@ public class RealmsResource {
             throw new NotFoundException("account management not enabled");
         }
 
-        EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder();
-        event.eventGroup(EventGroup.USER);
+        EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection);
         AccountService accountService = new AccountService(realm, application, event);
         ResteasyProviderFactory.getInstance().injectProperties(accountService);
         //resourceContext.initResource(accountService);
diff --git a/social/twitter/src/main/java/org/keycloak/social/twitter/TwitterIdentityProvider.java b/social/twitter/src/main/java/org/keycloak/social/twitter/TwitterIdentityProvider.java
index e9ced5f..2e90854 100755
--- a/social/twitter/src/main/java/org/keycloak/social/twitter/TwitterIdentityProvider.java
+++ b/social/twitter/src/main/java/org/keycloak/social/twitter/TwitterIdentityProvider.java
@@ -29,6 +29,7 @@ import org.keycloak.broker.provider.AuthenticationRequest;
 import org.keycloak.broker.provider.FederatedIdentity;
 import org.keycloak.broker.provider.IdentityBrokerException;
 import org.keycloak.events.EventBuilder;
+import org.keycloak.events.EventGroup;
 import org.keycloak.events.EventType;
 import org.keycloak.models.ClientModel;
 import org.keycloak.models.ClientSessionModel;
@@ -36,7 +37,6 @@ import org.keycloak.models.FederatedIdentityModel;
 import org.keycloak.models.KeycloakSession;
 import org.keycloak.models.RealmModel;
 import org.keycloak.services.managers.ClientSessionCode;
-import org.keycloak.services.managers.EventsManager;
 import org.keycloak.services.messages.Messages;
 import org.keycloak.services.resources.flows.Flows;
 import org.keycloak.social.SocialIdentityProvider;
@@ -156,7 +156,7 @@ public class TwitterIdentityProvider extends AbstractIdentityProvider<OAuth2Iden
             } catch (Exception e) {
                 logger.error("Could get user profile from twitter.", e);
             }
-            EventBuilder event = new EventsManager(realm, session, clientConnection).createEventBuilder();
+            EventBuilder event = new EventBuilder(EventGroup.USER, realm, session, clientConnection);
             event.event(EventType.LOGIN);
             event.error("twitter_login_failed");
             return Flows.forwardToSecurityFailurePage(session, realm, uriInfo, headers, Messages.UNEXPECTED_ERROR_HANDLING_RESPONSE);
diff --git a/testsuite/integration/src/test/java/org/keycloak/testsuite/events/EventStoreProviderTest.java b/testsuite/integration/src/test/java/org/keycloak/testsuite/events/EventStoreProviderTest.java
index b82c73a..e734e58 100755
--- a/testsuite/integration/src/test/java/org/keycloak/testsuite/events/EventStoreProviderTest.java
+++ b/testsuite/integration/src/test/java/org/keycloak/testsuite/events/EventStoreProviderTest.java
@@ -186,7 +186,7 @@ public class EventStoreProviderTest {
         Event e = new Event();
         e.setTime(time);
         e.setType(event);
-        e.setEventGroup(EventGroup.USER);
+        e.setGroup(EventGroup.USER);
         e.setRealmId(realmId);
         e.setClientId(clientId);
         e.setUserId(userId);