Index: /gssim/trunk/db/gssim/db/dao/data/ApplicationProperty.java
===================================================================
--- /gssim/trunk/db/gssim/db/dao/data/ApplicationProperty.java	(revision 360)
+++ /gssim/trunk/db/gssim/db/dao/data/ApplicationProperty.java	(revision 360)
@@ -0,0 +1,71 @@
+package gssim.db.dao.data;
+
+public class ApplicationProperty {
+	
+	protected Integer version;
+	protected String key;
+	protected String value;
+	
+	public Integer getVersion() {
+		return version;
+	}
+	public void setVersion(Integer version) {
+		this.version = version;
+	}
+	public String getKey() {
+		return key;
+	}
+	public void setKey(String key) {
+		this.key = key;
+	}
+	public String getValue() {
+		return value;
+	}
+	public void setValue(String value) {
+		this.value = value;
+	}
+	
+	@Override
+	public int hashCode() {
+		final int prime = 31;
+		int result = 1;
+		result = prime * result
+				+ ((version == null) ? 0 : version.hashCode());
+		result = prime * result + ((key == null) ? 0 : key.hashCode());
+		result = prime * result + ((value == null) ? 0 : value.hashCode());
+		return result;
+	}
+	
+	@Override
+	public boolean equals(Object obj) {
+		if (this == obj)
+			return true;
+		if (obj == null)
+			return false;
+		if (getClass() != obj.getClass())
+			return false;
+		ApplicationProperty other = (ApplicationProperty) obj;
+		if (version == null) {
+			if (other.version != null)
+				return false;
+		} else if (!version.equals(other.version))
+			return false;
+		if (key == null) {
+			if (other.key != null)
+				return false;
+		} else if (!key.equals(other.key))
+			return false;
+		if (value == null) {
+			if (other.value != null)
+				return false;
+		} else if (!value.equals(other.value))
+			return false;
+		return true;
+	}
+	
+	@Override
+	public String toString() {
+		return "ApplicationProperty [version=" + version + ", key=" + key
+				+ ", value=" + value + "]";
+	}
+}
Index: /gssim/trunk/db/gssim/db/dao/ApplicationPropertyDAO.java
===================================================================
--- /gssim/trunk/db/gssim/db/dao/ApplicationPropertyDAO.java	(revision 360)
+++ /gssim/trunk/db/gssim/db/dao/ApplicationPropertyDAO.java	(revision 360)
@@ -0,0 +1,7 @@
+package gssim.db.dao;
+
+import gssim.db.dao.data.ApplicationProperty;
+
+public interface ApplicationPropertyDAO extends DAOInterface<ApplicationProperty>{
+
+}
Index: /gssim/trunk/db/gssim/db/mysql/ApplicationPropertyDAO.java
===================================================================
--- /gssim/trunk/db/gssim/db/mysql/ApplicationPropertyDAO.java	(revision 360)
+++ /gssim/trunk/db/gssim/db/mysql/ApplicationPropertyDAO.java	(revision 360)
@@ -0,0 +1,174 @@
+package gssim.db.mysql;
+
+import gssim.db.dao.data.ApplicationProperty;
+import gssim.db.find.Finder;
+import gssim.db.utils.PreparedStatementAdapter;
+import gssim.db.utils.ResultSetAdapter;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.logging.LogFactory;
+
+import com.mysql.jdbc.NotImplemented;
+
+public class ApplicationPropertyDAO extends AbstractDAO implements
+		gssim.db.dao.TextPropertyDAO {
+
+	protected ApplicationPropertyDAO(Connection conn) throws SQLException {
+		super(conn);
+		log = LogFactory.getLog(ApplicationPropertyDAO.class);
+		setRelationName("application_property");
+	}
+
+	@Override
+	protected PreparedStatementAdapter createDeleteStmt() throws SQLException {
+		return null;
+	}
+
+	@Override
+	protected PreparedStatementAdapter createFindStmt() throws SQLException {
+		String sql = "SELECT * FROM application_property ap WHERE"
+				+ " (ap.key = ?) AND "
+				+ " ap.version = (SELECT MAX(ap2.version) "
+				+ " FROM application_property ap2 GROUP BY ap2.key "
+				+ " HAVING (ap2.key = ?))";
+		PreparedStatementAdapter stmt = new PreparedStatementAdapter(this
+				.getConnection().prepareStatement(sql));
+		return stmt;
+	}
+
+	@Override
+	protected PreparedStatementAdapter createInsertStmt() throws SQLException {
+		String sql = "INSERT INTO application_property(key, value) VALUES(?, ?)";
+		PreparedStatementAdapter stmt = new PreparedStatementAdapter(this
+				.getConnection().prepareStatement(sql));
+
+		return stmt;
+	}
+
+	@Override
+	protected PreparedStatementAdapter createSelectStmt() throws SQLException {
+		String sql = "SELECT * FROM application_property WHERE version = ? AND key = ?";
+		PreparedStatementAdapter stmt = new PreparedStatementAdapter(this
+				.getConnection().prepareStatement(sql));
+		return stmt;
+	}
+
+	@Override
+	protected PreparedStatementAdapter createUpdateStmt() throws SQLException {
+		return null;
+	}
+
+	@Override
+	public boolean delete(ApplicationProperty obj, boolean commit) throws SQLException {
+		throw new NotImplemented();
+	}
+
+	@Override
+	public void fillObjectFromResultSet(ApplicationProperty obj, ResultSet result)
+			throws SQLException {
+		throw new NotImplemented();
+
+	}
+
+	@Override
+	public int fillStatementWithObject(PreparedStatement stmt,
+			ApplicationProperty obj, int offset) throws SQLException {
+		throw new NotImplemented();
+	}
+
+	@Override
+	public List<ApplicationProperty> find(Finder finder) throws SQLException {
+
+		PreparedStatementAdapter stmt = getFindStmt();
+		List<ApplicationProperty> list = new ArrayList<ApplicationProperty>();
+
+		if (finder.getString("key") == null) throw new SQLException("Key cannot be null")
+		
+		stmt.setInt(1, finder.getString("key"));
+		stmt.setInt(2, finder.getString("key"));
+
+		ResultSetAdapter result = new ResultSetAdapter(stmt.executeQuery());
+
+		while (result.next()) {
+			ApplicationProperty obj = new ApplicationProperty();
+
+			Integer configId = result.getIntObj("version");
+			String key = result.getString("key");
+			String value = result.getString("value");
+
+			obj.setVersion(version);
+			obj.setKey(key);
+			obj.setValue(value);
+
+			list.add(obj);
+		}
+
+		return list;
+	}
+
+	@Override
+	public int insert(ApplicationProperty obj, boolean commit) throws SQLException {
+
+		PreparedStatementAdapter stmt = getInsertStmt();
+
+		stmt.setString(1, obj.getKey());
+		stmt.setString(2, obj.getValue());
+
+		int result = stmt.executeUpdate();
+
+		if (result == 1) {
+			if (commit)
+				commit();
+			logSuccess("insert");
+		} else
+			logError("insert", result, obj);
+
+		return result;
+	}
+
+	@Override
+	public int[] insertBatch(List<ApplicationProperty> objList, boolean commit)
+			throws SQLException {
+		throw new NotImplemented();
+	}
+
+	@Override
+	public TextProperty select(ApplicationProperty obj) throws SQLException {
+
+		PreparedStatementAdapter stmt = getSelectStmt();
+		stmt.setInt(1, obj.getVersion());
+		stmt.setString(2, obj.getKey());
+		ResultSetAdapter result = new ResultSetAdapter(stmt.executeQuery());
+
+		result.next();
+		boolean first = result.isFirst();
+		boolean last = result.isLast();
+
+		if (first && last) {
+
+			obj.setValue(result.getString("value"));
+			return obj;
+		}
+
+		// no reservation found with specified task_id and unit_id
+		if (!first && !last) {
+			return null;
+		}
+
+		// no idea how this may happen (only if id is not primary key)
+		throw new SQLException("Select operation in relation "
+				+ getRelationName() + " returned more than one record");
+	}
+
+	@Override
+	public boolean update(ApplicationProperty obj, boolean commit) throws SQLException {
+		throw new NotImplemented();
+	}
+
+}
Index: /gssim/trunk/db/gssim/db/find/Finder.java
===================================================================
--- /gssim/trunk/db/gssim/db/find/Finder.java	(revision 5)
+++ /gssim/trunk/db/gssim/db/find/Finder.java	(revision 360)
@@ -240,4 +240,13 @@
 		return finder;
 	}
+	
+	public static Finder getApplicationPropertyFinder(String key) {
+
+		Finder finder = new Finder();
+
+		finder.setCriteria("key", key);
+
+		return finder;
+	}
 
 	public String getString(String key) {
