diff --git a/broker/src/asapo_broker/database/mongodb.go b/broker/src/asapo_broker/database/mongodb.go
index b1129ebcffc3b33b31ebaea06e4a457313087e7f..bf46a66a83045e5b4bd3add146a87b635268a870 100644
--- a/broker/src/asapo_broker/database/mongodb.go
+++ b/broker/src/asapo_broker/database/mongodb.go
@@ -20,6 +20,7 @@ type Pointer struct {
 }
 
 const data_collection_name = "data"
+const meta_collection_name = "meta"
 const pointer_collection_name = "current_location"
 const pointer_field_name = "current_pointer"
 const no_session_msg = "database session not created"
@@ -121,6 +122,16 @@ func (db *Mongodb) InsertRecord(dbname string, s interface{}) error {
 	return c.Insert(s)
 }
 
+func (db *Mongodb) InsertMeta(dbname string, s interface{}) error {
+	if db.session == nil {
+		return errors.New(no_session_msg)
+	}
+
+	c := db.session.DB(dbname).C(meta_collection_name)
+
+	return c.Insert(s)
+}
+
 func (db *Mongodb) getMaxIndex(dbname string) (max_id int, err error) {
 	c := db.session.DB(dbname).C(data_collection_name)
 	var id Pointer
@@ -328,6 +339,22 @@ 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) {
+
+	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)
+	if err != nil {
+		log_str := "error getting meta with id " + strconv.Itoa(id) + " for " + dbname + " : " + err.Error()
+		logger.Debug(log_str)
+		return nil, &DBError{utils.StatusNoData, err.Error()}
+	}
+
+	log_str := "got record id " + strconv.Itoa(id) + " for " + dbname
+	logger.Debug(log_str)
+	return utils.MapToJson(&res)
+}
 
 func (db *Mongodb) ProcessRequest(db_name string, group_id string, op string, id int) (answer []byte, err error) {
 	switch op {
@@ -343,6 +370,9 @@ func (db *Mongodb) ProcessRequest(db_name string, group_id string, op string, id
 		return db.ResetCounter(db_name, group_id)
 	case "size":
 		return db.GetSize(db_name)
+	case "meta":
+		return db.getMeta(db_name, id)
+
 	}
 
 	return nil, errors.New("Wrong db operation: " + op)
diff --git a/broker/src/asapo_broker/database/mongodb_test.go b/broker/src/asapo_broker/database/mongodb_test.go
index a5500e9ddc5444558eab2c30944de1d94b4a45d9..bb200d7f2dae131e49ea8bfca11c0076cacd0e89 100644
--- a/broker/src/asapo_broker/database/mongodb_test.go
+++ b/broker/src/asapo_broker/database/mongodb_test.go
@@ -20,6 +20,7 @@ var db Mongodb
 const dbname = "run1"
 const dbaddress = "127.0.0.1:27017"
 const groupId = "bid2a5auidddp1vl71d0"
+const metaID = 0
 
 var rec1 = TestRecord{1, "aaa"}
 var rec2 = TestRecord{2, "bbb"}
@@ -297,13 +298,33 @@ func TestMongoDBResetCounter(t *testing.T) {
 	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)
 
-
 	assert.Nil(t, err2)
 	assert.Equal(t, string(rec1_expect), string(res2))
 
 }
+
+func TestMongoDBGetMetaOK(t *testing.T) {
+	db.Connect(dbaddress)
+	defer cleanup()
+	rec1.ID = metaID
+	rec_expect, _ := json.Marshal(rec1)
+	db.InsertMeta(dbname, &rec1)
+
+	res, err := db.ProcessRequest(dbname, "", "meta", metaID)
+
+	assert.Nil(t, err)
+	assert.Equal(t, string(rec_expect), string(res))
+}
+
+func TestMongoDBGetMetaErr(t *testing.T) {
+	db.Connect(dbaddress)
+	defer cleanup()
+
+	_, err := db.ProcessRequest(dbname, "", "meta", metaID)
+	assert.NotNil(t, err)
+}
diff --git a/broker/src/asapo_broker/server/get_meta.go b/broker/src/asapo_broker/server/get_meta.go
new file mode 100644
index 0000000000000000000000000000000000000000..c038cb54d918333e5c02b57f39cadbcb9fbe27d3
--- /dev/null
+++ b/broker/src/asapo_broker/server/get_meta.go
@@ -0,0 +1,14 @@
+package server
+
+import (
+	"net/http"
+)
+
+func routeGetMeta(w http.ResponseWriter, r *http.Request) {
+	id, ok := extractRequestParametersID(r)
+	if !ok {
+		w.WriteHeader(http.StatusBadRequest)
+		return
+	}
+	processRequest(w, r, "meta", id, false)
+}
diff --git a/broker/src/asapo_broker/server/get_meta_test.go b/broker/src/asapo_broker/server/get_meta_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..6b07de63e31410a23fda301b836935dbf4aafadd
--- /dev/null
+++ b/broker/src/asapo_broker/server/get_meta_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 GetMetaTestSuite struct {
+	suite.Suite
+	mock_db *database.MockedDatabase
+}
+
+func (suite *GetMetaTestSuite) SetupTest() {
+	statistics.Reset()
+	suite.mock_db = new(database.MockedDatabase)
+	db = suite.mock_db
+	prepareTestAuth()
+	logger.SetMockLog()
+}
+
+func (suite *GetMetaTestSuite) TearDownTest() {
+	assertExpectations(suite.T(), suite.mock_db)
+	logger.UnsetMockLog()
+	db = nil
+}
+
+func TestGetMetaTestSuite(t *testing.T) {
+	suite.Run(t, new(GetMetaTestSuite))
+}
+
+func (suite *GetMetaTestSuite) TestGetMetaOK() {
+	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)
+
+	w := doRequest("/database/" + expectedBeamtimeId + "/0/meta/0" + correctTokenSuffix)
+	suite.Equal(http.StatusOK, w.Code, "GetSize OK")
+	suite.Equal("{\"test\":10}", string(w.Body.Bytes()), "GetMeta sends meta")
+}
diff --git a/broker/src/asapo_broker/server/listroutes.go b/broker/src/asapo_broker/server/listroutes.go
index 750ee8c40ef0cc723b64b1cb688329df447135e0..f56310e24193032db17e49f160a730982c875425 100644
--- a/broker/src/asapo_broker/server/listroutes.go
+++ b/broker/src/asapo_broker/server/listroutes.go
@@ -29,6 +29,12 @@ var listRoutes = utils.Routes{
 		"/database/{dbname}/{groupid}/{id}",
 		routeGetByID,
 	},
