Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/EventBusPlugin.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/EventBusPlugin.java	(revision 34033)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/EventBusPlugin.java	(revision 34034)
@@ -7,16 +7,11 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.ExpertModeChangedEvent;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
 import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
-import org.openstreetmap.josm.data.CommandQueueEvent;
 import org.openstreetmap.josm.data.SelectionChangedListener;
-import org.openstreetmap.josm.data.SoMChangedEvent;
 import org.openstreetmap.josm.data.SystemOfMeasurement;
 import org.openstreetmap.josm.data.SystemOfMeasurement.SoMChangeListener;
 import org.openstreetmap.josm.data.UndoRedoHandler.CommandQueueListener;
 import org.openstreetmap.josm.data.conflict.ConflictCollection;
-import org.openstreetmap.josm.data.conflict.ConflictsAddedEvent;
-import org.openstreetmap.josm.data.conflict.ConflictsRemovedEvent;
 import org.openstreetmap.josm.data.conflict.IConflictListener;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -30,7 +25,5 @@
 import org.openstreetmap.josm.data.osm.NoteData;
 import org.openstreetmap.josm.data.osm.NoteData.NoteDataUpdateListener;
-import org.openstreetmap.josm.data.osm.NoteDataUpdatedEvent;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
-import org.openstreetmap.josm.data.osm.SelectedNoteChangedEvent;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
@@ -42,27 +35,16 @@
 import org.openstreetmap.josm.data.osm.event.TagsChangedEvent;
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
-import org.openstreetmap.josm.data.osm.history.HistoryClearedEvent;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSetListener;
-import org.openstreetmap.josm.data.osm.history.HistoryUpdatedEvent;
 import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
-import org.openstreetmap.josm.data.projection.ProjectionChangedEvent;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapFrame.MapModeChangeListener;
-import org.openstreetmap.josm.gui.MapFrameInitializedEvent;
-import org.openstreetmap.josm.gui.MapModeChangeEvent;
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.NavigatableComponent.ZoomChangeListener;
-import org.openstreetmap.josm.gui.ZoomChangedEvent;
 import org.openstreetmap.josm.gui.conflict.tags.MultiValueCellEditor.NavigationListener;
-import org.openstreetmap.josm.gui.conflict.tags.NextDecisionEvent;
-import org.openstreetmap.josm.gui.conflict.tags.PreviousDecisionEvent;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog;
 import org.openstreetmap.josm.gui.dialogs.LayerListDialog.LayerListModelListener;
-import org.openstreetmap.josm.gui.dialogs.LayerListRefreshedEvent;
-import org.openstreetmap.josm.gui.dialogs.LayerVisibleEvent;
 import org.openstreetmap.josm.gui.dialogs.relation.IMemberModelListener;
-import org.openstreetmap.josm.gui.dialogs.relation.MemberVisibleEvent;
 import org.openstreetmap.josm.gui.layer.AbstractTileSourceLayer;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
@@ -73,5 +55,4 @@
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerOrderChangeEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerRemoveEvent;
-import org.openstreetmap.josm.gui.layer.LayerStateChangeEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.LayerAvailabilityEvent;
@@ -81,31 +62,50 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.LayerStateChangeListener;
-import org.openstreetmap.josm.gui.layer.imagery.FilterChangedEvent;
 import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings.FilterChangeListener;
 import org.openstreetmap.josm.gui.layer.imagery.TileSourceDisplaySettings.DisplaySettingsChangeListener;
-import org.openstreetmap.josm.gui.mappaint.MapPaintStyleEntryUpdatedEvent;
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintSylesUpdateListener;
-import org.openstreetmap.josm.gui.mappaint.MapPaintStylesUpdatedEvent;
 import org.openstreetmap.josm.gui.preferences.imagery.AddImageryPanel.ContentValidationListener;
-import org.openstreetmap.josm.gui.preferences.imagery.ContentValidationEvent;
 import org.openstreetmap.josm.gui.preferences.server.ProxyPreference;
-import org.openstreetmap.josm.gui.preferences.server.ProxyPreferenceChangedEvent;
 import org.openstreetmap.josm.gui.preferences.server.ProxyPreferenceListener;
