diff --git a/plugin-metadata/.classpath b/plugin-metadata/.classpath
new file mode 100644
index 0000000..24166ba
--- /dev/null
+++ b/plugin-metadata/.classpath
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/plugin-metadata/.project b/plugin-metadata/.project
new file mode 100644
index 0000000..1f34d1f
--- /dev/null
+++ b/plugin-metadata/.project
@@ -0,0 +1,23 @@
+
+
+ plugin-metadata
+
+
+
+
+
+ org.eclipse.jdt.core.javabuilder
+
+
+
+
+ org.maven.ide.eclipse.maven2Builder
+
+
+
+
+
+ org.maven.ide.eclipse.maven2Nature
+ org.eclipse.jdt.core.javanature
+
+
diff --git a/plugin-metadata/.settings/org.eclipse.jdt.core.prefs b/plugin-metadata/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..2abf446
--- /dev/null
+++ b/plugin-metadata/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,12 @@
+#Mon Oct 06 19:06:04 CEST 2008
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+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.5
diff --git a/plugin-metadata/.settings/org.maven.ide.eclipse.prefs b/plugin-metadata/.settings/org.maven.ide.eclipse.prefs
new file mode 100644
index 0000000..db842c1
--- /dev/null
+++ b/plugin-metadata/.settings/org.maven.ide.eclipse.prefs
@@ -0,0 +1,8 @@
+#Mon Oct 06 19:02:01 CEST 2008
+activeProfiles=
+eclipse.preferences.version=1
+fullBuildGoals=process-test-resources
+includeModules=false
+resolveWorkspaceProjects=true
+resourceFilterGoals=process-resources resources\:testResources
+version=1
diff --git a/plugin-metadata/pom.xml b/plugin-metadata/pom.xml
new file mode 100644
index 0000000..46db411
--- /dev/null
+++ b/plugin-metadata/pom.xml
@@ -0,0 +1,33 @@
+
+ 4.0.0
+ org.synyx.plugin
+ plugin-metadata
+ 0.1-SNAPSHOT
+
+
+
+ org.synyx.plugin
+ plugin-core
+ 0.1-SNAPSHOT
+
+
+
+ commons-lang
+ commons-lang
+ 2.4
+
+
+
+
+
+
+ maven-compiler-plugin
+
+ 1.5
+ 1.5
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugin-metadata/src/main/java/org/synyx/plugin/metadata/AbstractMetadataBasedPlugin.java b/plugin-metadata/src/main/java/org/synyx/plugin/metadata/AbstractMetadataBasedPlugin.java
new file mode 100644
index 0000000..78a5b8c
--- /dev/null
+++ b/plugin-metadata/src/main/java/org/synyx/plugin/metadata/AbstractMetadataBasedPlugin.java
@@ -0,0 +1,52 @@
+package org.synyx.plugin.metadata;
+
+import org.synyx.plugin.core.Plugin;
+
+
+/**
+ * Abstract base class for plugins based on {@code PluginMetadata}. Plugins
+ * based on this class can be selected from the {@code PluginRegistry} via an
+ * instance of {@code PluginMetadata}. Therefore you can regard this as a role
+ * model implementation of a base class for certain delimiter implmentations.
+ *
+ * @author Oliver Gierke - gierke@synyx.de
+ */
+public abstract class AbstractMetadataBasedPlugin implements
+ Plugin, MetadataProvider {
+
+ private PluginMetadata metadata;
+
+
+ /**
+ * Creates a new instance of {@code AbstractMetadataBasedPlugin}.
+ *
+ * @param name
+ * @param version
+ */
+ public AbstractMetadataBasedPlugin(String name, String version) {
+
+ this.metadata = new SimplePluginMetadata(name, version);
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.synyx.minos.core.plugin.Plugin#supports(java.lang.Object)
+ */
+ public boolean supports(PluginMetadata delimiter) {
+
+ return getMetadata().equals(delimiter);
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.synyx.minos.core.plugin.MetadataProvider#getMetadata()
+ */
+ public PluginMetadata getMetadata() {
+
+ return metadata;
+ }
+}
diff --git a/plugin-metadata/src/main/java/org/synyx/plugin/metadata/MetadataProvider.java b/plugin-metadata/src/main/java/org/synyx/plugin/metadata/MetadataProvider.java
new file mode 100644
index 0000000..23ec6d0
--- /dev/null
+++ b/plugin-metadata/src/main/java/org/synyx/plugin/metadata/MetadataProvider.java
@@ -0,0 +1,17 @@
+package org.synyx.plugin.metadata;
+
+/**
+ * Interface for plugins providing metadata information. Usually the plugins
+ * will implement this interface themselves.
+ *
+ * @author Oliver Gierke - gierke@synyx.de
+ */
+public interface MetadataProvider {
+
+ /**
+ * Returns the plugins metadata.
+ *
+ * @return the plugins metadata
+ */
+ public PluginMetadata getMetadata();
+}
diff --git a/plugin-metadata/src/main/java/org/synyx/plugin/metadata/PluginMetadata.java b/plugin-metadata/src/main/java/org/synyx/plugin/metadata/PluginMetadata.java
new file mode 100644
index 0000000..0126d55
--- /dev/null
+++ b/plugin-metadata/src/main/java/org/synyx/plugin/metadata/PluginMetadata.java
@@ -0,0 +1,26 @@
+package org.synyx.plugin.metadata;
+
+/**
+ * Basic interface to define a set of metadata information for plugins.
+ *
+ * @author Oliver Gierke - gierke@synyx.de
+ */
+public interface PluginMetadata {
+
+ /**
+ * Returns a unique plugin name. Plugins return a metadata implementation
+ * have to ensure uniqueness of this name.
+ *
+ * @return the name of the plugin
+ */
+ String getName();
+
+
+ /**
+ * Returns the plugin version. This allows rudimentary versioning
+ * possibilities.
+ *
+ * @return the version of the plugin
+ */
+ String getVersion();
+}
diff --git a/plugin-metadata/src/main/java/org/synyx/plugin/metadata/SimplePluginMetadata.java b/plugin-metadata/src/main/java/org/synyx/plugin/metadata/SimplePluginMetadata.java
new file mode 100644
index 0000000..4d1bfc9
--- /dev/null
+++ b/plugin-metadata/src/main/java/org/synyx/plugin/metadata/SimplePluginMetadata.java
@@ -0,0 +1,97 @@
+package org.synyx.plugin.metadata;
+
+import org.apache.commons.lang.ObjectUtils;
+import org.apache.commons.lang.StringUtils;
+
+
+/**
+ * Value object style implementation of {@code PluginMetadata}.
+ *
+ * @author Oliver Gierke - gierke@synyx.de
+ */
+public class SimplePluginMetadata implements PluginMetadata {
+
+ private String name;
+ private String version;
+
+
+ /**
+ * Creates a new instance of {@code SimplePluginMetadata}.
+ *
+ * @param name
+ * @param version
+ */
+ public SimplePluginMetadata(String name, String version) {
+
+ this.name = name;
+ this.version = version;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.synyx.minos.core.plugin.PluginMetadata#getName()
+ */
+ public String getName() {
+
+ return name;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see com.synyx.minos.core.plugin.PluginMetadata#getVersion()
+ */
+ public String getVersion() {
+
+ return version;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#toString()
+ */
+ @Override
+ public String toString() {
+
+ return String.format("%s:%s", getName(), getVersion());
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#equals(java.lang.Object)
+ */
+ @Override
+ public boolean equals(Object obj) {
+
+ if (!(obj instanceof PluginMetadata)) {
+ return false;
+ }
+
+ PluginMetadata that = (PluginMetadata) obj;
+
+ boolean sameName = StringUtils.equals(this.getName(), that.getName());
+ boolean sameVersion =
+ StringUtils.equals(this.getName(), that.getName());
+
+ return sameName && sameVersion;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see java.lang.Object#hashCode()
+ */
+ @Override
+ public int hashCode() {
+
+ return ObjectUtils.hashCode(name) + ObjectUtils.hashCode(version);
+ }
+}