+	utils.Route{
+		"GetMeta",
+		"Get",
+		"/database/{dbname}/0/meta/{id}",
+		routeGetMeta,
+	},
 	utils.Route{
 		"CreateGroup",
 		"Post",
diff --git a/tests/automatic/broker/CMakeLists.txt b/tests/automatic/broker/CMakeLists.txt
index 37420e25280cc15c84dddb7d4b1159f6eab7d0b1..ef8369c2ab30c50c75935c2ce4989e089beb3007 100644
--- a/tests/automatic/broker/CMakeLists.txt
+++ b/tests/automatic/broker/CMakeLists.txt
@@ -1,5 +1,6 @@
 add_subdirectory(get_next)
 add_subdirectory(get_last)
+add_subdirectory(get_meta)
 
 add_subdirectory(read_config)
 
diff --git a/tests/automatic/broker/get_meta/CMakeLists.txt b/tests/automatic/broker/get_meta/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..37351767df15cf93350e299046b6b0c078ec0e1b
--- /dev/null
+++ b/tests/automatic/broker/get_meta/CMakeLists.txt
@@ -0,0 +1,10 @@
+set(TARGET_NAME asapo-broker)
+
+################################
+# Testing
+################################
+configure_file(${CMAKE_SOURCE_DIR}/tests/automatic/settings/broker_settings.json settings.json COPYONLY)
+configure_file(${CMAKE_SOURCE_DIR}/tests/automatic/settings/broker_secret.key broker_secret.key COPYONLY)
+
+add_script_test("${TARGET_NAME}-getmeta" "$<TARGET_PROPERTY:${TARGET_NAME},EXENAME> $<TARGET_PROPERTY:asapo,EXENAME>" nomem
+        )
diff --git a/tests/automatic/broker/get_meta/check_linux.sh b/tests/automatic/broker/get_meta/check_linux.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0e906ae6c103d6baa75d11375b5d30187acfa672
--- /dev/null
+++ b/tests/automatic/broker/get_meta/check_linux.sh
@@ -0,0 +1,26 @@
+#!/usr/bin/env bash
+
+database_name=test
+
+set -e
+
+trap Cleanup EXIT
+
+Cleanup() {
+	echo cleanup
+	echo "db.dropDatabase()" | mongo ${database_name}
+	kill -9 $brokerid
+}
+
+echo 'db.meta.insert({"_id":0,"data":"test"})' | mongo ${database_name}
+
+token=`$2 token -secret broker_secret.key ${database_name}`
+
+$1 -config settings.json &
+
+sleep 0.3
+brokerid=`echo $!`
+
+curl -v  --silent 127.0.0.1:5005/database/${database_name}/0/meta/0?token=$token --stderr - | grep '"data":"test"'
+curl -v  --silent 127.0.0.1:5005/database/${database_name}/0/meta/1?token=$token --stderr - | grep 'not found'
+
diff --git a/tests/automatic/broker/get_meta/check_windows.bat b/tests/automatic/broker/get_meta/check_windows.bat
new file mode 100644
index 0000000000000000000000000000000000000000..8e111ea82520404ddb13e186748953f9af671401
--- /dev/null
+++ b/tests/automatic/broker/get_meta/check_windows.bat
@@ -0,0 +1,30 @@
+SET database_name=data
+SET mongo_exe="c:\Program Files\MongoDB\Server\3.6\bin\mongo.exe"
+
+echo db.meta.insert({"_id":0}) | %mongo_exe% %database_name%  || goto :error
+
+set full_name="%1"
+set short_name="%~nx1"
+
+"%2" token -secret broker_secret.key %database_name% > token
+set /P token=< token
+
+start /B "" "%full_name%" -config settings.json
+
+ping 1.0.0.0 -n 1 -w 100 > nul
+
+C:\Curl\curl.exe -v  --silent 127.0.0.1:5005/database/%database_name%/0/meta?token=%token% --stderr - | findstr /c:\"_id\":0  || goto :error
+C:\Curl\curl.exe -v  --silent 127.0.0.1:5005/database/%database_name%/1/meta?token=%token% --stderr - | findstr /c:"not found"  || goto :error
+
+
+goto :clean
+
+:error
+call :clean
+exit /b 1
+
+:clean
+Taskkill /IM "%short_name%" /F
+echo db.dropDatabase() | %mongo_exe% %database_name%
+del /f token
+del /f groupid
\ No newline at end of file
diff --git a/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp b/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp
index 059953937e21dac3763a489e8d2ae13ab5ad6839..6855c88f796727a62144fc4640030931211507af 100644
--- a/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp
+++ b/tests/automatic/mongo_db/upsert/upsert_mongodb.cpp
@@ -48,16 +48,16 @@ int main(int argc, char* argv[]) {
         db.Connect("127.0.0.1", "test", "meta");
     }
 
-    auto err = db.Upsert(0, reinterpret_cast<const uint8_t*>(json.c_str()),json.size());
+    auto err = db.Upsert(0, reinterpret_cast<const uint8_t*>(json.c_str()), json.size());
     if (err) {
-        std::cout<<err->Explain()<<std::endl;
+        std::cout << err->Explain() << std::endl;
     }
 
     Assert(err, args.keyword);
 
-    err = db.Upsert(0, reinterpret_cast<const uint8_t*>(json.c_str()),json.size());
+    err = db.Upsert(0, reinterpret_cast<const uint8_t*>(json.c_str()), json.size());
     if (err) {
-        std::cout<<err->Explain()<<std::endl;
+        std::cout << err->Explain() << std::endl;
     }
 
     Assert(err, args.keyword);