diff --git a/restemplate.lpi b/restemplate.lpi
index 0c29171..81c6cb3 100644
--- a/restemplate.lpi
+++ b/restemplate.lpi
@@ -19,8 +19,33 @@
     
       
     
-    
+    
       
+      
+        
+          
+          
+            
+          
+          
+            
+            
+            
+          
+          
+            
+            
+              
+            
+          
+          
+            
+              
+            
+            
+          
+        
+      
     
     
       
diff --git a/restemplate.lpr b/restemplate.lpr
index d789a4c..3a25665 100644
--- a/restemplate.lpr
+++ b/restemplate.lpr
@@ -20,7 +20,8 @@
 program restemplate;
 
 uses
-  SysUtils, Classes, strutils, JTemplate, httpsend;
+  SysUtils, Classes, strutils, JTemplate, httpsend, IniFiles,
+  ssl_openssl;
 
 var
   data: TextFile;
@@ -30,14 +31,29 @@ var
   method: String;
   content: TStringList;
   commandMode: Boolean;
+  configDir, templateDir: String;
+  templateFile, templateName: String;
+  sessionIni: TIniFile;
 
 procedure CmdAskUser(AName: String);
 var
-  value: String;
+  value, default: String;
 begin
-  Write(AName, ': ');
+  Write(AName);
+  default := sessionIni.ReadString(templateName, AName, '');
+  if default <> '' then
+    Write(' [', default, ']: ')
+  else
+    Write(': ');
+
   ReadLn(value);
+
+  if value = '' then
+    value := default;
+
   parser.Fields.Add(AName, value);
+
+  sessionIni.WriteString(templateName, AName, value);
 end;
 
 procedure CmdHeader(AHeader: String);
@@ -70,7 +86,11 @@ begin
     content.LoadFromStream(http.Document);
     writeln(content.Text);
   end else
-    writeln('FAILED !!!');
+  begin
+    ExitCode := 2;
+    writeln;
+    writeln('FAILED! Last Socket Error: ', http.Sock.SocksLastError);
+  end;
 end;
 
 function ProcessCommand(ALine: String): Boolean;
@@ -98,10 +118,53 @@ begin
   end;
 end;
 
+procedure ListProfiles;
+var
+  sr: TSearchRec;
 begin
-  AssignFile(data, ParamStr(1));
+  Writeln('Known profiles:');
+  if FindFirst(templateDir + '*.rest', faAnyFile, sr) = 0 then
+  begin
+    repeat
+      writeln('  ', Copy(sr.Name, 1, Length(sr.Name) - 5));
+    until FindNext(sr) <> 0;
+  end;
+end;
+
+begin
+  configDir := GetAppConfigDir(False);
+  templateDir := configDir + 'templates' + PathDelim;
+
+  templateFile := templateDir + ParamStr(1) + '.rest';
+
+  if ParamCount <> 1 then
+  begin
+    Writeln('Usage: ', ExtractFileName(ParamStr(0)), ' ');
+    Writeln;
+    ListProfiles;
+    Halt(0);
+  end;
+
+  if FileExists(ParamStr(1)) then
+  begin
+    AssignFile(data, ParamStr(1));
+    templateName := ExtractFileName(ParamStr(1));
+    if AnsiEndsStr('.rest', templateName) then
+      templateName := Copy(templateName, 1, Length(templateName) - 5);
+  end else
+  if FileExists(templateFile) then
+  begin
+    AssignFile(data, templateFile);
+    templateName := ParamStr(1);
+  end else
+  begin
+    writeln('Template not found!');
+    Halt(1);
+  end;
   Reset(data);
 
+  sessionIni := TIniFile.Create(configDir + 'session.ini');
+
   parser := TJTemplateParser.Create;
   http := THTTPSend.Create;
   content := TStringList.Create;
@@ -118,6 +181,7 @@ begin
       content.Add(line);
   end;
 
+  sessionIni.Free;
   parser.Free;
   http.Free;
   content.Free;