diff --git a/ChangeLog.txt b/ChangeLog.txt
index 2c6290dee7052fe55e2496c58046cd3fb9a9e4db..cf7f8f883077cec21f054a36c28a618651f557aa 100644
--- a/ChangeLog.txt
+++ b/ChangeLog.txt
@@ -6,6 +6,11 @@
 
 JSONlab ChangeLog (key features marked by *):
 
+== JSONlab 1.0.0-RC2 (codename: Optimus - RC2), FangQ <fangq (at) nmr.mgh.harvard.edu> ==
+
+ 2014/11/17 add Compact option in savejson to output compact JSON format
+ 2014/11/17 add FastArrayParser in loadjson to specify fast parser applicable levels
+
 == JSONlab 1.0.0-RC1 (codename: Optimus - RC1), FangQ <fangq (at) nmr.mgh.harvard.edu> ==
 
  2014/09/17  fix several compatibility issues when running on octave versions 3.2-3.8
diff --git a/README.txt b/README.txt
index 0085019fe421691bf05c0db8d93169075abe181f..63e001e02bfa2fc238627814de2961f8c32bf72a 100644
--- a/README.txt
+++ b/README.txt
@@ -5,7 +5,7 @@
 
 *Copyright (c) 2011-2014  Qianqian Fang <fangq at nmr.mgh.harvard.edu>
 *License: BSD or GNU General Public License version 3 (GPL v3), see License*.txt
-*Version: 1.0.0-RC1 (Optimus - RC1)
+*Version: 1.0.0-RC1 (Optimus - RC2)
 
 -------------------------------------------------------------------------------
 
diff --git a/examples/jsonlab_selftest.m b/examples/jsonlab_selftest.m
index ab2c038b9584febf44393f205c5466b60344803a..27aee244c4e2a8013f6c3ad1f2d8731ad33893c4 100644
--- a/examples/jsonlab_selftest.m
+++ b/examples/jsonlab_selftest.m
@@ -8,6 +8,7 @@ for i=1:4
     fprintf(1,'===============================================\n>> %s\n',fname);
     json=savejson('data',loadjson(fname));
     fprintf(1,'%s\n',json);
+    fprintf(1,'%s\n',savejson('data',loadjson(fname),'Compact',1));
     data=loadjson(json);
     savejson('data',data,'selftest.json');
     data=loadjson('selftest.json');
@@ -19,9 +20,8 @@ for i=1:4
     fprintf(1,'===============================================\n>> %s\n',fname);
     json=saveubjson('data',loadjson(fname));
     fprintf(1,'%s\n',json);
-    data=loadubjson(json)
-    savejson('',data)
-i
+    data=loadubjson(json);
+    savejson('',data);
     saveubjson('data',data,'selftest.ubj');
     data=loadubjson('selftest.ubj');
 end
diff --git a/savejson.m b/savejson.m
index eafafca9bd9e09035eb9a267c4722c90de90d578..54bcaed70404c68a6968f7d59e86f44934258266 100644
--- a/savejson.m
+++ b/savejson.m
@@ -109,11 +109,17 @@ end
 if((isstruct(obj) || iscell(obj))&& isempty(rootname) && forceroot)
     rootname='root';
 end
-nl=sprintf('\n');
+
+whitespaces=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n'));
 if(jsonopt('Compact',0,opt)==1)
-    nl='';
+    whitespaces=struct('tab','','newline','','sep',',');
+end
+if(~isfield(opt,'whitespaces_'))
+    opt.whitespaces_=whitespaces;
 end
 
+nl=whitespaces.newline;
+
 json=obj2json(rootname,obj,rootlevel,opt);
 if(rootisarray)
     json=sprintf('%s%s',json,nl);
@@ -164,12 +170,10 @@ if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now
     dim=size(item);
 end
 len=numel(item);
