diff --git a/broker/src/asapo_broker/database/database.go b/broker/src/asapo_broker/database/database.go
index 5512b8ee8bb3a4a59e0584b143dbd9a3338e902f..81cbb2d54e48345558f62f1a3c090a1021a9eefc 100644
--- a/broker/src/asapo_broker/database/database.go
+++ b/broker/src/asapo_broker/database/database.go
@@ -1,7 +1,7 @@
 package database
 
 type Agent interface {
-	ProcessRequest(db_name string, group_id string, op string, id int) ([]byte, error)
+	ProcessRequest(db_name string, group_id string, op string, extra string) ([]byte, error)
 	Connect(string) error
 	Close()
 	Copy() Agent
diff --git a/broker/src/asapo_broker/database/mock_database.go b/broker/src/asapo_broker/database/mock_database.go
index eaa75619237b2af2e573bf72813d3f003b8c7db8..97570e51bf5e75c19fd9daf2f7ec4162173f4725 100644
--- a/broker/src/asapo_broker/database/mock_database.go
+++ b/broker/src/asapo_broker/database/mock_database.go
@@ -24,7 +24,7 @@ func (db *MockedDatabase) Copy() Agent {
 	return db
 }
 
-func (db *MockedDatabase) ProcessRequest(db_name string, group_id string, op string, id int) (answer []byte, err error) {
-	args := db.Called(db_name, group_id, op, id)
+func (db *MockedDatabase) ProcessRequest(db_name string, group_id string, op string, extra_param string) (answer []byte, err error) {
+	args := db.Called(db_name, group_id, op, extra_param)
 	return args.Get(0).([]byte), args.Error(1)
 }
diff --git a/broker/src/asapo_broker/database/mongodb.go b/broker/src/asapo_broker/database/mongodb.go
index bf46a66a83045e5b4bd3add146a87b635268a870..b66726212473e621281f377899551a2b191e3b8f 100644
--- a/broker/src/asapo_broker/database/mongodb.go
+++ b/broker/src/asapo_broker/database/mongodb.go
@@ -177,7 +177,6 @@ func (db *Mongodb) incrementField(dbname string, group_id string, max_ind int, r
 }
 
 func (db *Mongodb) GetRecordByIDRow(dbname string, id int, returnID bool) ([]byte, error) {
-
 	var res map[string]interface{}
 	q := bson.M{"_id": id}
 	c := db.session.DB(dbname).C(data_collection_name)
@@ -201,7 +200,11 @@ func (db *Mongodb) GetRecordByIDRow(dbname string, id int, returnID bool) ([]byt
 	return utils.MapToJson(&res)
 }
 
-func (db *Mongodb) GetRecordByID(dbname string, group_id string, id int, returnID bool, reset bool) ([]byte, error) {
+func (db *Mongodb) GetRecordByID(dbname string, group_id string, id_str string, returnID bool, reset bool) ([]byte, error) {
+	id, err := strconv.Atoi(id_str)
+	if err != nil {
+		return nil, err
+	}
 
 	if err := db.checkDatabaseOperationPrerequisites(dbname, group_id); err != nil {
 		return nil, err
@@ -339,12 +342,16 @@ func (db *Mongodb) ResetCounter(db_name string, group_id string) ([]byte, error)
 	return []byte(""), err
 }
 
-func (db *Mongodb) getMeta(dbname string, id int) ([]byte, error) {
+func (db *Mongodb) getMeta(dbname string, id_str string) ([]byte, error) {
+	id, err := strconv.Atoi(id_str)
+	if err != nil {
+		return nil, err
+	}
 
 	var res map[string]interface{}
 	q := bson.M{"_id": id}
 	c := db.session.DB(dbname).C(meta_collection_name)
-	err := c.Find(q).One(&res)
+	err = c.Find(q).One(&res)
 	if err != nil {
 		log_str := "error getting meta with id " + strconv.Itoa(id) + " for " + dbname + " : " + err.Error()
 		logger.Debug(log_str)
@@ -356,14 +363,14 @@ func (db *Mongodb) getMeta(dbname string, id int) ([]byte, error) {
 	return utils.MapToJson(&res)
 }
 
-func (db *Mongodb) ProcessRequest(db_name string, group_id string, op string, id int) (answer []byte, err error) {
+func (db *Mongodb) ProcessRequest(db_name string, group_id string, op string, extra_param string) (answer []byte, err error) {
 	switch op {
 	case "next":
 		return db.GetNextRecord(db_name, group_id)
 	case "id":
-		return db.GetRecordByID(db_name, group_id, id, true, false)
+		return db.GetRecordByID(db_name, group_id, extra_param, true, false)
 	case "idreset":
-		return db.GetRecordByID(db_name, group_id, id, true, true)
+		return db.GetRecordByID(db_name, group_id, extra_param, true, true)
 	case "last":
 		return db.GetLastRecord(db_name, group_id)
 	case "resetcounter":
@@ -371,7 +378,7 @@ func (db *Mongodb) ProcessRequest(db_name string, group_id string, op string, id
 	case "size":
 		return db.GetSize(db_name)
 	case "meta":
-		return db.getMeta(db_name, id)
+		return db.getMeta(db_name, extra_param)
 
 	}
 
diff --git a/broker/src/asapo_broker/database/mongodb_test.go b/broker/src/asapo_broker/database/mongodb_test.go
index bb200d7f2dae131e49ea8bfca11c0076cacd0e89..3d712557e81355123c6965c65a92e87e18522b76 100644
--- a/broker/src/asapo_broker/database/mongodb_test.go
+++ b/broker/src/asapo_broker/database/mongodb_test.go
@@ -21,6 +21,7 @@ const dbname = "run1"
 const dbaddress = "127.0.0.1:27017"
 const groupId = "bid2a5auidddp1vl71d0"
 const metaID = 0
+const metaID_str = "0"
 
 var rec1 = TestRecord{1, "aaa"}
 var rec2 = TestRecord{2, "bbb"}
@@ -166,7 +167,7 @@ func TestMongoDBGetRecordByID(t *testing.T) {
 	db.Connect(dbaddress)
 	defer cleanup()
 	db.InsertRecord(dbname, &rec1)
-	res, err := db.GetRecordByID(dbname, "", 1, true, false)
+	res, err := db.GetRecordByID(dbname, "", "1", true, false)
 	assert.Nil(t, err)
 	assert.Equal(t, string(rec1_expect), string(res))
 }
@@ -175,7 +176,7 @@ func TestMongoDBGetRecordByIDFails(t *testing.T) {
 	db.Connect(dbaddress)
 	defer cleanup()
 	db.InsertRecord(dbname, &rec1)
-	_, err := db.GetRecordByID(dbname, "", 2, true, false)
+	_, err := db.GetRecordByID(dbname, "", "2", true, false)
 	assert.Equal(t, utils.StatusNoData, err.(*DBError).Code)
 	assert.Equal(t, "{\"id\":2}", err.Error())
 }
@@ -184,7 +185,7 @@ func TestMongoDBGetRecordNext(t *testing.T) {
 	db.Connect(dbaddress)
 	defer cleanup()
 	db.InsertRecord(dbname, &rec1)
-	res, err := db.ProcessRequest(dbname, groupId, "next", 0)
+	res, err := db.ProcessRequest(dbname, groupId, "next", "0")
 	assert.Nil(t, err)
 	assert.Equal(t, string(rec1_expect), string(res))
 }
@@ -193,7 +194,7 @@ func TestMongoDBGetRecordID(t *testing.T) {
 	db.Connect(dbaddress)
 	defer cleanup()
 	db.InsertRecord(dbname, &rec1)
-	res, err := db.ProcessRequest(dbname, groupId, "id", 1)
+	res, err := db.ProcessRequest(dbname, groupId, "id", "1")
 	assert.Nil(t, err)
 	assert.Equal(t, string(rec1_expect), string(res))
 }
@@ -202,7 +203,7 @@ func TestMongoDBWrongOp(t *testing.T) {
 	db.Connect(dbaddress)
 	defer cleanup()
 	db.InsertRecord(dbname, &rec1)
-	_, err := db.ProcessRequest(dbname, groupId, "bla", 0)
+	_, err := db.ProcessRequest(dbname, groupId, "bla", "0")
 	assert.NotNil(t, err)
 }
 
@@ -212,7 +213,7 @@ func TestMongoDBGetRecordLast(t *testing.T) {
 	db.InsertRecord(dbname, &rec1)
 	db.InsertRecord(dbname, &rec2)
 
-	res, err := db.ProcessRequest(dbname, groupId, "last", 0)
+	res, err := db.ProcessRequest(dbname, groupId, "last", "0")
 	assert.Nil(t, err)
 	assert.Equal(t, string(rec2_expect), string(res))
 }
@@ -223,13 +224,13 @@ func TestMongoDBGetNextAfterGetLastCorrect(t *testing.T) {
 	db.InsertRecord(dbname, &rec1)
 	db.InsertRecord(dbname, &rec2)
 
-	res, err := db.ProcessRequest(dbname, groupId, "last", 0)
+	res, err := db.ProcessRequest(dbname, groupId, "last", "0")
 	assert.Nil(t, err)
 	assert.Equal(t, string(rec2_expect), string(res))
 
 	db.InsertRecord(dbname, &rec3)
 
-	res, err = db.ProcessRequest(dbname, groupId, "next", 0)
+	res, err = db.ProcessRequest(dbname, groupId, "next", "0")
 	assert.Nil(t, err)
 	assert.Equal(t, string(rec3_expect), string(res))
 
@@ -242,7 +243,7 @@ func TestMongoDBGetSize(t *testing.T) {
 	db.InsertRecord(dbname, &rec2)
 	db.InsertRecord(dbname, &rec3)
 
-	res, err := db.ProcessRequest(dbname, "", "size", 0)
+	res, err := db.ProcessRequest(dbname, "", "size", "0")
 	assert.Nil(t, err)
 	assert.Equal(t, string(recs1_expect), string(res))
 }
@@ -254,7 +255,7 @@ func TestMongoDBGetSizeNoRecords(t *testing.T) {
 	db.InsertRecord(dbname, &rec1)
 	db.session.DB(dbname).C(data_collection_name).RemoveId(1)
 
-	res, err := db.ProcessRequest(dbname, "", "size", 0)
+	res, err := db.ProcessRequest(dbname, "", "size", "0")
 	assert.Nil(t, err)
 	assert.Equal(t, string(recs2_expect), string(res))
 }
@@ -262,7 +263,7 @@ func TestMongoDBGetSizeNoRecords(t *testing.T) {
 func TestMongoDBGetSizeNoDatabase(t *testing.T) {
 	db.Connect(dbaddress)
 	defer cleanup()
-	_, err := db.ProcessRequest(dbname, "", "size", 0)
+	_, err := db.ProcessRequest(dbname, "", "size", "0")
 	assert.NotNil(t, err)
 }
 
@@ -272,8 +273,8 @@ func TestMongoDBGetRecordIDWithReset(t *testing.T) {
 	db.InsertRecord(dbname, &rec1)
 	db.InsertRecord(dbname, &rec2)
 
-	res1, err1 := db.ProcessRequest(dbname, groupId, "idreset", 1)
-	res2, err2 := db.ProcessRequest(dbname, groupId, "next", 0)
+	res1, err1 := db.ProcessRequest(dbname, groupId, "idreset", "1")
+	res2, err2 := db.ProcessRequest(dbname, groupId, "next", "0")
 
 	assert.Nil(t, err1)
 	assert.Equal(t, string(rec1_expect), string(res1))
@@ -283,7 +284,7 @@ func TestMongoDBGetRecordIDWithReset(t *testing.T) {
 }
 
 func TestMongoDBGetRecordByIDNotConnected(t *testing.T) {
-	_, err := db.GetRecordByID(dbname, "", 2, true, false)
+	_, err := db.GetRecordByID(dbname, "", "2", true, false)
 	assert.Equal(t, utils.StatusError, err.(*DBError).Code)
 }
 
@@ -293,15 +294,15 @@ func TestMongoDBResetCounter(t *testing.T) {
 	db.InsertRecord(dbname, &rec1)
 	db.InsertRecord(dbname, &rec2)
 
-	res1, err1 := db.ProcessRequest(dbname, groupId, "next", 0)
+	res1, err1 := db.ProcessRequest(dbname, groupId, "next", "0")
 
 	assert.Nil(t, err1)
 	assert.Equal(t, string(rec1_expect), string(res1))
 
-	_, err_reset := db.ProcessRequest(dbname, groupId, "resetcounter", 0)
+	_, err_reset := db.ProcessRequest(dbname, groupId, "resetcounter", "0")
 	assert.Nil(t, err_reset)
 
-	res2, err2 := db.ProcessRequest(dbname, groupId, "next", 0)
+	res2, err2 := db.ProcessRequest(dbname, groupId, "next", "0")
 
 	assert.Nil(t, err2)
 	assert.Equal(t, string(rec1_expect), string(res2))
@@ -315,7 +316,7 @@ func TestMongoDBGetMetaOK(t *testing.T) {
 	rec_expect, _ := json.Marshal(rec1)
 	db.InsertMeta(dbname, &rec1)
 
-	res, err := db.ProcessRequest(dbname, "", "meta", metaID)
+	res, err := db.ProcessRequest(dbname, "", "meta", metaID_str)
 
 	assert.Nil(t, err)
 	assert.Equal(t, string(rec_expect), string(res))
@@ -325,6 +326,6 @@ func TestMongoDBGetMetaErr(t *testing.T) {
 	db.Connect(dbaddress)
 	defer cleanup()
 
-	_, err := db.ProcessRequest(dbname, "", "meta", metaID)
+	_, err := db.ProcessRequest(dbname, "", "meta", metaID_str)
 	assert.NotNil(t, err)
 }
diff --git a/broker/src/asapo_broker/server/get_id.go b/broker/src/asapo_broker/server/get_id.go
index da4fd7ee4aedf0403b5db8c2c32ef086dd16d195..5eea8aea38e8e03ebde445266fa4c5f326a9c805 100644
--- a/broker/src/asapo_broker/server/get_id.go
+++ b/broker/src/asapo_broker/server/get_id.go
@@ -3,17 +3,15 @@ package server
 import (
 	"github.com/gorilla/mux"
 	"net/http"
-	"strconv"
 )
 
-func extractRequestParametersID(r *http.Request) (int, bool) {
+func extractRequestParametersID(r *http.Request) (string, bool) {
 	vars := mux.Vars(r)
 	id_str, ok := vars["id"]
 	if !ok {
-		return 0, ok
+		return "0", ok
 	}
-	id, err := strconv.Atoi(id_str)
-	return id, err == nil
+	return id_str, true
 }
 
 func routeGetByID(w http.ResponseWriter, r *http.Request) {
diff --git a/broker/src/asapo_broker/server/get_id_test.go b/broker/src/asapo_broker/server/get_id_test.go
index 3330c81846b0d18655bc8572a4fff51f4ca61231..658a5871306d44de75eb40743f393e4e740b2e2f 100644
--- a/broker/src/asapo_broker/server/get_id_test.go
+++ b/broker/src/asapo_broker/server/get_id_test.go
@@ -45,7 +45,7 @@ func TestGetIDTestSuite(t *testing.T) {
 }
 
 func (suite *GetIDTestSuite) TestGetIdCallsCorrectRoutine() {
-	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "id", 1).Return([]byte("Hello"), nil)
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "id", "1").Return([]byte("Hello"), nil)
 	logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request")))
 	ExpectCopyClose(suite.mock_db)
 
@@ -55,7 +55,7 @@ func (suite *GetIDTestSuite) TestGetIdCallsCorrectRoutine() {
 }
 
 func (suite *GetIDTestSuite) TestGetIdWithResetCallsCorrectRoutine() {
-	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "idreset", 1).Return([]byte("Hello"), nil)
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "idreset", "1").Return([]byte("Hello"), nil)
 	logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request")))
 	ExpectCopyClose(suite.mock_db)
 
diff --git a/broker/src/asapo_broker/server/get_last.go b/broker/src/asapo_broker/server/get_last.go
index 414540ba08de4eb45e53d966f466a2e1fca4f48f..5b0bcd616547aeec3f119fa8f7b5e40186111265 100644
--- a/broker/src/asapo_broker/server/get_last.go
+++ b/broker/src/asapo_broker/server/get_last.go
@@ -5,5 +5,5 @@ import (
 )
 
 func routeGetLast(w http.ResponseWriter, r *http.Request) {
-	processRequest(w, r, "last", 0, true)
+	processRequest(w, r, "last", "0", true)
 }
diff --git a/broker/src/asapo_broker/server/get_last_test.go b/broker/src/asapo_broker/server/get_last_test.go
index 3b6673ff8e6dd97cb17250d6e17618d7de3d56ed..08e3a7848a5e08a0e0837f211f9e8d132104431e 100644
--- a/broker/src/asapo_broker/server/get_last_test.go
+++ b/broker/src/asapo_broker/server/get_last_test.go
@@ -33,7 +33,7 @@ func TestGetLastTestSuite(t *testing.T) {
 }
 
 func (suite *GetLastTestSuite) TestGetLastCallsCorrectRoutine() {
-	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "last", 0).Return([]byte("Hello"), nil)
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "last", "0").Return([]byte("Hello"), nil)
 	logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request last")))
 	ExpectCopyClose(suite.mock_db)
 
diff --git a/broker/src/asapo_broker/server/get_meta_test.go b/broker/src/asapo_broker/server/get_meta_test.go
index 6b07de63e31410a23fda301b836935dbf4aafadd..958b6e73b00214f984d78cf25aeefbb297fc55ac 100644
--- a/broker/src/asapo_broker/server/get_meta_test.go
+++ b/broker/src/asapo_broker/server/get_meta_test.go
@@ -33,7 +33,7 @@ func TestGetMetaTestSuite(t *testing.T) {
 }
 
 func (suite *GetMetaTestSuite) TestGetMetaOK() {
-	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, "", "meta", 0).Return([]byte("{\"test\":10}"), nil)
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, "", "meta", "0").Return([]byte("{\"test\":10}"), nil)
 	logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request meta")))
 	ExpectCopyClose(suite.mock_db)
 
diff --git a/broker/src/asapo_broker/server/get_next.go b/broker/src/asapo_broker/server/get_next.go
index 5456d4c4c31c674b2e6c8870ec8299700fb4bc07..dc66ce677d872e3700d343739ca7b487d4577800 100644
--- a/broker/src/asapo_broker/server/get_next.go
+++ b/broker/src/asapo_broker/server/get_next.go
@@ -5,5 +5,5 @@ import (
 )
 
 func routeGetNext(w http.ResponseWriter, r *http.Request) {
-	processRequest(w, r, "next", 0, true)
+	processRequest(w, r, "next", "0", true)
 }
diff --git a/broker/src/asapo_broker/server/get_next_test.go b/broker/src/asapo_broker/server/get_next_test.go
index 5418327d9a54ff08670a54a5f8bee3b67854f04c..e7647372644259cd28a8fd70bdd5d51d1d780d47 100644
--- a/broker/src/asapo_broker/server/get_next_test.go
+++ b/broker/src/asapo_broker/server/get_next_test.go
@@ -33,7 +33,7 @@ func TestGetNextTestSuite(t *testing.T) {
 }
 
 func (suite *GetNextTestSuite) TestGetNextCallsCorrectRoutine() {
-	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "next", 0).Return([]byte("Hello"), nil)
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "next", "0").Return([]byte("Hello"), nil)
 	logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request next")))
 	ExpectCopyClose(suite.mock_db)
 
diff --git a/broker/src/asapo_broker/server/get_size.go b/broker/src/asapo_broker/server/get_size.go
index 963e74826ae2bfb10edd071ce82c9448daaebc72..fa4dd2367cf8a1115e6c740e060f6a4ff3680a7a 100644
--- a/broker/src/asapo_broker/server/get_size.go
+++ b/broker/src/asapo_broker/server/get_size.go
@@ -5,5 +5,5 @@ import (
 )
 
 func routeGetSize(w http.ResponseWriter, r *http.Request) {
-	processRequest(w, r, "size", 0, false)
+	processRequest(w, r, "size", "0", false)
 }
diff --git a/broker/src/asapo_broker/server/get_size_test.go b/broker/src/asapo_broker/server/get_size_test.go
index 739abe27a8c2320a9cd392325d70367f91e70c5a..642b2d7003333e626ea91c8aa6985c538a48bad9 100644
--- a/broker/src/asapo_broker/server/get_size_test.go
+++ b/broker/src/asapo_broker/server/get_size_test.go
@@ -33,7 +33,7 @@ func TestGetSizeTestSuite(t *testing.T) {
 }
 
 func (suite *GetSizeTestSuite) TestGetSizeOK() {
-	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, "", "size", 0).Return([]byte("{\"size\":10}"), nil)
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, "", "size", "0").Return([]byte("{\"size\":10}"), nil)
 	logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request size")))
 	ExpectCopyClose(suite.mock_db)
 
diff --git a/broker/src/asapo_broker/server/listroutes.go b/broker/src/asapo_broker/server/listroutes.go
index f56310e24193032db17e49f160a730982c875425..c477844826d6adfc5b4a2003723fbf2a39b3de35 100644
--- a/broker/src/asapo_broker/server/listroutes.go
+++ b/broker/src/asapo_broker/server/listroutes.go
@@ -41,6 +41,12 @@ var listRoutes = utils.Routes{
 		"/creategroup",
 		routeCreateGroupID,
 	},
+	utils.Route{
+		"QueryImages",
+		"Post",
+		"/database/{dbname}/0/queryimages",
+		routeQueryImages,
+	},
 	utils.Route{
 		"ResetCounter",
 		"Post",
diff --git a/broker/src/asapo_broker/server/post_query_images.go b/broker/src/asapo_broker/server/post_query_images.go
new file mode 100644
index 0000000000000000000000000000000000000000..4d33c23588e4430bfd3154cd035488bd26417c08
--- /dev/null
+++ b/broker/src/asapo_broker/server/post_query_images.go
@@ -0,0 +1,16 @@
+package server
+
+import (
+	"io/ioutil"
+	"net/http"
+)
+
+func routeQueryImages(w http.ResponseWriter, r *http.Request) {
+	body, err := ioutil.ReadAll(r.Body)
+	if err != nil {
+		http.Error(w, err.Error(), 500)
+		return
+	}
+
+	processRequest(w, r, "queryimages", string(body), false)
+}
diff --git a/broker/src/asapo_broker/server/post_query_images_test.go b/broker/src/asapo_broker/server/post_query_images_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..f52771a695736215a95a87b9243324bd39f30d95
--- /dev/null
+++ b/broker/src/asapo_broker/server/post_query_images_test.go
@@ -0,0 +1,43 @@
+package server
+
+import (
+	"asapo_broker/database"
+	"asapo_common/logger"
+	"github.com/stretchr/testify/mock"
+	"github.com/stretchr/testify/suite"
+	"net/http"
+	"testing"
+)
+
+type QueryTestSuite struct {
+	suite.Suite
+	mock_db *database.MockedDatabase
+}
+
+func (suite *QueryTestSuite) SetupTest() {
+	statistics.Reset()
+	suite.mock_db = new(database.MockedDatabase)
+	db = suite.mock_db
+	prepareTestAuth()
+	logger.SetMockLog()
+}
+
+func (suite *QueryTestSuite) TearDownTest() {
+	assertExpectations(suite.T(), suite.mock_db)
+	logger.UnsetMockLog()
+	db = nil
+}
+
+func TestQueryTestSuite(t *testing.T) {
+	suite.Run(t, new(QueryTestSuite))
+}
+
+func (suite *QueryTestSuite) TestQueryOK() {
+	query_str := "aaaa"
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, "", "queryimages", query_str).Return([]byte("{}"), nil)
+	logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request queryimages")))
+	ExpectCopyClose(suite.mock_db)
+
+	w := doRequest("/database/"+expectedBeamtimeId+"/0/queryimages"+correctTokenSuffix, "POST", query_str)
+	suite.Equal(http.StatusOK, w.Code, "Query OK")
+}
diff --git a/broker/src/asapo_broker/server/post_reset_counter.go b/broker/src/asapo_broker/server/post_reset_counter.go
index d93b600adf03d7c555ef1891075c40bb596f9c50..fd881f72f1fb81596077ae08f80f69888c9ad9d3 100644
--- a/broker/src/asapo_broker/server/post_reset_counter.go
+++ b/broker/src/asapo_broker/server/post_reset_counter.go
@@ -5,5 +5,5 @@ import (
 )
 
 func routeResetCounter(w http.ResponseWriter, r *http.Request) {
-	processRequest(w, r, "resetcounter", 0, true)
+	processRequest(w, r, "resetcounter", "0", true)
 }
diff --git a/broker/src/asapo_broker/server/post_reset_counter_test.go b/broker/src/asapo_broker/server/post_reset_counter_test.go
index 8db63c42189fea75db6715bc8ba11c1f586d6dc6..d2d69edf874d67f28a9c6fe4350c6be8a6c29fdd 100644
--- a/broker/src/asapo_broker/server/post_reset_counter_test.go
+++ b/broker/src/asapo_broker/server/post_reset_counter_test.go
@@ -33,7 +33,7 @@ func TestResetCounterTestSuite(t *testing.T) {
 }
 
 func (suite *ResetCounterTestSuite) TestResetCounterOK() {
-	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "resetcounter", 0).Return([]byte(""), nil)
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "resetcounter", "0").Return([]byte(""), nil)
 	logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request resetcounter")))
 	ExpectCopyClose(suite.mock_db)
 
diff --git a/broker/src/asapo_broker/server/process_request.go b/broker/src/asapo_broker/server/process_request.go
index 0e4f379037b362e482a37c76deca6528465dc9c8..3cede6c0014d855064980565dce4ca584fefb5f1 100644
--- a/broker/src/asapo_broker/server/process_request.go
+++ b/broker/src/asapo_broker/server/process_request.go
@@ -37,7 +37,7 @@ func checkGroupID(w http.ResponseWriter, needGroupID bool, group_id string, db_n
 	return true
 }
 
-func processRequest(w http.ResponseWriter, r *http.Request, op string, id int, needGroupID bool) {
+func processRequest(w http.ResponseWriter, r *http.Request, op string, extra_param string, needGroupID bool) {
 	r.Header.Set("Content-type", "application/json")
 	w.Header().Set("Access-Control-Allow-Origin", "*")
 	db_name, group_id, ok := extractRequestParameters(r, needGroupID)
@@ -59,7 +59,7 @@ func processRequest(w http.ResponseWriter, r *http.Request, op string, id int, n
 		op = "idreset"
 	}
 
-	answer, code := processRequestInDb(db_name, group_id, op, id)
+	answer, code := processRequestInDb(db_name, group_id, op, extra_param)
 	w.WriteHeader(code)
 	w.Write(answer)
 }
@@ -78,11 +78,11 @@ func returnError(err error, log_str string) (answer []byte, code int) {
 	return []byte(err.Error()), code
 }
 
-func processRequestInDb(db_name string, group_id string, op string, id int) (answer []byte, code int) {
+func processRequestInDb(db_name string, group_id string, op string, extra_param string) (answer []byte, code int) {
 	db_new := db.Copy()
 	defer db_new.Close()
 	statistics.IncreaseCounter()
-	answer, err := db_new.ProcessRequest(db_name, group_id, op, id)
+	answer, err := db_new.ProcessRequest(db_name, group_id, op, extra_param)
 	log_str := "processing request " + op + " in " + db_name + " at " + settings.BrokerDbAddress
 	if err != nil {
 		return returnError(err, log_str)
diff --git a/broker/src/asapo_broker/server/process_request_test.go b/broker/src/asapo_broker/server/process_request_test.go
index 694a05edc4fe7b33eb8d0d49c562ad0b591d11c5..727f2aa3e68d190874ecd206f90863887832d6ef 100644
--- a/broker/src/asapo_broker/server/process_request_test.go
+++ b/broker/src/asapo_broker/server/process_request_test.go
@@ -8,6 +8,7 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/mock"
 	"github.com/stretchr/testify/suite"
+	"io"
 	"net/http"
 	"net/http/httptest"
 	"strings"
@@ -49,14 +50,18 @@ func containsMatcher(substrings ...string) func(str string) bool {
 	}
 }
 
-func doRequest(path string, method ...string) *httptest.ResponseRecorder {
+func doRequest(path string, extra_params ...string) *httptest.ResponseRecorder {
 	m := "GET"
-	if len(method) > 0 {
-		m = method[0]
+	if len(extra_params) > 0 {
+		m = extra_params[0]
+	}
+	var body io.Reader = nil
+	if len(extra_params) > 1 {
+		body = strings.NewReader(extra_params[1])
 	}
 
 	mux := utils.NewRouter(listRoutes)
-	req, _ := http.NewRequest(m, path, nil)
+	req, _ := http.NewRequest(m, path, body)
 	w := httptest.NewRecorder()
 	mux.ServeHTTP(w, req)
 	return w
@@ -112,7 +117,7 @@ func (suite *ProcessRequestTestSuite) TestProcessRequestWithNoToken() {
 }
 
 func (suite *ProcessRequestTestSuite) TestProcessRequestWithWrongDatabaseName() {
-	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "next", 0).Return([]byte(""),
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "next", "0").Return([]byte(""),
 		&database.DBError{utils.StatusWrongInput, ""})
 
 	logger.MockLog.On("Error", mock.MatchedBy(containsMatcher("processing request next")))
@@ -124,7 +129,7 @@ func (suite *ProcessRequestTestSuite) TestProcessRequestWithWrongDatabaseName()
 }
 
 func (suite *ProcessRequestTestSuite) TestProcessRequestWithInternalDBError() {
-	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "next", 0).Return([]byte(""), errors.New(""))
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "next", "0").Return([]byte(""), errors.New(""))
 	logger.MockLog.On("Error", mock.MatchedBy(containsMatcher("processing request next")))
 	ExpectCopyClose(suite.mock_db)
 
@@ -133,7 +138,7 @@ func (suite *ProcessRequestTestSuite) TestProcessRequestWithInternalDBError() {
 }
 
 func (suite *ProcessRequestTestSuite) TestProcessRequestAddsCounter() {
-	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "next", 0).Return([]byte("Hello"), nil)
+	suite.mock_db.On("ProcessRequest", expectedBeamtimeId, expectedGroupID, "next", "0").Return([]byte("Hello"), nil)
 	logger.MockLog.On("Debug", mock.MatchedBy(containsMatcher("processing request next in "+expectedBeamtimeId)))
 	ExpectCopyClose(suite.mock_db)