diff --git a/base/mf_writefile.sas b/base/mf_writefile.sas
new file mode 100644
index 0000000..74fd800
--- /dev/null
+++ b/base/mf_writefile.sas
@@ -0,0 +1,67 @@
+/**
+ @file
+ @brief Creates a text file using pure macro
+ @details Creates a text file of up to 10 lines. If further lines are
+ desired, feel free to [create an issue](
+ https://github.com/sasjs/core/issues/new), or make a pull request!
+
+ The use of PARMBUFF was considered for this macro, but it would have made
+ things problematic for writing lines containing commas.
+
+ Usage:
+
+ %mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=more content)
+ data _null_;
+ infile "&sasjswork/myfile.txt";
+ input;
+ list;
+ run;
+
+ @param [in] fpath Full path to file to be created or appended to
+ @param [in] mode= (O) Available options are A or O as follows:
+ @li A APPEND mode, writes new records after the current end of the file.
+ @li O OUTPUT mode, writes new records from the beginning of the file.
+ @param [in] l1= First line
+ @param [in] l2= Second line (etc through to l10)
+
+
Related Macros
+ @li mf_writefile.test.sas
+
+ @version 9.2
+ @author Allan Bowe
+**/
+/** @cond */
+
+%macro mf_writefile(fpath,mode=O,l1=,l2=,l3=,l4=,l5=,l6=,l7=,l8=,l9=,l10=
+)/*/STORE SOURCE*/;
+%local fref rc fid i total_lines;
+
+/* find number of lines by reference to first non-blank param */
+%do i=10 %to 1 %by -1;
+ %if %str(&&l&i) ne %str() %then %goto continue;
+%end;
+%continue:
+%let total_lines=&i;
+
+%if %sysfunc(filename(fref,&fpath)) ne 0 %then %do;
+ %put &=fref &=fpath;
+ %put %str(ERR)OR: %sysfunc(sysmsg());
+ %return;
+%end;
+
+%let fid=%sysfunc(fopen(&fref,&mode));
+
+%if &fid=0 %then %do;
+ %put %str(ERR)OR: %sysfunc(sysmsg());
+ %return;
+%end;
+
+%do i=1 %to &total_lines;
+ %let rc=%sysfunc(fput(&fid, &&l&i));
+ %let rc=%sysfunc(fwrite(&fid));
+%end;
+%let rc=%sysfunc(fclose(&fid));
+%let rc=%sysfunc(filename(&fref));
+
+%mend mf_writefile;
+/** @endcond */
\ No newline at end of file
diff --git a/tests/crossplatform/mf_writefile.test.sas b/tests/crossplatform/mf_writefile.test.sas
new file mode 100644
index 0000000..5472243
--- /dev/null
+++ b/tests/crossplatform/mf_writefile.test.sas
@@ -0,0 +1,74 @@
+/**
+ @file
+ @brief Testing mf_writefile.sas macro
+
+ SAS Macros
+ @li mf_writefile.sas
+ @li mp_assert.sas
+
+**/
+
+%mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=more content)
+data _null_;
+ infile "&sasjswork/myfile.txt";
+ input;
+ if _n_=2 then call symputx('test1',_infile_);
+run;
+
+%mp_assert(
+ iftrue=(&syscc=0),
+ desc=Check code ran without errors,
+ outds=work.test_results
+)
+%mp_assert(
+ iftrue=(&test1=more content),
+ desc=Checking line was created,
+ outds=work.test_results
+)
+
+%mf_writefile(&sasjswork/myfile.txt,l1=some content,l2=different content)
+data _null_;
+ infile "&sasjswork/myfile.txt";
+ input;
+ if _n_=2 then call symputx('test2',_infile_);
+run;
+
+%mp_assert(
+ iftrue=(&syscc=0),
+ desc=Check code ran without errors for test2,
+ outds=work.test_results
+)
+%mp_assert(
+ iftrue=(&test2=different content),
+ desc=Checking second line was overwritten,
+ outds=work.test_results
+)
+
+%global test3 test4;
+%mf_writefile(&sasjswork/myfile.txt
+ ,mode=a
+ ,l1=%str(aah, content)
+ ,l2=append content
+)
+data _null_;
+ infile "&sasjswork/myfile.txt";
+ input;
+ if _n_=2 then call symputx('test3',_infile_);
+ if _n_=4 then call symputx('test4',_infile_);
+run;
+
+%mp_assert(
+ iftrue=(&syscc=0),
+ desc=Check code ran without errors for test2,
+ outds=work.test_results
+)
+%mp_assert(
+ iftrue=(&test3=different content),
+ desc=Checking second line was not overwritten,
+ outds=work.test_results
+)
+%mp_assert(
+ iftrue=(&test4=append content),
+ desc=Checking fourth line was appended,
+ outds=work.test_results
+)
\ No newline at end of file