diff --git a/corsscripts/stackjsxgraph.min.js b/corsscripts/stackjsxgraph.min.js
index 488d4e13d151fcbbe55ec6897c004b8c30473778..b43273fae533af2fa0338a24671bede432d58960 100644
--- a/corsscripts/stackjsxgraph.min.js
+++ b/corsscripts/stackjsxgraph.min.js
@@ -1 +1 @@
-"use strict";var{keys:cC}=Object,A=a=>typeof a=='string',b={},c={},d={},_=[],f={},g={},h=!1,s={define_group:function(aL){var l=[];for(var i=0;i<aL.length;i++)l.indexOf(aL[i].id)==-1&&l.push(aL[i].id);_.push(l)},starts_moved:function(aM){if(aM.id in f){for(var i=0;i<f[aM.id].length;i++)d[f[aM.id][i]]=null;p(aM)}},clear_initial:function(aN){if(aN.id in f)for(var i=0;i<f[aN.id].length;i++)d[f[aN.id][i]]=null},custom_bind:function(aO,aP,aQ,aR,_E){B(aO);d[aO]=aP();var _F=document.getElementById(aO);_F.value&&_F.value!=''&&aQ(_F.value);c[aO].push(aQ);for(var i=0;i<aR.length;i++)this.register_object(aO,aR[i],aP,_E)},register_object:function(aS,aT,aU,aV){aT.id in f?!(aS in f[aT.id])&&f[aT.id].push(aS):f[aT.id]=[aS];!(aS in b)&&B(aS);b[aS][aT.id]=aU;j(aT,aV)},bind_point:function(aW,aX){this.custom_bind(aW,(()=>k(aX)),(aY=>L(aX,aY)),[aX])},bind_point_dual:function(aZ,bA,bB){this.custom_bind(aZ,(()=>JSON.stringify([[bA.X(),bA.Y()],[bB.X(),bB.Y()]])),(bC=>{var bD=JSON.parse(bC);m(bA,bD[0]);m(bB,bD[1])}),[bA,bB])},bind_point_relative:function(bE,bF,bG){this.custom_bind(bE,(()=>JSON.stringify([[bF.X(),bF.Y()],[bG.X()-bF.X(),bG.Y()-bF.Y()]])),(bH=>{var bI=JSON.parse(bH);m(bF,bI[0]);bI[1][0]=bI[1][0]+bI[0][0];bI[1][1]=bI[1][1]+bI[0][1];m(bG,bI[1])}),[bF,bG])},bind_point_direction:function(bJ,bK,bL){this.custom_bind(bJ,(()=>JSON.stringify([[bK.X(),bK.Y()],[Math.atan2(bL.Y()-bK.Y(),bL.X()-bK.X()),Math.sqrt((bL.X()-bK.X())*(bL.X()-bK.X())+(bL.Y()-bK.Y())*(bL.Y()-bK.Y()))]])),(bM=>{var bN=JSON.parse(bM),bO=bN[1][0],bP=bN[1][1];m(bK,bN[0]);bN[1][0]=bN[0][0]+bP*Math.cos(bO);bN[1][1]=bN[0][1]+bP*Math.sin(bO);m(bL,bN[1])}),[bK,bL])},bind_slider:function(bQ,bR){this.custom_bind(bQ,(()=>n(bR)),(bS=>o(bR,bS)),[bR])},bind_list_of:function(bT,bU){this.custom_bind(bT,(()=>{var r='[';for(var i=0;i<bU.length;i++){var bV=bU[i];bV.getType()=='slider'?r=r+JSON.stringify(bV.Value())+',':r=r+k(bV)+','}r=r.substring(0,r.length-1);return`${r}]`}),(bW=>{var bX=JSON.parse(bW);for(var i=0;(i<bU.length&&i<bX.length);i++){var bY=bU[i];bY.getType()=='slider'?bY.setValue(bX[i]):m(bY,bX[i])}}),bU)},stack2jsxgraph:function(bZ){var t;t=bZ.replaceAll('%pi','PI').replaceAll('%e','EULER').replaceAll('%phi','1.618033988749895').replaceAll('%gamma','0.5772156649015329').trim();t[0]=='['&&t[t.length-1]==']'&&(t=t.slice(1,-1).split(/\s*,\s*/));return t}};function B(C){if(!(C in b)){b[C]={};c[C]=[];var _b=document.getElementById(C);_b.addEventListener('input',()=>R(C));_b.addEventListener('change',()=>R(C))}}function j(_a,D){D==void 0?D=['update']:A(D)||D instanceof String&&(D=[D]);for(const _A of D){!(_A in g)&&(g[_A]={});!(_a.id in g[_A])&&(_a.board.on(_A,()=>q(_a.id)),g[_A][_a.id]=_a)}}function k(E){return JSON.stringify([E.X(),E.Y()])}function L(aA,_B){try {var _c=JSON.parse(_B);typeof _c[0]=='number'&&typeof _c[1]=='number'&&(aA.setPosition(JXG.COORDS_BY_USER,_c),aA.board.update(),aA.update())} catch {}}function m(aB,aC){try {typeof aC[0]=='number'&&typeof aC[1]=='number'&&(aB.setPosition(JXG.COORDS_BY_USER,aC),aB.board.update(),aB.update())} catch {}}function n(aD){return JSON.stringify(aD.Value())}function o(aE,aF){try {aE.setValue(JSON.parse(aF));aE.board.update();aE.update()} catch {}}function p(aG){q(aG.id)}function q(aH){if(!h){h=!0;try {var aI=[];if(aH in f)for(var i=0;i<f[aH].length;i++){var _d=f[aH][i];if(aI.indexOf(_d)==-1){aI.push(_d);var _e=document.getElementById(_d),F=b[_d][aH]();if(F!==d[_d]){d[_d]=null;_e.value=F}else{h=!1;return}}}for(var G=0;G<_.length;G++){var H=_[G];if(H.indexOf(aH)!==-1)for(var I=0;I<H.length;I++){var J=H[I];if(J!==aH&&J in f)for(var i=0;i<f[J].length;i++){var _d=f[J][i];if(aI.indexOf(_d)==-1){d[_d]=null;aI.push(_d);var _e=document.getElementById(_d);_e.value=b[_d][J]()}}}}for(var i=0;i<aI.length;i++){var _e=document.getElementById(aI[i]);var e=new Event('change');_e.dispatchEvent(e)}} catch {}h=!1}}function R(aJ){if(aJ in c){var aK=document.getElementById(aJ),_C=cC(b[aJ]),_D=!1;for(var i=0;i<_C.length;i++){var _f=b[aJ][_C[i]]();_f!==aK.value&&(_D=!0,i=_C.length+1)}if(_D)for(var i=0;i<c[aJ].length;i++)c[aJ][i](aK.value)}}export{s as stack_jxg};export default s;
+"use strict";var serializers={};var deserializers={};var initials={};var objectgroups=[];var objectinput={};var registeredobjects={};var active=false;function _commonsetup(inputname){if(!(inputname in serializers)){serializers[inputname]={};deserializers[inputname]=[];var input=document.getElementById(inputname);input.addEventListener("input",()=>generalinputupdatehandler(inputname));input.addEventListener("change",()=>generalinputupdatehandler(inputname))}}function registerobject(object,eventtype){if(eventtype===undefined){eventtype=["update"]}else if(typeof eventtype==="string"||eventtype instanceof String){eventtype=[eventtype]}eventtype.forEach(et=>{if(!(et in registeredobjects)){registeredobjects[et]={}}if(!(object.id in registeredobjects[et])){object.board.on(et,()=>generalobjectupdatehandlerid(object.id));registeredobjects[et][object.id]=object}})}function pointserializer(point){return JSON.stringify([point.X(),point.Y()])}function pointdeserializer(point,data){try{var tmp=JSON.parse(data);if(typeof tmp[0]=="number"&&typeof tmp[1]=="number"){point.setPosition(JXG.COORDS_BY_USER,tmp);point.board.update();point.update()}}catch(err){}}function pointdeserializerparsed(point,data){try{if(typeof data[0]=="number"&&typeof data[1]=="number"){point.setPosition(JXG.COORDS_BY_USER,data);point.board.update();point.update()}}catch(err){}}function sliderserializer(slider){return JSON.stringify(slider.Value())}function sliderdeserializer(slider,data){try{slider.setValue(JSON.parse(data));slider.board.update();slider.update()}catch(err){}}function generalobjectupdatehandler(object){generalobjectupdatehandlerid(object.id)}function generalobjectupdatehandlerid(id){if(!active){active=true;try{var handledinputs=[];if(id in objectinput){for(var i=0;i<objectinput[id].length;i++){var inputname=objectinput[id][i];if(handledinputs.indexOf(inputname)===-1){handledinputs.push(inputname);var input=document.getElementById(inputname);var val=serializers[inputname][id]();if(val!==initials[inputname]){initials[inputname]=null;input.value=val}else{active=false;return}}}}for(var gi=0;gi<objectgroups.length;gi++){var group=objectgroups[gi];if(group.indexOf(id)!==-1){for(var gt=0;gt<group.length;gt++){var obj=group[gt];if(obj!==id){if(obj in objectinput){for(var i=0;i<objectinput[obj].length;i++){var inputname=objectinput[obj][i];if(handledinputs.indexOf(inputname)===-1){initials[inputname]=null;handledinputs.push(inputname);var input=document.getElementById(inputname);input.value=serializers[inputname][obj]()}}}}}}}for(var i=0;i<handledinputs.length;i++){var input=document.getElementById(handledinputs[i]);var e=new Event("change");input.dispatchEvent(e)}}catch(err){}active=false}}function generalinputupdatehandler(inputname){if(inputname in deserializers){var input=document.getElementById(inputname);var keys=Object.keys(serializers[inputname]);var ok=false;for(var i=0;i<keys.length;i++){var old=serializers[inputname][keys[i]]();if(old!==input.value){ok=true;i=keys.length+1}}if(ok){for(var i=0;i<deserializers[inputname].length;i++){deserializers[inputname][i](input.value)}}}}export const stack_jxg={define_group:function(list){var l=[];for(var i=0;i<list.length;i++){if(l.indexOf(list[i].id)===-1){l.push(list[i].id)}}objectgroups.push(l)},starts_moved:function(obj){if(obj.id in objectinput){for(var i=0;i<objectinput[obj.id].length;i++){initials[objectinput[obj.id][i]]=null}generalobjectupdatehandler(obj)}},clear_initial:function(obj){if(obj.id in objectinput){for(var i=0;i<objectinput[obj.id].length;i++){initials[objectinput[obj.id][i]]=null}}},custom_bind:function(input,serializer,deserializer,objects,eventtypes){_commonsetup(input);initials[input]=serializer();var theInput=document.getElementById(input);if(theInput.value&&theInput.value!=""){deserializer(theInput.value)}deserializers[input].push(deserializer);for(var i=0;i<objects.length;i++){this.register_object(input,objects[i],serializer,eventtypes)}},register_object:function(input,object,serializer,eventtypes){if(object.id in objectinput){if(!(input in objectinput[object.id])){objectinput[object.id].push(input)}}else{objectinput[object.id]=[input]}if(!(input in serializers)){_commonsetup(input)}serializers[input][object.id]=serializer;registerobject(object,eventtypes)},bind_point:function(inputRef,point){var serializer=()=>pointserializer(point);var deserializer=value=>pointdeserializer(point,value);this.custom_bind(inputRef,serializer,deserializer,[point])},bind_point_dual:function(inputRef,p1,p2){var serializer=()=>{return JSON.stringify([[p1.X(),p1.Y()],[p2.X(),p2.Y()]])};var deserializer=value=>{var tmp=JSON.parse(value);pointdeserializerparsed(p1,tmp[0]);pointdeserializerparsed(p2,tmp[1])};this.custom_bind(inputRef,serializer,deserializer,[p1,p2])},bind_point_relative:function(inputRef,p1,p2){var serializer=()=>{return JSON.stringify([[p1.X(),p1.Y()],[p2.X()-p1.X(),p2.Y()-p1.Y()]])};var deserializer=value=>{var tmp=JSON.parse(value);pointdeserializerparsed(p1,tmp[0]);tmp[1][0]=tmp[1][0]+tmp[0][0];tmp[1][1]=tmp[1][1]+tmp[0][1];pointdeserializerparsed(p2,tmp[1])};this.custom_bind(inputRef,serializer,deserializer,[p1,p2])},bind_point_direction:function(inputRef,p1,p2){var serializer=()=>{return JSON.stringify([[p1.X(),p1.Y()],[Math.atan2(p2.Y()-p1.Y(),p2.X()-p1.X()),Math.sqrt((p2.X()-p1.X())*(p2.X()-p1.X())+(p2.Y()-p1.Y())*(p2.Y()-p1.Y()))]])};var deserializer=value=>{var tmp=JSON.parse(value);pointdeserializerparsed(p1,tmp[0]);var angle=tmp[1][0];var len=tmp[1][1];tmp[1][0]=tmp[0][0]+len*Math.cos(angle);tmp[1][1]=tmp[0][1]+len*Math.sin(angle);pointdeserializerparsed(p2,tmp[1])};this.custom_bind(inputRef,serializer,deserializer,[p1,p2])},bind_slider:function(inputRef,slider){var serializer=()=>sliderserializer(slider);var deserializer=value=>sliderdeserializer(slider,value);this.custom_bind(inputRef,serializer,deserializer,[slider])},bind_list_of:function(inputRef,list_of_objects){var serializer=()=>{var r="[";for(var i=0;i<list_of_objects.length;i++){var obj=list_of_objects[i];if(obj.getType()==="slider"){r=r+JSON.stringify(obj.Value())+","}else{r=r+pointserializer(obj)+","}}r=r.substring(0,r.length-1);return r+"]"};var deserializer=value=>{var tmp=JSON.parse(value);for(var i=0;i<list_of_objects.length&&i<tmp.length;i++){var obj=list_of_objects[i];if(obj.getType()==="slider"){obj.setValue(tmp[i])}else{pointdeserializerparsed(obj,tmp[i])}}};this.custom_bind(inputRef,serializer,deserializer,list_of_objects)},stack2jsxgraph:function(str){var t;t=str.replace(/%pi/g,"PI").replace(/%e/g,"EULER").replace(/%phi/g,"1.618033988749895").replace(/%gamma/g,"0.5772156649015329").trim();if(t[0]==="["&&t[t.length-1]==="]"){t=t.slice(1,-1).split(/\s*,\s*/)}return t}};export default stack_jxg;
diff --git a/doc/en/Developer/Updating_JSXGraph.md b/doc/en/Developer/Updating_JSXGraph.md
index 796c8ad9f7eedad3e6d736b7509c88a89e9673fb..0dfde3ca902c094602b8cf0714e694d73506601c 100644
--- a/doc/en/Developer/Updating_JSXGraph.md
+++ b/doc/en/Developer/Updating_JSXGraph.md
@@ -8,7 +8,9 @@ Download JSXGraph from here: [https://github.com/jsxgraph/jsxgraph](https://gith
 
 The files one needs to copy over are `jsxgraph.min.css` and `jsxgraphcore.min.js`, there is no need to copy the non minified versions.
 
-The old STACK side `jsxgraph.js` that provided the `stack_jxg` features is now called `stackjsxgraph.js` and is being served from that same CORS-header tuning directory with that specific script.
+The old STACK side `jsxgraph.js` that provided the `stack_jxg` features is now called `stackjsxgraph.js` and is being served from that same CORS-header tuning directory with that specific script. (Minification can be done using uglify-js:  
+`npm install -g uglify-js`  
+`uglifyjs stackjsxgraph.js > stackjsxgraph.min.js`.)
 
 We do not apply Moodles or any other systems JavaScript processing on these, no need to run `grunt` or any such tool.