-padding0=repmat(sprintf('\t'),1,level);
-padding2=repmat(sprintf('\t'),1,level+1);
-nl=sprintf('\n');
-if(jsonopt('Compact',0,varargin{:})==1)
-    padding0='';padding2='';nl='';
-end
+ws=jsonopt('whitespaces_',struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n')),varargin{:});
+padding0=repmat(ws.tab,1,level);
+padding2=repmat(ws.tab,1,level+1);
+nl=ws.newline;
 if(len>1)
     if(~isempty(name))
         txt=sprintf('%s"%s": [%s',padding0, checkname(name,varargin{:}),nl); name=''; 
@@ -207,13 +211,12 @@ if(ndims(squeeze(item))>2) % for 3D or higher dimensions, flatten to 2D for now
     dim=size(item);
 end
 len=numel(item);
-padding0=repmat(sprintf('\t'),1,level);
-padding2=repmat(sprintf('\t'),1,level+1);
-padding1=repmat(sprintf('\t'),1,level+(dim(1)>1)+(len>1));
-nl=sprintf('\n');
-if(jsonopt('Compact',0,varargin{:})==1)
-    padding0='';padding1='';padding2='';nl='';
-end
+ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'));
+ws=jsonopt('whitespaces_',ws,varargin{:});
+padding0=repmat(ws.tab,1,level);
+padding2=repmat(ws.tab,1,level+1);
+padding1=repmat(ws.tab,1,level+(dim(1)>1)+(len>1));
+nl=ws.newline;
 
 if(~isempty(name)) 
     if(len>1) txt=sprintf('%s"%s": [%s',padding0,checkname(name,varargin{:}),nl); end
@@ -253,15 +256,12 @@ if(~ischar(item))
 end
 item=reshape(item, max(size(item),[1 0]));
 len=size(item,1);
-nl=sprintf('\n');
-padding1=repmat(sprintf('\t'),1,level);
-padding0=repmat(sprintf('\t'),1,level+1);
-if(jsonopt('Compact',0,varargin{:})==1)
-    padding0='';
-    padding1='';
-    nl='';
-end
-sep=sprintf(',%s',nl);
+ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n'));
+ws=jsonopt('whitespaces_',ws,varargin{:});
+padding1=repmat(ws.tab,1,level);
+padding0=repmat(ws.tab,1,level+1);
+nl=ws.newline;
+sep=ws.sep;
 
 if(~isempty(name)) 
     if(len>1) txt=sprintf('%s"%s": [%s',padding1,checkname(name,varargin{:}),nl); end
@@ -297,13 +297,12 @@ function txt=mat2json(name,item,level,varargin)
 if(~isnumeric(item) && ~islogical(item))
         error('input is not an array');
 end
-nl=sprintf('\n');
-padding1=repmat(sprintf('\t'),1,level);
-padding0=repmat(sprintf('\t'),1,level+1);
-if(jsonopt('Compact',0,varargin{:})==1)
-    padding0='';padding1='';nl='';
-end
-sep=sprintf(',%s',nl);
+ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n'));
+ws=jsonopt('whitespaces_',ws,varargin{:});
+padding1=repmat(ws.tab,1,level);
+padding0=repmat(ws.tab,1,level+1);
+nl=ws.newline;
+sep=ws.sep;
 
 if(length(size(item))>2 || issparse(item) || ~isreal(item) || ...
    isempty(item) ||jsonopt('ArrayToStruct',0,varargin{:}))
@@ -369,13 +368,12 @@ txt=sprintf('%s%s%s',txt,padding1,'}');
 
 %%-------------------------------------------------------------------------
 function txt=matdata2json(mat,level,varargin)
-if(jsonopt('Compact',0,varargin{:})==1)
-    tab='';
-    nl='';
-else
-    tab=sprintf('\t');
-    nl=sprintf('\n');    
-end
+
+ws=struct('tab',sprintf('\t'),'newline',sprintf('\n'),'sep',sprintf(',\n'));
+ws=jsonopt('whitespaces_',ws,varargin{:});
+tab=ws.tab;
+nl=ws.newline;
+
 if(size(mat,1)==1)
     pre='';
     post='';