diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
index bd128c9569d62a54505e35c7bfa99e439db8fa50..28f802417554a083d10531b1f107a5772e76769a 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
@@ -239,7 +239,13 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{
 		IPAACA_HEADER_EXPORT PayloadEntryProxy(PayloadEntryProxy* parent, size_t addressed_index);
 	public:
 		IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](size_t index); // array-style navigation
-		IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](const std::string& key);
+		IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](int index); // int is UNFORTUNATELY required to catch
+																	  // [0] (addressing using literal zero)
+																	  // because ambiguity with const char*
+																	  // arises if only [](size_t) is provided.
+																	  // size_t is obviously superior ...
+																	  // TODO: remove if better solution known
+		IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](const std::string& key); // dict-style navigation
 		IPAACA_HEADER_EXPORT PayloadEntryProxy operator[](const char* key);
 		//                   
 		IPAACA_HEADER_EXPORT template<typename T> PayloadEntryProxy& operator=(T t)
diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc
index 83ac873f7de2187baa0aecbb291b369db36d8d0d..fc41425b56d93cb95a83961d7919842c243382ea 100644
--- a/ipaacalib/cpp/src/ipaaca-json.cc
+++ b/ipaacalib/cpp/src/ipaaca-json.cc
@@ -136,8 +136,8 @@ int main(int argc, char** argv) {
 	//std::map<std::string, double> vs = { {"A", 10}, {"B", 20}, {"C", 30}, {"D", 40} };
 	//ipaaca::pack_into_json_value(entry->document, entry->document.GetAllocator(), vs);
 	std::cout << "Setting a value deep in the object:" << std::endl;
-	//iu->payload()["a"][(int)0] = "set by pep::op=";
-	iu->payload()["a"]["A"] = "set by pep::op=";
+	iu->payload()["a"][0] = "set by pep::op=";
+	//iu->payload()["a"]["A"] = "set by pep::op=";
 	
 	std::cout << "Final payload (printed as strings):" << std::endl;
 	std::map<std::string, std::string> pl_flat = iu->payload();
diff --git a/ipaacalib/cpp/src/ipaaca-payload.cc b/ipaacalib/cpp/src/ipaaca-payload.cc
index 58ea2e31180e652a90917a9b0f1121ef5956dc9d..f7b5e7957b9cd28f4408db72489d73c41d2dc748 100644
--- a/ipaacalib/cpp/src/ipaaca-payload.cc
+++ b/ipaacalib/cpp/src/ipaaca-payload.cc
@@ -405,6 +405,14 @@ IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](size_t addr_idx_)
 	}
 	return PayloadEntryProxy(this, addr_idx_);
 }
+IPAACA_EXPORT PayloadEntryProxy PayloadEntryProxy::operator[](int addr_idx_)
+{
+	if (addr_idx_ < 0) {
+		IPAACA_INFO("Negative index!")
+		throw PayloadAddressingError();
+	}
+	return operator[]((size_t) addr_idx_);
+}
 
 /*
 IPAACA_EXPORT PayloadEntryProxy& PayloadEntryProxy::operator=(const std::string& value)