catch up with branch development

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.abstractstatemachine.feature/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.abstractstatemachine.feature/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.abstractstatemachine.feature/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.abstractstatemachine.feature/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.abstractstatemachine.feature/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.abstractstatemachine.feature/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.abstractstatemachine.feature/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.abstractstatemachine.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.abstractstatemachine.feature/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.abstractstatemachine/.settings/com.vaadin.integration.eclipse.prefs b/org.eclipse.osbp.abstractstatemachine/.settings/com.vaadin.integration.eclipse.prefs
new file mode 100644
index 0000000..e1173bc
--- /dev/null
+++ b/org.eclipse.osbp.abstractstatemachine/.settings/com.vaadin.integration.eclipse.prefs
@@ -0,0 +1,2 @@
+com.vaadin.integration.eclipse.previousCompileAction=widgetset
+eclipse.preferences.version=1
diff --git a/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.bpmn2.modeler.core.prefs b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.bpmn2.modeler.core.prefs
new file mode 100644
index 0000000..4bffcea
--- /dev/null
+++ b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.bpmn2.modeler.core.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+target.runtime=org.jboss.runtime.jbpm5
diff --git a/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.core.resources.prefs b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.core.resources.prefs
new file mode 100644
index 0000000..99f26c0
--- /dev/null
+++ b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.core.resources.prefs
@@ -0,0 +1,2 @@
+eclipse.preferences.version=1
+encoding/<project>=UTF-8
diff --git a/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.jdt.core.prefs b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..a698e59
--- /dev/null
+++ b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.8
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.8
diff --git a/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.m2e.core.prefs b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.m2e.core.prefs
new file mode 100644
index 0000000..f897a7f
--- /dev/null
+++ b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.m2e.core.prefs
@@ -0,0 +1,4 @@
+activeProfiles=
+eclipse.preferences.version=1
+resolveWorkspaceProjects=true
+version=1
diff --git a/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.pde.core.prefs b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.pde.core.prefs
new file mode 100644
index 0000000..f29e940
--- /dev/null
+++ b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.pde.core.prefs
@@ -0,0 +1,3 @@
+eclipse.preferences.version=1
+pluginProject.extensions=false
+resolve.requirebundle=false
diff --git a/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.xtend.core.Xtend.prefs b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.xtend.core.Xtend.prefs
new file mode 100644
index 0000000..19e3115
--- /dev/null
+++ b/org.eclipse.osbp.abstractstatemachine/.settings/org.eclipse.xtend.core.Xtend.prefs
@@ -0,0 +1,11 @@
+//outlet.DEFAULT_OUTPUT.sourceFolder.src/test/java.directory=src/test/generated-sources/xtend
+BuilderConfiguration.is_project_specific=true
+eclipse.preferences.version=1
+is_project_specific=true
+outlet.DEFAULT_OUTPUT.hideLocalSyntheticVariables=true
+outlet.DEFAULT_OUTPUT.installDslAsPrimarySource=false
+outlet.DEFAULT_OUTPUT.sourceFolder.emf-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.src.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.sourceFolder.xtend-gen.directory=xtend-gen
+outlet.DEFAULT_OUTPUT.userOutputPerSourceFolder=true
diff --git a/org.eclipse.osbp.abstractstatemachine/META-INF/MANIFEST.MF b/org.eclipse.osbp.abstractstatemachine/META-INF/MANIFEST.MF
index 14c1dee..d147823 100644
--- a/org.eclipse.osbp.abstractstatemachine/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.abstractstatemachine/META-INF/MANIFEST.MF
@@ -16,8 +16,12 @@
  org.eclipse.osgi.services;bundle-version="3.5.100",
  com.vaadin.shared;bundle-version="[7.7.6,7.8.0)",
  org.eclipse.osbp.fork.jpos;bundle-version="[1.14.0,1.15.0)",
- org.eclipse.osbp.jpa.services;bundle-version="0.9.0"
-Import-Package: javax.servlet;version="2.6.0",
+ org.eclipse.osbp.jpa.services;bundle-version="0.9.0",
+ org.eclipse.e4.ui.model.workbench,
+ org.eclipse.osbp.vaadin.addons.keyevents;bundle-version="0.9.0",
+ org.jsoup;bundle-version="1.8.3"
+Import-Package: com.vaadin.ui,
+ javax.servlet;version="2.6.0",
  javax.servlet.http;version="2.6.0",
  org.eclipse.e4.core.contexts,
  org.eclipse.osbp.preferences;version="0.9.0",
