diff --git a/all.sas b/all.sas
index ef3edac..cbfafcf 100644
--- a/all.sas
+++ b/all.sas
@@ -19023,6 +19023,150 @@ run;
options &optval;
%mend ms_createfile;
+/**
+ @file
+ @brief Creates a user on SASjs Server
+ @details Creates a user on SASjs Server with the following attributes:
+
+ @li UserName
+ @li Password
+ @li isAdmin
+ @li displayName
+
+ The userid is created by sasjs/server. All users are created with `isActive`
+ set to `true`.
+
+ Example:
+
+ %ms_createuser(newuser,secretpass,displayname=New User!)
+
+ @param [in] username The username to apply. No spaces or special characters.
+ @param [in] password The initial password to set.
+ @param [in] isadmin= (false) Set to true to give the user admin rights
+ @param [in] displayName= (0) Set a friendly name (spaces & special characters
+ are ok). If not provided, username will be used instead.
+ @param [in] mdebug= (0) Set to 1 to enable DEBUG messages
+ @param [out] outds= (work.ms_createuser) This output dataset will contain the
+ values from the JSON response (such as the id of the new user)
+|ID:best.|DISPLAYNAME:$8.|USERNAME:$8.|ISACTIVE:best.|ISADMIN:best.|
+|---|---|---|---|---|
+|`6 `|`New User `|`newuser `|`1 `|`0 `|
+
+
+
+
SAS Macros
+ @li mf_getuniquefileref.sas
+ @li mf_getuniquelibref.sas
+ @li mp_abort.sas
+
+ Related Files
+ @li ms_createuser.test.sas
+ @li ms_getusers.sas
+
+**/
+
+%macro ms_createuser(username,password
+ ,isadmin=false
+ ,displayname=0
+ ,outds=work.ms_createuser
+ ,mdebug=0
+ );
+
+%mp_abort(
+ iftrue=(&syscc ne 0)
+ ,mac=ms_createuser.sas
+ ,msg=%str(syscc=&syscc on macro entry)
+)
+
+%local fref0 fref1 fref2 libref optval rc msg;
+%let fref0=%mf_getuniquefileref();
+%let fref1=%mf_getuniquefileref();
+%let fref2=%mf_getuniquefileref();
+%let libref=%mf_getuniquelibref();
+
+/* avoid sending bom marker to API */
+%let optval=%sysfunc(getoption(bomfile));
+options nobomfile;
+
+data _null_;
+ file &fref0 termstr=crlf;
+ username=quote(cats(symget('username')));
+ password=quote(cats(symget('password')));
+ isadmin=symget('isadmin');
+ displayname=quote(cats(symget('displayname')));
+ if displayname='"0"' then displayname=username;
+
+%if &mdebug=1 %then %do;
+ putlog _all_;
+%end;
+
+ put '{'@;
+ put '"displayName":' displayname @;
+ put ',"username":' username @;
+ put ',"password":' password @;
+ put ',"isAdmin":' isadmin @;
+ put ',"isActive": true }';
+run;
+
+data _null_;
+ file &fref1 lrecl=1000;
+ infile "&_sasjs_tokenfile" lrecl=1000;
+ input;
+ put "Authorization: Bearer " _infile_;
+ put "Content-Type: application/json";
+ put "accept: application/json";
+run;
+
+%if &mdebug=1 %then %do;
+ data _null_;
+ infile &fref0;
+ input;
+ put _infile_;
+ data _null_;
+ infile &fref1;
+ input;
+ put _infile_;
+ run;
+%end;
+
+proc http method='POST' in=&fref0 headerin=&fref1 out=&fref2
+ url="&_sasjs_apiserverurl/SASjsApi/user";
+%if &mdebug=1 %then %do;
+ debug level=1;
+%end;
+run;
+
+%mp_abort(
+ iftrue=(&syscc ne 0)
+ ,mac=ms_createuser.sas
+ ,msg=%str(Issue submitting query to SASjsApi/user)
+)
+
+libname &libref JSON fileref=&fref2;
+
+data &outds;
+ set &libref..root;
+ drop ordinal_root;
+run;
+
+
+%mp_abort(
+ iftrue=(&syscc ne 0)
+ ,mac=ms_createuser.sas
+ ,msg=%str(Issue reading response JSON)
+)
+
+/* reset options */
+options &optval;
+
+%if &mdebug=1 %then %do;
+ filename &fref0 clear;
+ filename &fref1 clear;
+ filename &fref2 clear;
+ libname &libref clear;
+%end;
+
+%mend ms_createuser;
/**
@file
@brief Deletes a file from SASjs Drive
@@ -19121,6 +19265,113 @@ filename &binaryfref clear;
filename &headref clear;
%mend ms_getfile;/**
+ @file
+ @brief Fetches the list of users from SASjs Server
+ @details Fetches the list of users from SASjs Server and writes them to an
+ output dataset.
+
+ Example:
+
+ %ms_getusers(outds=userlist)
+
+ @param [in] mdebug= (0) Set to 1 to enable DEBUG messages
+ @param [out] outds= (work.ms_getusers) This output dataset will contain the
+ list of user accounts. Format:
+|DISPLAYNAME:$18.|USERNAME:$10.|ID:best.|
+|---|---|---|
+|`Super Admin `|`secretuser `|`1`|
+|`Sabir Hassan`|`sabir`|`2`|
+|`Mihajlo Medjedovic `|`mihajlo `|`3`|
+|`Ivor Townsend `|`ivor `|`4`|
+|`New User `|`newuser `|`5`|
+
+
+
+ SAS Macros
+ @li mf_getuniquefileref.sas
+ @li mf_getuniquelibref.sas
+ @li mp_abort.sas
+
+ Related Files
+ @li ms_createuser.sas
+ @li ms_getusers.test.sas
+
+**/
+
+%macro ms_getusers(
+ outds=work.ms_getusers
+ ,mdebug=0
+ );
+
+%mp_abort(
+ iftrue=(&syscc ne 0)
+ ,mac=ms_getusers.sas
+ ,msg=%str(syscc=&syscc on macro entry)
+)
+
+%local fref0 fref1 libref optval rc msg;
+%let fref0=%mf_getuniquefileref();
+%let fref1=%mf_getuniquefileref();
+%let libref=%mf_getuniquelibref();
+
+/* avoid sending bom marker to API */
+%let optval=%sysfunc(getoption(bomfile));
+options nobomfile;
+
+data _null_;
+ file &fref0 lrecl=1000;
+ infile "&_sasjs_tokenfile" lrecl=1000;
+ input;
+ put "Authorization: Bearer " _infile_;
+ put "accept: application/json";
+run;
+
+%if &mdebug=1 %then %do;
+ data _null_;
+ infile &fref0;
+ input;
+ put _infile_;
+ run;
+%end;
+
+proc http method='GET' headerin=&fref0 out=&fref1
+ url="&_sasjs_apiserverurl/SASjsApi/user";
+%if &mdebug=1 %then %do;
+ debug level=1;
+%end;
+run;
+
+%mp_abort(
+ iftrue=(&syscc ne 0)
+ ,mac=ms_getusers.sas
+ ,msg=%str(Issue submitting GET query to SASjsApi/user)
+)
+
+libname &libref JSON fileref=&fref1;
+
+data &outds;
+ set &libref..root;
+ drop ordinal_root;
+run;
+
+
+%mp_abort(
+ iftrue=(&syscc ne 0)
+ ,mac=ms_getusers.sas
+ ,msg=%str(Issue reading response JSON)
+)
+
+/* reset options */
+options &optval;
+
+%if &mdebug=1 %then %do;
+ filename &fref0 clear;
+ filename &fref1 clear;
+ libname &libref clear;
+%end;
+
+%mend ms_getusers;
+/**
@file
@brief Executes a SASjs Server Stored Program
@details Runs a Stored Program (using POST method) and extracts the webout and