diff --git a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
index 0e867baec1c0e226a48f105a34f748b0fed8d5f0..aad0f3f4d049c13ae2a807d15cbba69180184a5a 100644
--- a/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
+++ b/ipaacalib/cpp/include/ipaaca/ipaaca-payload.h
@@ -494,6 +494,45 @@ IPAACA_HEADER_EXPORT class PayloadEntryProxy//{{{
 			connect_to_existing_parents();
 			_payload->set(key, document_entry->document);
 		}*/
+		/// Append a supported type to a list-type payload value
+		IPAACA_HEADER_EXPORT template<typename T> void push_back(T t)
+		{
+			if ((!json_value) || (!json_value->IsArray())) throw PayloadAddressingError();
+			PayloadDocumentEntry::ptr new_entry = document_entry->clone(); // copy-on-write, no lock required
+			rapidjson::Value& list = new_entry->get_or_create_nested_value_from_proxy_path(this);
+			rapidjson::Value newval;
+			pack_into_json_value(newval, new_entry->document.GetAllocator(), t);
+			list.PushBack(newval, new_entry->document.GetAllocator());
+			_payload->set(_key, new_entry);
+		}
+		/// Alias for push_back() (somewhat pythonic - since we also provide extend())
+		IPAACA_HEADER_EXPORT template<typename T> void append(T t) { push_back<T>(t); }
+		/// Extend a list-type payload value with a vector containing items of a supported type
+		IPAACA_HEADER_EXPORT template<typename T> void extend(const std::vector<T>& ts)
+		{
+			if ((!json_value) || (!json_value->IsArray())) throw PayloadAddressingError();
+			PayloadDocumentEntry::ptr new_entry = document_entry->clone(); // copy-on-write, no lock required
+			rapidjson::Value& list = new_entry->get_or_create_nested_value_from_proxy_path(this);
+			for (auto& t: ts) {
+				rapidjson::Value newval;
+				pack_into_json_value(newval, new_entry->document.GetAllocator(), t);
+				list.PushBack(newval, new_entry->document.GetAllocator());
+			}
+			_payload->set(_key, new_entry);
+		}
+		/// Extend a list-type payload value with a list containing items of a supported type
+		IPAACA_HEADER_EXPORT template<typename T> void extend(const std::list<T>& ts)
+		{
+			if ((!json_value) || (!json_value->IsArray())) throw PayloadAddressingError();
+			PayloadDocumentEntry::ptr new_entry = document_entry->clone(); // copy-on-write, no lock required
+			rapidjson::Value& list = new_entry->get_or_create_nested_value_from_proxy_path(this);
+			for (auto& t: ts) {
+				rapidjson::Value newval;
+				pack_into_json_value(newval, new_entry->document.GetAllocator(), t);
+				list.PushBack(newval, new_entry->document.GetAllocator());
+			}
+			_payload->set(_key, new_entry);
+		}
 };
 // Available interpretations of payload entries (or children thereof) below.
 //  Usage of standard complex data structures (vector etc.) currently entails
diff --git a/ipaacalib/cpp/src/ipaaca-json.cc b/ipaacalib/cpp/src/ipaaca-json.cc
index bddbcac694be9dfcd68e25237108df0f0e851467..e0a08882b2b57dd79ef0abd05559cdf434e634f0 100644
--- a/ipaacalib/cpp/src/ipaaca-json.cc
+++ b/ipaacalib/cpp/src/ipaaca-json.cc
@@ -152,6 +152,20 @@ int iterators_main(int argc, char** argv)//{{{
 		std::cout << "  Unexpected exception: " << ex.what() << std::endl;
 	}
 	
+	std::cout << std::endl << "Appending a string item to the end of payload['a']" << std::endl;
+	iu->payload()["a"].push_back("appended string entry");
+	std::cout << "Resulting entries in payload['a']:" << std::endl;
+	for (auto v: iu->payload()["a"].as_list()) {
+		std::cout << "  " << v << std::endl;
+	}
+	
+	std::cout << std::endl << "Extending payload['a'] by a list of three bools" << std::endl;
+	iu->payload()["a"].extend(std::list<bool>{false, false, true});
+	std::cout << "Resulting entries in payload['a']:" << std::endl;
+	for (auto v: iu->payload()["a"].as_list()) {
+		std::cout << "  " << v << std::endl;
+	}
+	
 	return 0;
 }
 //}}}
@@ -192,7 +206,6 @@ int json_testbed_main(int argc, char** argv)//{{{
 }
 //}}}
 
-/*
 int fakeiu_main(int argc, char** argv)//{{{
 {
 	//if (argc<2) {
@@ -318,7 +331,6 @@ int fakeiu_main(int argc, char** argv)//{{{
 	return 0;
 }
 //}}}
-*/
 
 int legacy_iu_main(int argc, char** argv)//{{{
 {