-import org.openstreetmap.josm.gui.progress.OperationCancelledEvent;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor.CancelListener;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetListener;
-import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetModifiedEvent;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
 import org.openstreetmap.josm.gui.util.KeyPressReleaseListener;
-import org.openstreetmap.josm.gui.util.KeyPressedEvent;
-import org.openstreetmap.josm.gui.util.KeyReleasedEvent;
-import org.openstreetmap.josm.gui.util.ModifierExChangedEvent;
 import org.openstreetmap.josm.gui.util.ModifierExListener;
 import org.openstreetmap.josm.io.OsmApi;
 import org.openstreetmap.josm.io.OsmApi.OsmApiInitializationListener;
-import org.openstreetmap.josm.io.OsmApiInitializedEvent;
 import org.openstreetmap.josm.plugins.Plugin;
 import org.openstreetmap.josm.plugins.PluginInformation;
+import org.openstreetmap.josm.plugins.eventbus.actions.ExpertModeChangedEvent;
+import org.openstreetmap.josm.plugins.eventbus.data.CommandQueueEvent;
+import org.openstreetmap.josm.plugins.eventbus.data.SoMChangedEvent;
+import org.openstreetmap.josm.plugins.eventbus.data.conflict.ConflictsAddedEvent;
+import org.openstreetmap.josm.plugins.eventbus.data.conflict.ConflictsRemovedEvent;
+import org.openstreetmap.josm.plugins.eventbus.data.osm.NoteDataUpdatedEvent;
+import org.openstreetmap.josm.plugins.eventbus.data.osm.SelectedNoteChangedEvent;
+import org.openstreetmap.josm.plugins.eventbus.data.osm.history.HistoryClearedEvent;
+import org.openstreetmap.josm.plugins.eventbus.data.osm.history.HistoryUpdatedEvent;
+import org.openstreetmap.josm.plugins.eventbus.data.projection.ProjectionChangedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.MapFrameInitializedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.MapModeChangeEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.ZoomChangedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.conflict.tags.NextDecisionEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.conflict.tags.PreviousDecisionEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.dialogs.LayerListRefreshedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.dialogs.LayerVisibleEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.dialogs.relation.MemberVisibleEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.layer.LayerStateChangeEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.layer.imagery.FilterChangedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.mappaint.MapPaintStyleEntryUpdatedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.mappaint.MapPaintStylesUpdatedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.preferences.imagery.ContentValidationEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.preferences.server.ProxyPreferenceChangedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.progress.OperationCancelledEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.tagging.presets.TaggingPresetModifiedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.util.KeyPressedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.util.KeyReleasedEvent;
+import org.openstreetmap.josm.plugins.eventbus.gui.util.ModifierExChangedEvent;
+import org.openstreetmap.josm.plugins.eventbus.io.OsmApiInitializedEvent;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/actions/ExpertModeChangedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/actions/ExpertModeChangedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/actions/ExpertModeChangedEvent.java	(revision 34034)
@@ -0,0 +1,32 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.actions;
+
+import java.util.EventObject;
+
+/**
+ * Event fired whenever the expert mode setting changed.
+ */
+public class ExpertModeChangedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final boolean isExpert;
+
+    /**
+     * Constructs a new {@code ExpertModeChangedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param isExpert {@code true} if expert mode has been enabled, false otherwise
+     */
+    public ExpertModeChangedEvent(Object source, boolean isExpert) {
+        super(source);
+        this.isExpert = isExpert;
+    }
+
+    /**
+     * Determines if expert mode has been enabled.
+     * @return {@code true} if expert mode has been enabled, false otherwise
+     */
+    public boolean isExpert() {
+        return isExpert;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/CommandQueueEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/CommandQueueEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/CommandQueueEvent.java	(revision 34034)
@@ -0,0 +1,43 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when the command queue (undo/redo) size changes.
+ */
+public class CommandQueueEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final int queueSize;
+    private final int redoSize;
+
+    /**
+     * Constructs a new {@code CommandQueueEvent}.
+     * @param source object on which the Event initially occurred
+     * @param queueSize Undo stack size
+     * @param redoSize Redo stack size
+     */
+    public CommandQueueEvent(Object source, int queueSize, int redoSize) {
+        super(source);
+        this.queueSize = queueSize;
+        this.redoSize = redoSize;
+    }
+
+    /**
+     * Returns Undo stack size.
+     * @return Undo stack size
+     */
+    public final int getQueueSize() {
+        return queueSize;
+    }
+
+    /**
+     * Returns Redo stack size.
+     * @return Redo stack size
+     */
+    public final int getRedoSize() {
+        return redoSize;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/SoMChangedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/SoMChangedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/SoMChangedEvent.java	(revision 34034)
@@ -0,0 +1,44 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data;
+
+import java.util.EventObject;
+import java.util.Objects;
+
+/**
+ * Event fired when the syste of measurement changes.
+ */
+public class SoMChangedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final String oldSoM;
+    private final String newSoM;
+
+    /**
+     * Constructs a new {@code SoMChangedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param oldSoM old system of measurement
+     * @param newSoM new system of measurement
+     */
+    public SoMChangedEvent(Object source, String oldSoM, String newSoM) {
+        super(source);
+        this.oldSoM = Objects.requireNonNull(oldSoM);
+        this.newSoM = Objects.requireNonNull(newSoM);
+    }
+
+    /**
+     * Returns the old system of measurement.
+     * @return the old system of measurement
+     */
+    public final String getOldSoM() {
+        return oldSoM;
+    }
+
+    /**
+     * Returns the new system of measurement.
+     * @return the new system of measurement
+     */
+    public final String getNewSoM() {
+        return newSoM;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/conflict/AbstractConflictsEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/conflict/AbstractConflictsEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/conflict/AbstractConflictsEvent.java	(revision 34034)
@@ -0,0 +1,35 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data.conflict;
+
+import java.util.EventObject;
+import java.util.Objects;
+
+import org.openstreetmap.josm.data.conflict.ConflictCollection;
+
+/**
+ * Superclass of conflict events.
+ */
+public abstract class AbstractConflictsEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final ConflictCollection conflicts;
+
+    /**
+     * Constructs a new {@code ExpertModeChangedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param conflicts collection of all conflicts
+     */
+    AbstractConflictsEvent(Object source, ConflictCollection conflicts) {
+        super(source);
+        this.conflicts = Objects.requireNonNull(conflicts);
+    }
+
+    /**
+     * Returns collection of all conflicts.
+     * @return collection of all conflicts
+     */
+    public ConflictCollection getConflicts() {
+        return conflicts;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/conflict/ConflictsAddedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/conflict/ConflictsAddedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/conflict/ConflictsAddedEvent.java	(revision 34034)
@@ -0,0 +1,32 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data.conflict;
+
+import java.util.Collection;
+
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.conflict.ConflictCollection;
+
+/**
+ * Event fired when conflicts are added.
+ */
+public class ConflictsAddedEvent extends AbstractConflictsEvent {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code ConflictsAddedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param conflicts conflicts collection
+     */
+    public ConflictsAddedEvent(Object source, ConflictCollection conflicts) {
+        super(source, conflicts);
+    }
+
+    /**
+     * Returns added conflicts.
+     * @return added conflicts
+     */
+    public Collection<Conflict<?>> getAddedConflicts() {
+        throw new UnsupportedOperationException("Requires a change in core"); // FIXME
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/conflict/ConflictsRemovedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/conflict/ConflictsRemovedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/conflict/ConflictsRemovedEvent.java	(revision 34034)
@@ -0,0 +1,32 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data.conflict;
+
+import java.util.Collection;
+
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.conflict.ConflictCollection;
+
+/**
+ * Event fired when conflicts are removed.
+ */
+public class ConflictsRemovedEvent extends AbstractConflictsEvent {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code ConflictsRemovedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param conflicts conflicts collection
+     */
+    public ConflictsRemovedEvent(Object source, ConflictCollection conflicts) {
+        super(source, conflicts);
+    }
+
+    /**
+     * Returns removed conflicts.
+     * @return removed conflicts
+     */
+    public Collection<Conflict<?>> getRemovedConflicts() {
+        throw new UnsupportedOperationException("Requires a change in core"); // FIXME
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/AbstractNoteDataEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/AbstractNoteDataEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/AbstractNoteDataEvent.java	(revision 34034)
@@ -0,0 +1,35 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data.osm;
+
+import java.util.EventObject;
+import java.util.Objects;
+
+import org.openstreetmap.josm.data.osm.NoteData;
+
+/**
+ * Superclass of note events.
+ */
+abstract class AbstractNoteDataEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final NoteData noteData;
+
+    /**
+     * Constructs a new {@code AbstractNoteDataEvent}.
+     * @param source object on which the Event initially occurred
+     * @param noteData note data set
+     */
+    AbstractNoteDataEvent(Object source, NoteData noteData) {
+        super(source);
+        this.noteData = Objects.requireNonNull(noteData);
+    }
+
+    /**
+     * Returns note data set.
+     * @return note data set
+     */
+    public final NoteData getNoteData() {
+        return noteData;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/NoteDataUpdatedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/NoteDataUpdatedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/NoteDataUpdatedEvent.java	(revision 34034)
@@ -0,0 +1,21 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data.osm;
+
+import org.openstreetmap.josm.data.osm.NoteData;
+
+/**
+ * Event fired when note data set is updated.
+ */
+public class NoteDataUpdatedEvent extends AbstractNoteDataEvent {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code NoteDataUpdatedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param noteData note data set
+     */
+    public NoteDataUpdatedEvent(Object source, NoteData noteData) {
+        super(source, noteData);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/SelectedNoteChangedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/SelectedNoteChangedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/SelectedNoteChangedEvent.java	(revision 34034)
@@ -0,0 +1,21 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data.osm;
+
+import org.openstreetmap.josm.data.osm.NoteData;
+
+/**
+ * Event fired when the selected note changes.
+ */
+public class SelectedNoteChangedEvent extends AbstractNoteDataEvent {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code SelectedNoteChangedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param noteData note data set
+     */
+    public SelectedNoteChangedEvent(Object source, NoteData noteData) {
+        super(source, noteData);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/history/AbstractHistoryEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/history/AbstractHistoryEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/history/AbstractHistoryEvent.java	(revision 34034)
@@ -0,0 +1,35 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data.osm.history;
+
+import java.util.EventObject;
+import java.util.Objects;
+
+import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
+
+/**
+ * Superclass of history events.
+ */
+public class AbstractHistoryEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final HistoryDataSet historyDataSet;
+
+    /**
+     * Constructs a new {@code AbstractHistoryEvent}.
+     * @param source object on which the Event initially occurred
+     * @param historyDataSet history data set for which the event is trigerred
+     */
+    AbstractHistoryEvent(Object source, HistoryDataSet historyDataSet) {
+        super(source);
+        this.historyDataSet = Objects.requireNonNull(historyDataSet);
+    }
+
+    /**
+     * Returns history data set for which the event is trigerred.
+     * @return history data set for which the event is trigerred
+     */
+    public final HistoryDataSet getHistoryDataSet() {
+        return historyDataSet;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/history/HistoryClearedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/history/HistoryClearedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/history/HistoryClearedEvent.java	(revision 34034)
@@ -0,0 +1,21 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data.osm.history;
+
+import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
+
+/**
+ * Event fired when history is cleared.
+ */
+public class HistoryClearedEvent extends AbstractHistoryEvent {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code HistoryClearedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param historyDataSet history data set for which the event is trigerred
+     */
+    public HistoryClearedEvent(Object source, HistoryDataSet historyDataSet) {
+        super(source, historyDataSet);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/history/HistoryUpdatedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/history/HistoryUpdatedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/osm/history/HistoryUpdatedEvent.java	(revision 34034)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data.osm.history;
+
+import org.openstreetmap.josm.data.osm.PrimitiveId;
+import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
+
+/**
+ * Event fired when history is updated for an OSM primitive.
+ */
+public class HistoryUpdatedEvent extends AbstractHistoryEvent {
+
+    private static final long serialVersionUID = 1L;
+
+    private final PrimitiveId id;
+
+    /**
+     * Constructs a new {@code HistoryUpdatedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param historyDataSet history data set for which the event is trigerred
+     * @param id the primitive id for which history has been updated
+     */
+    public HistoryUpdatedEvent(Object source, HistoryDataSet historyDataSet, PrimitiveId id) {
+        super(source, historyDataSet);
+        this.id = id;
+    }
+
+    /**
+     * Returns the primitive id for which history has been updated.
+     * @return primitive id for which history has been updated
+     */
+    public PrimitiveId getId() {
+        return id;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/projection/ProjectionChangedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/projection/ProjectionChangedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/data/projection/ProjectionChangedEvent.java	(revision 34034)
@@ -0,0 +1,46 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.data.projection;
+
+import java.util.EventObject;
+import java.util.Objects;
+
+import org.openstreetmap.josm.data.projection.Projection;
+
+/**
+ * Event fired when the map projection changes.
+ */
+public class ProjectionChangedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final Projection oldValue;
+    private final Projection newValue;
+
+    /**
+     * Constructs a new {@code ProjectionChangedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param oldValue old projection
+     * @param newValue new projection
+     */
+    public ProjectionChangedEvent(Object source, Projection oldValue, Projection newValue) {
+        super(source);
+        this.oldValue = Objects.requireNonNull(oldValue);
+        this.newValue = Objects.requireNonNull(newValue);
+    }
+
+    /**
+     * Returns the old projection.
+     * @return the old projection
+     */
+    public final Projection getOldValue() {
+        return oldValue;
+    }
+
+    /**
+     * Returns the new projection.
+     * @return the new projection
+     */
+    public final Projection getNewValue() {
+        return newValue;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/MapFrameInitializedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/MapFrameInitializedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/MapFrameInitializedEvent.java	(revision 34034)
@@ -0,0 +1,45 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui;
+
+import java.util.EventObject;
+
+import org.openstreetmap.josm.gui.MapFrame;
+
+/**
+ * Event fired when the map frame is initialized (after the first data is loaded).
+ */
+public class MapFrameInitializedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final MapFrame oldFrame;
+    private final MapFrame newFrame;
+
+    /**
+     * Constructs a new {@code MapFrameInitializedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param oldFrame The old MapFrame
+     * @param newFrame The new MapFrame
+     */
+    public MapFrameInitializedEvent(Object source, MapFrame oldFrame, MapFrame newFrame) {
+        super(source);
+        this.oldFrame = oldFrame;
+        this.newFrame = newFrame;
+    }
+
+    /**
+     * Returns the old MapFrame.
+     * @return the old MapFrame
+     */
+    public MapFrame getOldMapFrame() {
+        return oldFrame;
+    }
+
+    /**
+     * Returns the new MapFrame.
+     * @return the new MapFrame
+     */
+    public MapFrame getNewMapFrame() {
+        return newFrame;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/MapModeChangeEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/MapModeChangeEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/MapModeChangeEvent.java	(revision 34034)
@@ -0,0 +1,45 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui;
+
+import java.util.EventObject;
+
+import org.openstreetmap.josm.actions.mapmode.MapMode;
+
+/**
+ * Event fired when the map mode changes.
+ */
+public class MapModeChangeEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final MapMode oldMapMode;
+    private final MapMode newMapMode;
+
+    /**
+     * Constructs a new {@code MapModeChangeEvent}.
+     * @param source object on which the Event initially occurred
+     * @param oldMapMode old map mode
+     * @param newMapMode new map mode
+     */
+    public MapModeChangeEvent(Object source, MapMode oldMapMode, MapMode newMapMode) {
+        super(source);
+        this.oldMapMode = oldMapMode;
+        this.newMapMode = newMapMode;
+    }
+
+    /**
+     * Returns the old map mode.
+     * @return the old map mode
+     */
+    public final MapMode getOldMapMode() {
+        return oldMapMode;
+    }
+
+    /**
+     * Returns the new map mode.
+     * @return the new map mode
+     */
+    public final MapMode getNewMapMode() {
+        return newMapMode;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/ZoomChangedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/ZoomChangedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/ZoomChangedEvent.java	(revision 34034)
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when the zoom changes.
+ */
+public class ZoomChangedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code ZoomChangedEvent}.
+     * @param source object on which the Event initially occurred
+     */
+    public ZoomChangedEvent(Object source) {
+        super(source);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/conflict/tags/NextDecisionEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/conflict/tags/NextDecisionEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/conflict/tags/NextDecisionEvent.java	(revision 34034)
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.conflict.tags;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when the focus goes to next decision.
+ */
+public class NextDecisionEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code NextDecisionEvent}.
+     * @param source object on which the Event initially occurred
+     */
+    public NextDecisionEvent(Object source) {
+        super(source);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/conflict/tags/PreviousDecisionEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/conflict/tags/PreviousDecisionEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/conflict/tags/PreviousDecisionEvent.java	(revision 34034)
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.conflict.tags;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when the focus goes to previous decision.
+ */
+public class PreviousDecisionEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code PreviousDecisionEvent}.
+     * @param source object on which the Event initially occurred
+     */
+    public PreviousDecisionEvent(Object source) {
+        super(source);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/dialogs/LayerListRefreshedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/dialogs/LayerListRefreshedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/dialogs/LayerListRefreshedEvent.java	(revision 34034)
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.dialogs;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when the list of layers is refreshed.
+ */
+public class LayerListRefreshedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code LayerListRefreshedEvent}.
+     * @param source object on which the Event initially occurred
+     */
+    public LayerListRefreshedEvent(Object source) {
+        super(source);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/dialogs/LayerVisibleEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/dialogs/LayerVisibleEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/dialogs/LayerVisibleEvent.java	(revision 34034)
@@ -0,0 +1,46 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.dialogs;
+
+import java.util.EventObject;
+import java.util.Objects;
+
+import org.openstreetmap.josm.gui.layer.Layer;
+
+/**
+ * Event fired when a layer becomes visible.
+ */
+public class LayerVisibleEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final int index;
+    private final Layer layer;
+
+    /**
+     * Constructs a new {@code LayerVisibleEvent}.
+     * @param source object on which the Event initially occurred
+     * @param index layer index
+     * @param layer layer
+     */
+    public LayerVisibleEvent(Object source, int index, Layer layer) {
+        super(source);
+        this.index = index;
+        this.layer = Objects.requireNonNull(layer);
+    }
+
+    /**
+     * Returns the layer index.
+     * @return the layer index
+     */
+    public final int getIndex() {
+        return index;
+    }
+
+    /**
+     * Returns the layer.
+     * @return the layer
+     */
+    public final Layer getLayer() {
+        return layer;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/dialogs/relation/MemberVisibleEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/dialogs/relation/MemberVisibleEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/dialogs/relation/MemberVisibleEvent.java	(revision 34034)
@@ -0,0 +1,32 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.dialogs.relation;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when a relation member becomes visible in the relation dialog.
+ */
+public class MemberVisibleEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final int index;
+
+    /**
+     * Constructs a new {@code MemberVisibleEvent}.
+     * @param source object on which the Event initially occurred
+     * @param index index of the member in the table
+     */
+    public MemberVisibleEvent(Object source, int index) {
+        super(source);
+        this.index = index;
+    }
+
+    /**
+     * Returns member index in member table.
+     * @return member index in member table
+     */
+    public final int getIndex() {
+        return index;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/download/DownloadSourceAddedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/download/DownloadSourceAddedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/download/DownloadSourceAddedEvent.java	(revision 34034)
@@ -0,0 +1,35 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.download;
+
+import java.util.EventObject;
+import java.util.Objects;
+
+import org.openstreetmap.josm.gui.download.DownloadSource;
+
+/**
+ * Event fired when a download source is added.
+ */
+public class DownloadSourceAddedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final DownloadSource<?> downloadSource;
+
+    /**
+     * Constructs a new {@code DownloadSourceAddedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param downloadSource new download source
+     */
+    public DownloadSourceAddedEvent(Object source, DownloadSource<?> downloadSource) {
+        super(source);
+        this.downloadSource = Objects.requireNonNull(downloadSource);
+    }
+
+    /**
+     * Returns the added download source.
+     * @return the added download source
+     */
+    public DownloadSource<?> getDownloadSource() {
+        return downloadSource;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/layer/LayerStateChangeEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/layer/LayerStateChangeEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/layer/LayerStateChangeEvent.java	(revision 34034)
@@ -0,0 +1,46 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.layer;
+
+import java.util.EventObject;
+import java.util.Objects;
+
+import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+
+/**
+ * Event fired when the "upload discouraged" (upload=no) state changes.
+ */
+public class LayerStateChangeEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final OsmDataLayer osmDataLayer;
+    private final boolean newValue;
+
+    /**
+     * Constructs a new {@code LayerStateChangeEvent}.
+     * @param source object on which the Event initially occurred
+     * @param layer data layer
+     * @param newValue new value of the "upload discouraged" (upload=no) state
+     */
+    public LayerStateChangeEvent(Object source, OsmDataLayer layer, boolean newValue) {
+        super(source);
+        this.osmDataLayer = Objects.requireNonNull(layer);
+        this.newValue = newValue;
+    }
+
+    /**
+     * Returns the data layer.
+     * @return the data layer
+     */
+    public final OsmDataLayer getDataLayer() {
+        return osmDataLayer;
+    }
+
+    /**
+     * Returns the "upload discouraged" (upload=no) state.
+     * @return the "upload discouraged" (upload=no) state
+     */
+    public final boolean isUploadDiscouraged() {
+        return newValue;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/layer/imagery/FilterChangedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/layer/imagery/FilterChangedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/layer/imagery/FilterChangedEvent.java	(revision 34034)
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.layer.imagery;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when imagery filters settings change.
+ */
+public class FilterChangedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code FilterChangedEvent}.
+     * @param source object on which the Event initially occurred
+     */
+    public FilterChangedEvent(Object source) {
+        super(source);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/mappaint/MapPaintStyleEntryUpdatedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/mappaint/MapPaintStyleEntryUpdatedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/mappaint/MapPaintStyleEntryUpdatedEvent.java	(revision 34034)
@@ -0,0 +1,32 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.mappaint;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when a map paint style entry is updated.
+ */
+public class MapPaintStyleEntryUpdatedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final int index;
+
+    /**
+     * Constructs a new {@code MapPaintStyleEntryUpdatedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param index entry index
+     */
+    public MapPaintStyleEntryUpdatedEvent(Object source, int index) {
+        super(source);
+        this.index = index;
+    }
+
+    /**
+     * Returns entry index.
+     * @return entry index
+     */
+    public final int getIndex() {
+        return index;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/mappaint/MapPaintStylesUpdatedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/mappaint/MapPaintStylesUpdatedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/mappaint/MapPaintStylesUpdatedEvent.java	(revision 34034)
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.mappaint;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when map paint styles are updated.
+ */
+public class MapPaintStylesUpdatedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code MapPaintStylesUpdatedEvent}.
+     * @param source object on which the Event initially occurred
+     */
+    public MapPaintStylesUpdatedEvent(Object source) {
+        super(source);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/preferences/imagery/ContentValidationEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/preferences/imagery/ContentValidationEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/preferences/imagery/ContentValidationEvent.java	(revision 34034)
@@ -0,0 +1,32 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.preferences.imagery;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when the validation status of the "add imagery" panel changes.
+ */
+public class ContentValidationEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final boolean isValid;
+
+    /**
+     * Constructs a new {@code ContentValidationEvent}.
+     * @param source object on which the Event initially occurred
+     * @param isValid true if the conditions required to close this panel are met
+     */
+    public ContentValidationEvent(Object source, boolean isValid) {
+        super(source);
+        this.isValid = isValid;
+    }
+
+    /**
+     * Determines if the conditions required to close this panel are met.
+     * @return true if the conditions required to close this panel are met
+     */
+    public final boolean isValid() {
+        return isValid;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/preferences/server/ProxyPreferenceChangedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/preferences/server/ProxyPreferenceChangedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/preferences/server/ProxyPreferenceChangedEvent.java	(revision 34034)
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.preferences.server;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when proxy settings are updated.
+ */
+public class ProxyPreferenceChangedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code ProxyPreferenceChangedEvent}.
+     * @param source object on which the Event initially occurred
+     */
+    public ProxyPreferenceChangedEvent(Object source) {
+        super(source);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/progress/OperationCancelledEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/progress/OperationCancelledEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/progress/OperationCancelledEvent.java	(revision 34034)
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.progress;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when a task is cancelled.
+ */
+public class OperationCancelledEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code OperationCancelledEvent}.
+     * @param source object on which the Event initially occurred
+     */
+    public OperationCancelledEvent(Object source) {
+        super(source);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/tagging/presets/TaggingPresetModifiedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/tagging/presets/TaggingPresetModifiedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/tagging/presets/TaggingPresetModifiedEvent.java	(revision 34034)
@@ -0,0 +1,20 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.tagging.presets;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when a tagging preset is modified.
+ */
+public class TaggingPresetModifiedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * Constructs a new {@code TaggingPresetModifiedEvent}.
+     * @param source object on which the Event initially occurred
+     */
+    public TaggingPresetModifiedEvent(Object source) {
+        super(source);
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/util/KeyPressedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/util/KeyPressedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/util/KeyPressedEvent.java	(revision 34034)
@@ -0,0 +1,33 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.util;
+
+import java.awt.event.KeyEvent;
+import java.util.EventObject;
+
+/**
+ * Event fired when a key is pressed.
+ */
+public class KeyPressedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final KeyEvent keyEvent;
+
+    /**
+     * Constructs a new {@code KeyPressedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param keyEvent the original Swing key event
+     */
+    public KeyPressedEvent(Object source, KeyEvent keyEvent) {
+        super(source);
+        this.keyEvent = keyEvent;
+    }
+
+    /**
+     * Returns the original Swing key event.
+     * @return the original Swing key event
+     */
+    public final KeyEvent getKeyEvent() {
+        return keyEvent;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/util/KeyReleasedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/util/KeyReleasedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/util/KeyReleasedEvent.java	(revision 34034)
@@ -0,0 +1,33 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.util;
+
+import java.awt.event.KeyEvent;
+import java.util.EventObject;
+
+/**
+ * Event fired when a key is released.
+ */
+public class KeyReleasedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final KeyEvent keyEvent;
+
+    /**
+     * Constructs a new {@code KeyReleasedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param keyEvent the original Swing key event
+     */
+    public KeyReleasedEvent(Object source, KeyEvent keyEvent) {
+        super(source);
+        this.keyEvent = keyEvent;
+    }
+
+    /**
+     * Returns the original Swing key event.
+     * @return the original Swing key event
+     */
+    public final KeyEvent getKeyEvent() {
+        return keyEvent;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/util/ModifierExChangedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/util/ModifierExChangedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/gui/util/ModifierExChangedEvent.java	(revision 34034)
@@ -0,0 +1,32 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.gui.util;
+
+import java.util.EventObject;
+
+/**
+ * Event fired when pressed extended modifier keys change is detected.
+ */
+public class ModifierExChangedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final int modifiers;
+
+    /**
+     * Constructs a new {@code ModifierExChangedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param modifiers the new extended modifiers
+     */
+    public ModifierExChangedEvent(Object source, int modifiers) {
+        super(source);
+        this.modifiers = modifiers;
+    }
+
+    /**
+     * Returns the new extended modifiers.
+     * @return the new extended modifiers
+     */
+    public final int getModifiers() {
+        return modifiers;
+    }
+}
Index: /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/io/OsmApiInitializedEvent.java
===================================================================
--- /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/io/OsmApiInitializedEvent.java	(revision 34034)
+++ /applications/editors/josm/plugins/eventbus/src/org/openstreetmap/josm/plugins/eventbus/io/OsmApiInitializedEvent.java	(revision 34034)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins.eventbus.io;
+
+import java.util.EventObject;
+
+import org.openstreetmap.josm.io.OsmApi;
+
+/**
+ * Event fired when the OSM API is initialized.
+ */
+public class OsmApiInitializedEvent extends EventObject {
+
+    private static final long serialVersionUID = 1L;
+
+    private final OsmApi osmApi;
+
+    /**
+     * Constructs a new {@code OsmApiInitializedEvent}.
+     * @param source object on which the Event initially occurred
+     * @param osmApi OSM API
+     */
+    public OsmApiInitializedEvent(Object source, OsmApi osmApi) {
+        super(source);
+        this.osmApi = osmApi;
+    }
+
+    /**
+     * Returns the OSM API.
+     * @return the OSM API
+     */
+    public final OsmApi getOsmApi() {
+        return osmApi;
+    }
+}
