Index: /cpp/frams/param/mutableparam.cpp
===================================================================
--- /cpp/frams/param/mutableparam.cpp	(revision 823)
+++ /cpp/frams/param/mutableparam.cpp	(revision 824)
@@ -1,4 +1,4 @@
 // This file is a part of Framsticks SDK.  http://www.framsticks.com/
-// Copyright (C) 1999-2015  Maciej Komosinski and Szymon Ulatowski.
+// Copyright (C) 1999-2018  Maciej Komosinski and Szymon Ulatowski.
 // See LICENSE.txt for details.
 
@@ -8,8 +8,9 @@
 #define FIELDSTRUCT MutableParam
 ParamEntry MutableParam::pe_tab[] =
-{
+{ //TODO: these names are visible for scripts in ExpProperties, ShowProperties, etc. add some reserved prefix to avoid conflicts with script-defined properties!
 	{ "clear", 0, PARAM_DONTSAVE | PARAM_USERHIDDEN, "remove all properties", "p", PROCEDURE(p_clear), },
 	{ "add", 0, PARAM_DONTSAVE | PARAM_USERHIDDEN, "add property (id,type,name,help)", "p", PROCEDURE(p_addprop), },
 	{ "remove", 0, PARAM_DONTSAVE | PARAM_USERHIDDEN, "remove property (index)", "p", PROCEDURE(p_remprop), },
+	{ "change", 0, PARAM_DONTSAVE | PARAM_USERHIDDEN, "change property (id,type,name,flags,help)", "p", PROCEDURE(p_changeprop), },
 	{ "addGroup", 0, PARAM_DONTSAVE | PARAM_USERHIDDEN, "add group (name)", "p", PROCEDURE(p_addgroup), },
 	{ "removeGroup", 0, PARAM_DONTSAVE | PARAM_USERHIDDEN, "remove group (index)", "p", PROCEDURE(p_remgroup), },
@@ -133,5 +134,5 @@
 	if (d && (pe->flags & MUTPARAM_ALLOCDATA))
 		switch (pe->type[0])
-	{
+		{
 		case 'd': delete (paInt*)d; break;
 		case 'f': delete (double*)d; break;
@@ -139,5 +140,5 @@
 		case 'x': delete (ExtValue*)d; break;
 		case 'o': delete (ExtObject*)d; break;
-	}
+		}
 	entries -= i - staticprops;
 	if (pe->flags & MUTPARAM_ALLOCENTRY)
@@ -184,8 +185,44 @@
 }
 
+static void changeString(const char* (&s), const char* newstr)
+{
+	if ((newstr != NULL) && (newstr[0] == 0)) newstr = NULL;
+	if ((s == NULL) && (newstr == NULL)) return;
+	if ((s != NULL) && (newstr != NULL) && (strcmp(s, newstr) == 0)) return;
+	if (s != NULL) { free((void*)s); s = NULL; }
+	if (newstr != NULL) s = strdup(newstr);
+}
+
+bool MutableParam::changeProperty(int i, const char* id, const char* type, const char* name, const char* help, int flags, int group)
+{
+	ParamEntry *pe = entry(i);
+	if ((!id) && (!type)) return false;
+	if (!isValidTypeDescription(type)) return false;
+	pe->group = (paInt)group;
+	pe->flags = (pe->flags & (MUTPARAM_ALLOCENTRY | MUTPARAM_ALLOCDATA)) | (flags & ~(MUTPARAM_ALLOCENTRY | MUTPARAM_ALLOCDATA));
+	changeString(pe->id, id);
+	changeString(pe->name, name);
+	changeString(pe->type, type);
+	changeString(pe->help, help);
+	onchange.action(i);
+	return true;
+}
+
 void MutableParam::p_addprop(ExtValue *args, ExtValue *ret)
 {
 	int i = addProperty(0, args[2].getString().c_str(), args[1].getString().c_str(), args[0].getString().c_str());
 	ret->setInt(i);
+}
+
+void MutableParam::p_changeprop(ExtValue *args, ExtValue *ret)
+{
+	int i = findId(args[4].getString().c_str());
+	if (i >= staticprops)
+	{
+		changeProperty(i, args[4].getString().c_str(), args[3].getString().c_str(), args[2].getString().c_str(), args[0].getString().c_str(), args[1].getInt(), entry(i)->group);
+		ret->setInt(i);
+	}
+	else
+		ret->setEmpty();
 }
 
Index: /cpp/frams/param/mutableparam.h
===================================================================
--- /cpp/frams/param/mutableparam.h	(revision 823)
+++ /cpp/frams/param/mutableparam.h	(revision 824)
@@ -16,5 +16,5 @@
 class MutableParam : public SimpleAbstractParam, public MutableParamInterface
 {
-	static const int staticprops = 7;
+	static const int staticprops = 8;
 	static ParamEntry pe_tab[];
 	/** group #0 cannot be removed by scripting  */
@@ -52,4 +52,6 @@
 	ParamEntry * removeProperty(int i);
 
+	bool changeProperty(int i, const char* id, const char* type, const char* name, const char* help, int flags, int group);
+
 	void notify(int id);
 
@@ -64,4 +66,5 @@
 	PARAMPROCDEF(p_addprop);
 	PARAMPROCDEF(p_remprop);
+	PARAMPROCDEF(p_changeprop);
 	PARAMPROCDEF(p_addgroup);
 	PARAMPROCDEF(p_remgroup);