diff --git a/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractDataProvider.java b/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractDataProvider.java
index 4f16f6f..a51d886 100644
--- a/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractDataProvider.java
+++ b/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractDataProvider.java
@@ -58,7 +58,11 @@
 
 	@Override
 	public Boolean find(IDataProvider.Provider listener, String dtoAlias, String fieldName, Object search) {
-		return find(listener, dtoAlias, new Query(new LCompare.Equal(fieldName, search)));
+		Boolean retval = find(listener, dtoAlias, new Query(new LCompare.Equal(fieldName, search)));
+		if(!retval) {
+			LOGGER.error("find for {} failed", search);
+		}
+		return retval;
 	}
 
 	@Override
diff --git a/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractPeripheralService.java b/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractPeripheralService.java
index 5edf050..02c61a6 100644
--- a/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractPeripheralService.java
+++ b/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractPeripheralService.java
@@ -13,7 +13,6 @@
  */
 package org.eclipse.osbp.abstractstatemachine;
 
-import java.awt.image.BufferedImage;
 import java.io.File;
 import java.io.IOException;
 import java.net.MalformedURLException;
@@ -31,10 +30,16 @@
 import org.eclipse.osbp.ui.api.pos.ISignatureListener;
 import org.eclipse.osbp.ui.api.pos.IZVTTransactionData;
 import org.eclipse.osbp.ui.api.pos.PenData;
+import org.eclipse.osbp.ui.api.statemachine.IBeeper;
 import org.eclipse.osbp.ui.api.statemachine.IPeripheral;
 import org.eclipse.osbp.ui.api.statemachine.IStateMachine;
+import org.eclipse.osbp.ui.api.themes.IThemeResourceService.ThemeResourceType;
 import org.osgi.framework.FrameworkUtil;
 
+import com.vaadin.server.ExternalResource;
+import com.vaadin.ui.Audio;
+import com.vaadin.ui.Video;
+
 import jpos.BaseControl;
 import jpos.CashDrawer;
 import jpos.CashDrawerConst;
@@ -49,7 +54,6 @@
 import jpos.config.JposEntryRegistry;
 import jpos.epson.EpsonLineDisplayConst;
 import jpos.epson.EpsonPOSPrinterConst;
-import jpos.events.ErrorEvent;
 import jpos.events.ErrorListener;
 import jpos.events.OutputCompleteEvent;
 import jpos.events.OutputCompleteListener;
@@ -64,8 +68,12 @@
  * PeripheralService is a bridge between javaPOS and the state machine
  * participant.
  */
-public abstract class AbstractPeripheralService extends AbstractStateMachineParticipant
-		implements IPeripheral, IPeripheral.Command, StatusUpdateListener, ErrorListener, OutputCompleteListener, ISignatureListener {
+public abstract class AbstractPeripheralService extends AbstractStateMachineParticipant	implements IPeripheral, IPeripheral.Command, StatusUpdateListener, ErrorListener, OutputCompleteListener, ISignatureListener {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 5490886401274716894L;
 
 	/** The devices. */
 	protected Map<String, BaseControl> devices = new HashMap<>();
@@ -88,7 +96,27 @@
 	/** is init done correctly? */
 	protected boolean initDone = false;
 	
+	/** The pen data supplied by signature pad. */
 	private List<PenData> penData = new ArrayList<>();
+	
+	/** The beeper. */
+	protected IBeeper beeper;
+	
+	/** The audio. */
+	protected Audio audio;
+	
+	/** The video. */
+	protected Video video;
+	
+	@Override
+	public boolean equals(Object obj) {
+		return super.equals(obj);
+	}
+
+	@Override
+	public int hashCode() {
+		return super.hashCode();
+	}
 
 	/*
 	 * (non-Javadoc)
@@ -111,7 +139,7 @@
 	 * 
 	 * @see foodmartdialogdslplugin.AbstractStateMachineParticipant#init()
 	 */
-	@Override
+	@Override 
 	public void init() {
 		LOGGER.debug("Library path=" + System.getProperty("java.library.path"));
 		// load all names of configured devices, instantiate and cache it
@@ -135,11 +163,6 @@
 		SimpleServiceManager serviceManager = new SimpleServiceManager(jposProperties);
 		serviceManager.getEntryRegistry().load();
 		props = serviceManager.getEntryRegistry();
-		if (props != null && props.getSize() != 0) {
-			initDone = initDevices();
-		} else {
-			LOGGER.debug("no devices are configured in file:{}", configFile);
-		}
 	}
 
 	/*
@@ -904,7 +927,7 @@
 	 * @see jpos.events.ErrorListener#errorOccurred(jpos.events.ErrorEvent)
 	 */
 	@Override
-	public void errorOccurred(ErrorEvent e) { // NOSONAR
+	public void errorOccurred(jpos.events.ErrorEvent e) { // NOSONAR
 		switch (e.getErrorCodeExtended()) {
 		case POSPrinterConst.JPOS_EPTR_COVER_OPEN:
 			if (statemachine != null) {
@@ -1203,7 +1226,7 @@
 	public void setSignatureOpen(String dummy) {
 		if(POSServiceBinder.getSignatureService() != null) {
 			if(POSServiceBinder.getSignatureService().openTablet(statemachine.getBlobService())) {
-				statemachine.schedule(statemachine, 500L, new MessageEvent(EventType.TRIGGER, "onSignaturePadOpen"));
+				statemachine.schedule(statemachine, 500, new MessageEvent(EventType.TRIGGER, "onSignaturePadOpen"));
 			}
 		}
 	}
@@ -1283,4 +1306,24 @@
 	public String getSignatureBlob() {
 		return POSServiceBinder.getSignatureService().getSignatureBlob(statemachine.getSceenWidth(), statemachine.getScreenHeight());
 	}
+
+    public void setBeeper(String parameters) {
+    	Integer duration;
+    	Integer frequency;
+		String[] parts = parameters.split("\\|");
+		duration = Integer.parseInt(parts[0]);
+		frequency = Integer.parseInt(parts[1]);
+		beeper.beep(duration, frequency);
+    }
+
+    public void setPlayer(String name) {
+    	video.setSources(statemachine.getThemeResourceService().getThemeResource(name, ThemeResourceType.VIDEO));
+		video.play();
+    }
+
+    public void setSound(String name) { 
+    	audio.setSources(statemachine.getThemeResourceService().getThemeResource(name, ThemeResourceType.SOUND));
+//    	audio.setSources(new ExternalResource("http://www.podtrac.com/pts/redirect.mp3?http://piledriver.hipcast.com/deluge/WrestleManiaX7OSWReview55.mp3"));
+    	audio.play();
+    }
 }
diff --git a/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractStateMachine.java b/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractStateMachine.java
index b79a6a9..2436b1e 100644
--- a/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractStateMachine.java
+++ b/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractStateMachine.java
@@ -20,17 +20,18 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
-import java.util.Timer;
-import java.util.TimerTask;
 import java.util.concurrent.CopyOnWriteArraySet;
 
 import javax.annotation.PreDestroy;
+import javax.swing.Timer;
 
 import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 import org.eclipse.osbp.dsl.common.datatypes.IDto;
 import org.eclipse.osbp.runtime.common.filter.IQuery;
 import org.eclipse.osbp.runtime.common.session.ISession;
@@ -49,13 +50,19 @@
 import org.eclipse.osbp.ui.api.user.IUser;
 import org.eclipse.osbp.utils.vaadin.MessageDialog;
 import org.eclipse.osbp.utils.vaadin.YesNoDialog;
+import org.eclipse.osbp.vaadin.addons.keyevents.KeyEventExtension;
 import org.joda.time.DateTime;
 import org.joda.time.DateTimeZone;
 import org.slf4j.Logger;
 
+import com.vaadin.event.ShortcutAction.KeyCode;
 import com.vaadin.server.Page;
 import com.vaadin.server.WebBrowser;
+import com.vaadin.ui.Component;
+import com.vaadin.ui.HasComponents;
+import com.vaadin.ui.Panel;
 import com.vaadin.ui.UI;
+import com.vaadin.ui.VerticalLayout;
 
 public abstract class AbstractStateMachine implements IStateMachine, IMessageRequester.ClickRecipient {
 	private static final String ENABLED = "Enabled";
@@ -66,7 +73,6 @@
 	protected Map<String, MessageDialog> messageDialogs = new HashMap<>();
 	protected Map<String, YesNoDialog> yesnoDialogs = new HashMap<>();
 	protected WebBrowser webBrowser = Page.getCurrent().getWebBrowser();
-	protected Timer timer;
 	protected IUser user;
 	protected Locale locale;
 	protected IDSLMetadataService dslMetadataService;
@@ -77,6 +83,78 @@
 	protected SelectableChannel channel;
 	protected String lastTrigger;
 	protected IEclipseContext eclipseContext;
+	protected Map<Integer, String> keyMapper = new HashMap<Integer, String>() {
+		private static final long serialVersionUID = 8801421284339992078L;
+		{
+			put(KeyCode.BACKSPACE, "BACKSPACE");
+			put(KeyCode.TAB, "TAB");
+			put(KeyCode.ENTER, "ENTER");
+			put(KeyCode.ESCAPE, "ESC");
+			put(KeyCode.PAGE_UP, "PGUP");
+			put(KeyCode.PAGE_DOWN, "PGDOWN");
+			put(KeyCode.END, "END");
+			put(KeyCode.HOME, "HOME");
+			put(KeyCode.ARROW_LEFT, "LEFTARROW");
+			put(KeyCode.ARROW_UP, "UPARROW");
+			put(KeyCode.ARROW_RIGHT, "RIGHTARROW");
+			put(KeyCode.ARROW_DOWN, "DOWNARROW");
+			put(KeyCode.INSERT, "INSERT");
+			put(KeyCode.DELETE, "DELETE");
+			put(KeyCode.F1, "F1");
+			put(KeyCode.F2, "F2");
+			put(KeyCode.F3, "F3");
+			put(KeyCode.F4, "F4");
+			put(KeyCode.F5, "F5");
+			put(KeyCode.F6, "F6");
+			put(KeyCode.F7, "F7");
+			put(KeyCode.F8, "F8");
+			put(KeyCode.F9, "F9");
+			put(KeyCode.F10, "F10");
+			put(KeyCode.F11, "F11");
+			put(KeyCode.F12, "F12");
+		}
+	};
+	private KeyEventExtension extension = null;
+
+	@Override
+	public void installKeyEventConsumer(VerticalLayout layout) {
+		extension = KeyEventExtension.addTo(layout);
+		extension.setCallback(this::keyPressed);
+	}
+
+	@Override
+	public void uninstallKeyEventConsumer() {
+		if(extension != null) {
+			extension.remove();
+			extension = null;
+		}
+	}
+
+	protected Component findById(HasComponents root, String id) {
+		Iterator<Component> iterate = root.iterator();
+		while (iterate.hasNext()) {
+			Component c = iterate.next();
+			if (id.equals(c.getId())) {
+				return c;
+			}
+			if (c instanceof HasComponents) {
+				Component cc = findById((HasComponents) c, id);
+				if (cc != null)
+					return cc;
+			}
+		}
+		return null;
+	}
+
+	protected void keyPressed(org.eclipse.osbp.vaadin.addons.keyevents.client.Event event) {
+		if (!Character.isISOControl(event.charCode)) {
+			processEvent(this, new MessageEvent(EventType.KEYBOARD, Character.toString((char) event.charCode)));
+		} else {
+			 if (keyMapper.containsKey(event.charCode)) {
+				 processEvent(this, new MessageEvent(EventType.FUNCTIONALKEYBOARD, keyMapper.get(event.charCode)));
+			 }
+		}
+	}
 
 	private void addEventProvider(IEventSource.Enabler listener) {
 		enablerList.add(listener);
@@ -467,8 +545,6 @@
 
 	@PreDestroy
 	void destroy() {
-		timer.cancel();
-		timer = null;
 	}
 
 	@Override
@@ -482,31 +558,12 @@
 	}
 
 	@Override
-	public void schedule(IStateMachine statemachine, long milliseconds, MessageEvent event) {
-		if (timer == null) {
-			timer = new Timer();
-		} else {
-			timer.cancel();
-			timer.purge();
-			timer = new Timer();
-		}
-		timer.schedule(new EventSourceTask(statemachine, event), milliseconds);
-	}
-
-	class EventSourceTask extends TimerTask {
-		private IStateMachine statemachine;
-		private MessageEvent event;
-
-		public EventSourceTask(IStateMachine statemachine, MessageEvent event) {
-			this.statemachine = statemachine;
-			this.event = event;
-		}
-
-		@Override
-		public void run() {
-			if (UI.getCurrent().isAttached())
-				statemachine.processEvent(statemachine, event);
-		}
+	public void schedule(IStateMachine statemachine, int milliseconds, MessageEvent event) {
+		Timer timer = new Timer(milliseconds, action -> {
+			statemachine.processEvent(statemachine, event);
+		});
+		timer.setRepeats(false);
+		timer.start();
 	}
 
 	/**
diff --git a/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractStateMachineParticipant.java b/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractStateMachineParticipant.java
index a323000..72dcc19 100644
--- a/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractStateMachineParticipant.java
+++ b/org.eclipse.osbp.abstractstatemachine/src/org/eclipse/osbp/abstractstatemachine/AbstractStateMachineParticipant.java
@@ -34,15 +34,25 @@
 
 public abstract class AbstractStateMachineParticipant implements
 		IStateMachineParticipant {
-
+	private static final long serialVersionUID = -7670617914357429160L;
 	/** The LOGGER. */
 	protected static final Logger LOGGER = LoggerFactory
 			.getLogger(AbstractStateMachineParticipant.class);
 	protected PropertyChangeSupport pcs = new PropertyChangeSupport(this);
-	protected IStateMachine statemachine;
+	protected transient IStateMachine statemachine;
 	protected Locale locale;
 
-	public void addPropertyChangeListener(PropertyChangeListener listener) {
+	@Override
+	public boolean equals(Object obj) {
+		return super.equals(obj);
+	}
+
+	@Override
+	public int hashCode() {
+		return super.hashCode();
+	}
+
+	void addPropertyChangeListener(PropertyChangeListener listener) {
 		pcs.addPropertyChangeListener(listener);
 	}