<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>LICENSE</filename>
    </added>
    <added>
      <filename>support/scons/scons_stats.py</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -24,20 +24,20 @@ AlwaysBuild(apicoveraget)
 def textmate_builder(target, source, env):
 	print 'Building Textmate bundle...',
 	sys.stdout.flush()
-	f = open(str(source[0]))
+	f = open(str(source[0]),'w')
 	outdir = str(target[0])
 	if not os.path.exists(outdir):
 		os.makedirs(outdir)
 	textmate.generate_textmate_bundle(f, outdir)
 	print 'done'
 
-build.env.Append(BUILDERS = {'Texmate' : Builder(
+build.env.Append(BUILDERS = {'Textmate' : Builder(
 	action=textmate_builder,
 	source_factory=SCons.Node.FS.default_fs.Entry,
 	target_factory=SCons.Node.FS.default_fs.Dir,
 	multi=0)})
 
 tm_out = path.join(build.dir, 'Titanium.tmbundle')
-textmatet = build.env.Texmate(tm_out, [api_out])
+textmatet = build.env.Textmate(tm_out, [api_out])
 Alias('textmate', textmatet)
 AlwaysBuild(textmatet)</diff>
      <filename>SConscript.docs</filename>
    </modified>
    <modified>
      <diff>@@ -60,7 +60,9 @@
 	}
 	
 	/**
-	 * @tiapi(method=True,returns=void,name=Analytics.addEvent) send an analytics event associated with the application
+	 * @tiapi(method=True,name=Analytics.addEvent,since=0.3) send an analytics event associated with the application
+	 * @tiarg(for=Analytics.addEvent,type=string,name=event) event name
+	 * @tiarg(for=Analytics.addEvent,type=object,name=data,optional=True) event data
 	 */
 	Titanium.API.set(&quot;Titanium.Analytics.addEvent&quot;,function(event,data)
 	{</diff>
      <filename>modules/ti.Analytics/tianalyticsmodule.js</filename>
    </modified>
    <modified>
      <diff>@@ -26,17 +26,76 @@ namespace ti
 		config = new Poco::Util::PropertyFileConfiguration(file_path);
 		this-&gt;file_path = file_path.c_str();
 
+		/**
+		 * @tiapi(method=True,name=App.Properties.getBool,since=0.2) get value as boolean
+		 * @tiarg(for=App.Properties.getBool,name=name,type=string) the property name
+	     * @tiresult(for=App.Properties.getBool,type=boolean) returns the value as a boolean
+		 */
 		SetMethod(&quot;getBool&quot;, &amp;PropertiesBinding::GetBool);
+		/**
+		 * @tiapi(method=True,name=App.Properties.getDouble,since=0.2) get value as double
+		 * @tiarg(for=App.Properties.getDouble,name=name,type=string) the property name
+	     * @tiresult(for=App.Properties.getDouble,type=double) returns the value as a double
+		 */
 		SetMethod(&quot;getDouble&quot;, &amp;PropertiesBinding::GetDouble);
+		/**
+		 * @tiapi(method=True,name=App.Properties.getInt,since=0.2) get value as integer
+		 * @tiarg(for=App.Properties.getInt,name=name,type=string) the property name
+	     * @tiresult(for=App.Properties.getInt,type=integer) returns the value as an integer
+		 */
 		SetMethod(&quot;getInt&quot;, &amp;PropertiesBinding::GetInt);
+		/**
+		 * @tiapi(method=True,name=App.Properties.getString,since=0.2) get value as string
+		 * @tiarg(for=App.Properties.getString,name=name,type=string) the property name
+	     * @tiresult(for=App.Properties.getString,type=string) returns the value as a string
+		 */
 		SetMethod(&quot;getString&quot;, &amp;PropertiesBinding::GetString);
+		/**
+		 * @tiapi(method=True,name=App.Properties.getList,since=0.2) get value as a list
+		 * @tiarg(for=App.Properties.getList,name=name,type=string) the property name
+	     * @tiresult(for=App.Properties.getList,type=list) returns the value as a list
+		 */
 		SetMethod(&quot;getList&quot;, &amp;PropertiesBinding::GetList);
+		/**
+		 * @tiapi(method=True,name=App.Properties.setBool,since=0.2) set value
+		 * @tiarg(for=App.Properties.setBool,name=name,type=string) the property name
+		 * @tiarg(for=App.Properties.setBool,name=value,type=boolean) the value
+		 */
 		SetMethod(&quot;setBool&quot;, &amp;PropertiesBinding::SetBool);
+		/**
+		 * @tiapi(method=True,name=App.Properties.setDouble,since=0.2) set value
+		 * @tiarg(for=App.Properties.setDouble,name=name,type=string) the property name
+		 * @tiarg(for=App.Properties.setDouble,name=value,type=double) the value
+		 */
 		SetMethod(&quot;setDouble&quot;, &amp;PropertiesBinding::SetDouble);
+		/**
+		 * @tiapi(method=True,name=App.Properties.setInt,since=0.2) set value
+		 * @tiarg(for=App.Properties.setInt,name=name,type=string) the property name
+		 * @tiarg(for=App.Properties.setInt,name=value,type=integer) the value
+		 */
 		SetMethod(&quot;setInt&quot;, &amp;PropertiesBinding::SetInt);
+		/**
+		 * @tiapi(method=True,name=App.Properties.setString,since=0.2) set value
+		 * @tiarg(for=App.Properties.setString,name=name,type=string) the property name
+		 * @tiarg(for=App.Properties.setString,name=value,type=string) the value
+		 */
 		SetMethod(&quot;setString&quot;, &amp;PropertiesBinding::SetString);
+		/**
+		 * @tiapi(method=True,name=App.Properties.setList,since=0.2) set value
+		 * @tiarg(for=App.Properties.setList,name=name,type=string) the property name
+		 * @tiarg(for=App.Properties.setList,name=value,type=list) the value
+		 */
 		SetMethod(&quot;setList&quot;, &amp;PropertiesBinding::SetList);
+		/**
+		 * @tiapi(method=True,name=App.Properties.hasProperty,since=0.2) check to see if a property exists
+		 * @tiarg(for=App.Properties.hasProperty,name=name,type=string) the property name
+	     * @tiresult(for=App.Properties.hasProperty,type=boolean) returns true if the property exists
+		 */
 		SetMethod(&quot;hasProperty&quot;, &amp;PropertiesBinding::HasProperty);
+		/**
+		 * @tiapi(method=True,name=App.Properties.listProperties,since=0.2) get a list of property values
+	     * @tiresult(for=App.Properties.listProperties,type=list) returns a list of property values
+		 */
 		SetMethod(&quot;listProperties&quot;, &amp;PropertiesBinding::ListProperties);
 	}
 </diff>
      <filename>modules/ti.App/Properties/properties_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -14,32 +14,38 @@ namespace ti
 	AppBinding::AppBinding(Host *host,SharedBoundObject global) : host(host),global(global)
 	{
 		/**
-		 * @tiapi(method=True,immutable=True,returns=string,name=App.getID) get the application id
+		 * @tiapi(method=True,immutable=True,name=App.getID,since=0.2) get the application id
+		 * @tiresult(for=App.getID,type=string) returns the id
 		 */
 		this-&gt;SetMethod(&quot;getID&quot;, &amp;AppBinding::GetID);
 		/**
-		 * @tiapi(method=True,immutable=True,returns=string,name=App.getName) get the application name
+		 * @tiapi(method=True,immutable=True,name=App.getName,since=0.2) get the application name
+	     * @tiresult(for=App.getName,type=string) returns the name
 		 */
 		this-&gt;SetMethod(&quot;getName&quot;, &amp;AppBinding::GetName);
 		/**
-		 * @tiapi(method=True,immutable=True,returns=string,name=App.getVersion) get the application version
+		 * @tiapi(method=True,immutable=True,name=App.getVersion,since=0.2) get the application version
+		 * @tiresult(for=App.getVersion,type=string) returns the version
 		 */
 		this-&gt;SetMethod(&quot;getVersion&quot;, &amp;AppBinding::GetVersion);
 		/**
-		 * @tiapi(method=True,immutable=True,returns=string,name=App.getUpdateURL) get the application update URL
+		 * @tiapi(method=True,immutable=True,name=App.getUpdateURL,since=0.2) get the application update URL
+	     * @tiresult(for=App.getUpdateURL,type=string) returns the url
 		 */
 		this-&gt;SetMethod(&quot;getUpdateURL&quot;, &amp;AppBinding::GetUpdateURL);
 		/**
-		 * @tiapi(method=True,immutable=True,returns=string,name=App.getGUID) get the application globally unique id
+		 * @tiapi(method=True,immutable=True,name=App.getGUID,since=0.2) get the application globally unique id
+	     * @tiresult(for=App.getGUID,type=string) returns the unique id
 		 */
 		this-&gt;SetMethod(&quot;getGUID&quot;, &amp;AppBinding::GetGUID);
 		/**
-		 * @tiapi(method=True,immutable=True,returns=string,name=App.appURLToPath) get a full path from an application using app: URL
+		 * @tiapi(method=True,immutable=True,name=App.appURLToPath,since=0.2) get a full path from an application using app: URL
+		 * @tiresult(for=App.appURLToPath,type=string) returns the path
 		 */
 		this-&gt;SetMethod(&quot;appURLToPath&quot;, &amp;AppBinding::AppURLToPath);
 		
 		/**
-		 * @tiapi(property=True,immutable=True,type=string,name=App.path) get a full path to the application
+		 * @tiapi(property=True,immutable=True,type=string,name=App.path,since=0.2) get a full path to the application
 		 */
 #ifdef OS_OSX
 		NSString *path = [[NSBundle mainBundle] bundlePath];
@@ -49,13 +55,13 @@ namespace ti
 #endif
 
 		/**
-		 * @tiapi(property=True,immutable=True,type=double,name=App.version) returns the Titanium product version
+		 * @tiapi(property=True,immutable=True,type=double,name=App.version,since=0.2) returns the Titanium product version
 		 */
 		SharedValue version = Value::NewDouble(PRODUCT_VERSION);
 		global-&gt;Set(&quot;version&quot;, version);
 
 		/**
-		 * @tiapi(property=True,immutable=True,type=string,name=App.platform) returns the Titanium platform
+		 * @tiapi(property=True,immutable=True,type=string,name=App.platform,since=0.2) returns the Titanium platform
 		 */
 		SharedValue platform = Value::NewString(host-&gt;GetPlatform());
 		global-&gt;Set(&quot;platform&quot;,platform);
@@ -68,17 +74,19 @@ namespace ti
 		}
 		SharedValue arguments = Value::NewList(argList);
 		/**
-		 * @tiapi(property=True,immutable=True,type=list,name=App.arguments) returns the arguments from the command line
+		 * @tiapi(property=True,immutable=True,type=list,name=App.arguments,since=0.2) returns the arguments from the command line
 		 */
 		Set(&quot;arguments&quot;, arguments);
 
 		/**
-		 * @tiapi(method=True,immutable=True,returns=void,name=App.exit) causes the application to exit
+		 * @tiapi(method=True,immutable=True,name=App.exit,since=0.2) causes the application to exit
 		 */
 		this-&gt;SetMethod(&quot;exit&quot;,&amp;AppBinding::Exit);
 
 		/**
-		 * @tiapi(method=True,immutable=True,returns=list,name=App.loadProperties) load a properties list from a file path
+		 * @tiapi(method=True,name=App.loadProperties,since=0.2) load a properties list from a file path
+		 * @tiarg(for=App.loadProperties,type=string,name=path) path to properties file
+		 * @tiresult(for=App.loadProperties,type=list) returns the properties as a list
 		 */
 		this-&gt;SetMethod(&quot;loadProperties&quot;, &amp;AppBinding::LoadProperties);
 	}
@@ -145,7 +153,7 @@ namespace ti
 	void AppBinding::LoadProperties(const ValueList&amp; args, SharedValue result)
 	{
 		if (args.size() &gt;= 1 &amp;&amp; args.at(0)-&gt;IsString()) {
-			std::string file_path = args.at(1)-&gt;ToString();
+			std::string file_path = args.at(0)-&gt;ToString();
 			SharedBoundObject properties = new PropertiesBinding(file_path);
 			result-&gt;SetObject(properties);
 		}</diff>
      <filename>modules/ti.App/app_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -56,7 +56,7 @@ namespace ti
 		this-&gt;properties_binding = new PropertiesBinding(app_properties);
 		SharedValue properties_value = Value::NewObject(this-&gt;properties_binding);
 		/**
-		 * @tiapi(property=True,type=object,name=App.Properties) returns the application's private properties
+		 * @tiapi(property=True,type=object,name=App.Properties,since=0.2) returns the application's private properties
 		 */
 		this-&gt;app_binding-&gt;Set(&quot;Properties&quot;, properties_value);
 	}</diff>
      <filename>modules/ti.App/app_module.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -27,15 +27,18 @@ namespace ti
 	DesktopBinding::DesktopBinding(SharedBoundObject global) : global(global)
 	{
 		/**
-		 * @tiapi(method=True,returns=void,name=Desktop.openApplication,args=[name:string]) opens an application by name using the operating system
+		 * @tiapi(method=True,name=Desktop.openApplication,since=0.2) opens an application by name using the operating system
+		 * @tiarg(for=Desktop.openApplication,type=string,name=path) the name or path to the application to open
 		 */
 		this-&gt;SetMethod(&quot;openApplication&quot;,&amp;DesktopBinding::OpenApplication);
 		/**
-		 * @tiapi(method=True,returns=void,name=Desktop.openURL,args=[url:string]) opens a URL in the default system browser
+		 * @tiapi(method=True,name=Desktop.openURL,since=0.2) opens a URL in the default system browser
+		 * @tiarg(for=Desktop.openURL,name=url,type=string) the url
 		 */
 		this-&gt;SetMethod(&quot;openURL&quot;,&amp;DesktopBinding::OpenURL);
 		/**
-		 * @tiapi(method=True,returns=void,name=Desktop.takeScreenshot,args=[file:string]) create a screenshot and saved to passed in file
+		 * @tiapi(method=True,returns=void,name=Desktop.takeScreenshot,since=0.4) create a screenshot and saved to passed in file
+		 * @tiarg(for=Desktop.takeScreenshot,name=file,type=string) file to write the output
 		 */
 		this-&gt;SetMethod(&quot;takeScreenshot&quot;, &amp;DesktopBinding::TakeScreenshot);
 	}</diff>
      <filename>modules/ti.Desktop/desktop_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -28,7 +28,7 @@ namespace ti
 			  stopped(false)
 	{
 		/**
-		 * @tiapi(property=True,type=boolean,name=Filesystem.AsyncCopy.running) boolean property to indicate if the copy operation is running
+		 * @tiapi(property=True,type=boolean,name=Filesystem.AsyncCopy.running,since=0.3) boolean property to indicate if the copy operation is running
 		 */
 		this-&gt;Set(&quot;running&quot;,Value::NewBool(true));
 		this-&gt;thread = new Poco::Thread();</diff>
      <filename>modules/ti.Filesystem/async_copy.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -24,135 +24,172 @@ namespace ti
 #endif
 
 		/**
-		 * @tiapi(method=True,returns=string,name=Filesystem.File.toString) returns a string representation of the File object
+		 * @tiapi(method=True,name=Filesystem.File.toString,since=0.2) returns a string representation of the File object
+		 * @tiresult(for=Filesystem.File.toString,type=string)
 		 */
 		this-&gt;SetMethod(&quot;toString&quot;,&amp;File::ToString);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.isFile) returns true if this is a file
+		 * @tiapi(method=True,name=Filesystem.File.isFile,since=0.2) returns true if this is a file
+		 * @tiresult(for=Filesystem.File.isFile,type=boolean)
 		 */
 		this-&gt;SetMethod(&quot;isFile&quot;,&amp;File::IsFile);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.isDirectory) returns true if this is a directory
+		 * @tiapi(method=True,name=Filesystem.File.isDirectory,since=0.2) returns true if this is a directory
+		 * @tiresult(for=Filesystem.File.isDirectory,type=boolean)
 		 */
 		this-&gt;SetMethod(&quot;isDirectory&quot;,&amp;File::IsDirectory);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.isHidden) returns true if this is a hidden file or directory
+		 * @tiapi(method=True,name=Filesystem.File.isHidden,since=0.2) returns true if this is a hidden file or directory
+		 * @tiresult(for=Filesystem.File.isHidden,type=boolean)
 		 */
 		this-&gt;SetMethod(&quot;isHidden&quot;,&amp;File::IsHidden);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.isSymbolicLink) returns true if this points to a symbolic link
+		 * @tiapi(method=True,name=Filesystem.File.isSymbolicLink,since=0.2) returns true if this points to a symbolic link
+		 * @tiresult(for=Filesystem.File.isSymbolicLink,type=boolean)
 		 */
 		this-&gt;SetMethod(&quot;isSymbolicLink&quot;,&amp;File::IsSymbolicLink);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.isExecutable) returns true if this file is executable
+		 * @tiapi(method=True,name=Filesystem.File.isExecutable,since=0.2) returns true if this file is executable
+		 * @tiresult(for=Filesystem.File.isExecutable,type=boolean)
 		 */
 		this-&gt;SetMethod(&quot;isExecutable&quot;,&amp;File::IsExecutable);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.isReadonly) returns true if this file or directory is read only
+		 * @tiapi(method=True,name=Filesystem.File.isReadonly,since=0.2) returns true if this file or directory is read only
+		 * @tiresult(for=Filesystem.File.isReadonly,type=boolean)
 		 */
 		this-&gt;SetMethod(&quot;isReadonly&quot;,&amp;File::IsReadonly);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.isWriteable) returns true if the file or directory is writeable
+		 * @tiapi(method=True,name=Filesystem.File.isWriteable,since=0.2) returns true if the file or directory is writeable
+		 * @tiresult(for=Filesystem.File.isWriteable,type=boolean)
 		 */
 		this-&gt;SetMethod(&quot;isWriteable&quot;,&amp;File::IsWriteable);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.resolve) resolves the file
+		 * @tiapi(method=True,name=Filesystem.File.resolve,since=0.2) resolves a file path
+		 * @tiarg(for=Filesystem.File.resolve,name=path) path to resolve
+		 * @tiresult(for=Filesystem.File.resolve,type=object)
 		 */
 		this-&gt;SetMethod(&quot;resolve&quot;,&amp;File::Resolve);
 		/**
-		 * @tiapi(method=True,returns=void,name=Filesystem.File.write) write data to the file
+		 * @tiapi(method=True,returns=void,name=Filesystem.File.write,since=0.2) write data to the file
+		 * @tiarg(for=Filesystem.File.write,type=string,name=data) data to write
 		 */
 		this-&gt;SetMethod(&quot;write&quot;,&amp;File::Write);
 		/**
-		 * @tiapi(method=True,returns=string,name=Filesystem.File.read) returns data as a string from the file
+		 * @tiapi(method=True,name=Filesystem.File.read,since=0.2) returns data as a string from the file
+		 * @tiresult(for=Filesystem.File.read,type=string)
 		 */
 		this-&gt;SetMethod(&quot;read&quot;,&amp;File::Read);
 		/**
-		 * @tiapi(method=True,returns=string,name=Filesystem.File.readLine) returns one line (separated by line ending) from the file
+		 * @tiapi(method=True,name=Filesystem.File.readLine,since=0.2) returns one line (separated by line ending) from the file
+		 * @tiresult(for=Filesystem.File.readLine,type=string) data
 		 */
 		this-&gt;SetMethod(&quot;readLine&quot;,&amp;File::ReadLine);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.copy) copy the file and returns true if successful
+		 * @tiapi(method=True,name=Filesystem.File.copy,since=0.2) copy the file and returns true if successful
+		 * @tiarg(for=Filesystem.File.copy,type=string,name=destination) destination to copy to
+		 * @tiresult(for=Filesystem.File.copy,type=boolean) true if successful
 		 */
 		this-&gt;SetMethod(&quot;copy&quot;,&amp;File::Copy);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.move) moves the file and returns true if successful
+		 * @tiapi(method=True,name=Filesystem.File.move,since=0.2) moves the file and returns true if successful
+		 * @tiarg(for=Filesystem.File.move,type=string,name=destination) destination to move to
+		 * @tiresult(for=Filesystem.File.move,type=boolean) true if successful
 		 */
 		this-&gt;SetMethod(&quot;move&quot;,&amp;File::Move);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.rename) renames the file and returns true if successful
+		 * @tiapi(method=True,name=Filesystem.File.rename,since=0.2) renames the file and returns true if successful
+		 * @tiarg(for=Filesystem.File.rename,type=string,name=destination) destination to rename to
+		 * @tiresult(for=Filesystem.File.rename,type=boolean) true if successful
 		 */
 		this-&gt;SetMethod(&quot;rename&quot;,&amp;File::Rename);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.createDirectory) creates a directory and returns true if successful
+		 * @tiapi(method=True,name=Filesystem.File.createDirectory,since=0.2) creates a directory and returns true if successful
+		 * @tiresult(for=Filesystem.File.createDirectory,type=boolean) true if successful
 		 */
 		this-&gt;SetMethod(&quot;createDirectory&quot;,&amp;File::CreateDirectory);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.deleteDirectory) deletes the directory and returns true if successful
+		 * @tiapi(method=True,name=Filesystem.File.deleteDirectory,since=0.2) deletes the directory and returns true if successful
+		 * @tiresult(for=Filesystem.File.deleteDirectory,type=boolean) true if successful
 		 */
 		this-&gt;SetMethod(&quot;deleteDirectory&quot;,&amp;File::DeleteDirectory);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.deleteFile) deletes the file and returns true if successful
+		 * @tiapi(method=True,name=Filesystem.File.deleteFile,since=0.2) deletes the file and returns true if successful
+		 * @tiresult(for=Filesystem.File.deleteFile,type=boolean) true if successful
 		 */
 		this-&gt;SetMethod(&quot;deleteFile&quot;,&amp;File::DeleteFile);
 		/**
-		 * @tiapi(method=True,returns=list,name=Filesystem.File.getDirectoryListing) returns list of directory entries
+		 * @tiapi(method=True,returns=list,name=Filesystem.File.getDirectoryListing,since=0.2) returns list of directory entries
+		 * @tiresult(for=Filesystem.File.getDirectoryListing,type=list) returns a list of names
 		 */
 		this-&gt;SetMethod(&quot;getDirectoryListing&quot;,&amp;File::GetDirectoryListing);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.File.parent) returns the parent file
+		 * @tiapi(method=True,returns=file,name=Filesystem.File.parent,since=0.2) returns the parent file
+		 * @tiresult(for=Filesystem.File.parent,type=object) returns the parent file
 		 */
 		this-&gt;SetMethod(&quot;parent&quot;,&amp;File::GetParent);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.exists) returns true if the file or directory exists
+		 * @tiapi(method=True,name=Filesystem.File.exists,since=0.2) returns true if the file or directory exists
+		 * @tiresult(for=Filesystem.File.exists,type=boolean) returns true if exists
 		 */
 		this-&gt;SetMethod(&quot;exists&quot;,&amp;File::GetExists);
 		/**
-		 * @tiapi(method=True,returns=double,name=Filesystem.File.createTimestamp) returns the created timestamp
+		 * @tiapi(method=True,name=Filesystem.File.createTimestamp,since=0.2) returns the created timestamp
+		 * @tiresult(for=Filesystem.File.createTimestamp,type=double) created timestamp for file
 		 */
 		this-&gt;SetMethod(&quot;createTimestamp&quot;,&amp;File::GetCreateTimestamp);
 		/**
-		 * @tiapi(method=True,returns=double,name=Filesystem.File.modificationTimestamp) returns the modification timestamp
+		 * @tiapi(method=True,name=Filesystem.File.modificationTimestamp,since=0.2) returns the modification timestamp
+		 * @tiresult(for=Filesystem.File.modificationTimestamp,type=double) modification timestamp for file
 		 */
 		this-&gt;SetMethod(&quot;modificationTimestamp&quot;,&amp;File::GetModificationTimestamp);
 		/**
-		 * @tiapi(method=True,returns=string,name=Filesystem.File.name) returns the name of the file or directory
+		 * @tiapi(method=True,name=Filesystem.File.name,since=0.2) returns the name of the file or directory
+		 * @tiresult(for=Filesystem.File.name,type=string) name of the file part of the path
 		 */
 		this-&gt;SetMethod(&quot;name&quot;,&amp;File::GetName);
 		/**
-		 * @tiapi(method=True,returns=string,name=Filesystem.File.extension) returns the name of the file extension
+		 * @tiapi(method=True,name=Filesystem.File.extension,since=0.2) returns the name of the file extension
+		 * @tiresult(for=Filesystem.File.extension,type=string) file extension
 		 */
 		this-&gt;SetMethod(&quot;extension&quot;,&amp;File::GetExtension);
 		/**
-		 * @tiapi(method=True,returns=string,name=Filesystem.File.nativePath) returns the full native path
+		 * @tiapi(method=True,name=Filesystem.File.nativePath,since=0.2) returns the full native path
+		 * @tiresult(for=Filesystem.File.nativePath,type=string) full native path
 		 */
 		this-&gt;SetMethod(&quot;nativePath&quot;,&amp;File::GetNativePath);
 		/**
-		 * @tiapi(method=True,returns=double,name=Filesystem.File.size) returns the size of the file in bytes
+		 * @tiapi(method=True,name=Filesystem.File.size,since=0.2) returns the size of the file in bytes
+		 * @tiresult(for=Filesystem.File.size,type=double) file size
 		 */
 		this-&gt;SetMethod(&quot;size&quot;,&amp;File::GetSize);
 		/**
-		 * @tiapi(method=True,returns=double,name=Filesystem.File.spaceAvailable) returns the space available on the filesystem
+		 * @tiapi(method=True,name=Filesystem.File.spaceAvailable,since=0.2) returns the space available on the filesystem
+		 * @tiresult(for=Filesystem.File.spaceAvailable,type=double) space available
 		 */
 		this-&gt;SetMethod(&quot;spaceAvailable&quot;,&amp;File::GetSpaceAvailable);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.createShortcut) create a shortcut to the file
+		 * @tiapi(method=True,name=Filesystem.File.createShortcut,since=0.2) create a shortcut to the file
+		 * @tiresult(for=Filesystem.File.createShortcut,type=boolean) returns true if successful
 		 */
 		this-&gt;SetMethod(&quot;createShortcut&quot;,&amp;File::CreateShortcut);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.setExecutable) make the file or directory executable
+		 * @tiapi(method=True,name=Filesystem.File.setExecutable,since=0.2) make the file or directory executable
+		 * @tiresult(for=Filesystem.File.setExecutable,type=boolean) returns true if successful
 		 */
 		this-&gt;SetMethod(&quot;setExecutable&quot;,&amp;File::SetExecutable);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.setReadonly) make the file or directory readonly
+		 * @tiapi(method=True,name=Filesystem.File.setReadonly,since=0.2) make the file or directory readonly
+		 * @tiresult(for=Filesystem.File.setReadonly,type=boolean) returns true if successful
 		 */
 		this-&gt;SetMethod(&quot;setReadonly&quot;,&amp;File::SetReadonly);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.setWriteable) make the file or directory writeable
+		 * @tiapi(method=True,name=Filesystem.File.setWriteable,since=0.2) make the file or directory writeable
+		 * @tiresult(for=Filesystem.File.setWriteable,type=boolean) returns true if successful
 		 */
 		this-&gt;SetMethod(&quot;setWriteable&quot;,&amp;File::SetWriteable);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Filesystem.File.unzip) unzip the file into a directory
+		 * @tiapi(method=True,name=Filesystem.File.unzip,since=0.3) unzip the file into a directory
+		 * @tiarg(for=Filesystem.File.unzip,type=object,name=destination) destination to unzip to
 		 */
 		this-&gt;SetMethod(&quot;unzip&quot;,&amp;File::Unzip);
 </diff>
      <filename>modules/ti.Filesystem/file.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -24,23 +24,29 @@ FileStream::FileStream(std::string filename_) : stream(NULL)
 #endif
 
 	/**
-	 * @tiapi(method=True,returns=boolean,name=Filesystem.Filestream.open) open the file
+	 * @tiapi(method=True,name=Filesystem.Filestream.open,since=0.2) open the file
+	 * @tiresult(for=Filesystem.Filestream.open,type=boolean) returns true if successful
 	 */
 	this-&gt;SetMethod(&quot;open&quot;,&amp;FileStream::Open);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=Filesystem.Filestream.close) close the file
+	 * @tiapi(method=True,name=Filesystem.Filestream.close,since=0.2) close the file
+	 * @tiresult(for=Filesystem.Filestream.close,type=boolean) returns true if successful
 	 */
 	this-&gt;SetMethod(&quot;close&quot;,&amp;FileStream::Close);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=Filesystem.Filestream.read) read from the file
+	 * @tiapi(method=True,name=Filesystem.Filestream.read,since=0.2) read from the file
+	 * @tiresult(for=Filesystem.Filestream.read,type=string) returns data as string
 	 */
 	this-&gt;SetMethod(&quot;read&quot;,&amp;FileStream::Read);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=Filesystem.Filestream.readLine) read one line from the file
+	 * @tiapi(method=True,name=Filesystem.Filestream.readLine,since=0.2) read one line from the file
+	 * @tiresult(for=Filesystem.Filestream.readLine,type=string) returns data as string
 	 */
 	this-&gt;SetMethod(&quot;readLine&quot;,&amp;FileStream::ReadLine);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=Filesystem.Filestream.write) write into the file
+	 * @tiapi(method=True,name=Filesystem.Filestream.write,since=0.2) write into the file
+	 * @tiarg(for=Filesystem.Filestream.write,type=string,name=data) data to write
+	 * @tiresult(for=Filesystem.Filestream.write,type=boolean) returns true if successful
 	 */
 	this-&gt;SetMethod(&quot;write&quot;,&amp;FileStream::Write);
 }</diff>
      <filename>modules/ti.Filesystem/file_stream.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -30,67 +30,86 @@ namespace ti
 	FilesystemBinding::FilesystemBinding(Host *host, SharedBoundObject global) : host(host), global(global), timer(0)
 	{
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.createTempFile) create a temporary file
+		 * @tiapi(method=True,name=Filesystem.createTempFile) create a temporary file
+		 * @tiresult(for=Filesystem.createTempFile,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;createTempFile&quot;,&amp;FilesystemBinding::CreateTempFile);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.createTempDirectory) create a temporary directory
+		 * @tiapi(method=True,name=Filesystem.createTempDirectory) create a temporary directory
+		 * @tiresult(for=Filesystem.createTempDirectory,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;createTempDirectory&quot;,&amp;FilesystemBinding::CreateTempDirectory);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.getFile) get a file path, optionally joining multiple arguments together in an OS specific way
+		 * @tiapi(method=True,name=Filesystem.getFile) get a file path, optionally joining multiple arguments together in an OS specific way
+		 * @tiresult(for=Filesystem.getFile,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;getFile&quot;,&amp;FilesystemBinding::GetFile);
 		/**
 		 * @tiapi(method=True,returns=filestream,name=Filesystem.getFileStream) get a file stream object
+		 * @tiresult(for=Filesystem.getFileStream,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;getFileStream&quot;,&amp;FilesystemBinding::GetFileStream);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.getProgramsDirectory) gets the OS specific program directory
+		 * @tiapi(method=True,name=Filesystem.getProgramsDirectory) gets the OS specific program directory
+		 * @tiresult(for=Filesystem.getProgramsDirectory,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;getProgramsDirectory&quot;,&amp;FilesystemBinding::GetProgramsDirectory);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.getApplicationDirectory) gets the OS specific application directory
+		 * @tiapi(method=True,name=Filesystem.getApplicationDirectory) gets the OS specific application directory
+		 * @tiresult(for=Filesystem.getApplicationDirectory,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;getApplicationDirectory&quot;,&amp;FilesystemBinding::GetApplicationDirectory);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.getApplicationDataDirectory) gets the OS specific application data directory
+		 * @tiapi(method=True,name=Filesystem.getApplicationDataDirectory) gets the OS specific application data directory
+		 * @tiresult(for=Filesystem.getApplicationDataDirectory,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;getApplicationDataDirectory&quot;,&amp;FilesystemBinding::GetApplicationDataDirectory);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.getRuntimeBaseDirectory) gets the OS specific runtime base directory
+		 * @tiapi(method=True,name=Filesystem.getRuntimeBaseDirectory) gets the OS specific runtime base directory
+		 * @tiresult(for=Filesystem.getRuntimeBaseDirectory,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;getRuntimeBaseDirectory&quot;,&amp;FilesystemBinding::GetRuntimeBaseDirectory);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.getResourcesDirectory) gets the OS specific resources directory of the application
+		 * @tiapi(method=True,name=Filesystem.getResourcesDirectory) gets the OS specific resources directory of the application
+		 * @tiresult(for=Filesystem.getResourcesDirectory,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;getResourcesDirectory&quot;,&amp;FilesystemBinding::GetResourcesDirectory);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.getDesktopDirectory) gets the OS specific desktop directory
+		 * @tiapi(method=True,name=Filesystem.getDesktopDirectory) gets the OS specific desktop directory
+		 * @tiresult(for=Filesystem.getDesktopDirectory,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;getDesktopDirectory&quot;,&amp;FilesystemBinding::GetDesktopDirectory);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.getDocumentsDirectory) gets the OS specific documents directory
+		 * @tiapi(method=True,name=Filesystem.getDocumentsDirectory) gets the OS specific documents directory
+		 * @tiresult(for=Filesystem.getDocumentsDirectory,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;getDocumentsDirectory&quot;,&amp;FilesystemBinding::GetDocumentsDirectory);
 		/**
-		 * @tiapi(method=True,returns=file,name=Filesystem.getUserDirectory) gets the OS specific user's home directory
+		 * @tiapi(method=True,name=Filesystem.getUserDirectory) gets the OS specific user's home directory
+		 * @tiresult(for=Filesystem.getUserDirectory,type=object) file object
 		 */
 		this-&gt;SetMethod(&quot;getUserDirectory&quot;,&amp;FilesystemBinding::GetUserDirectory);
 		/**
-		 * @tiapi(method=True,returns=string,name=Filesystem.getLineEnding) gets the OS specific line ending string
+		 * @tiapi(method=True,name=Filesystem.getLineEnding) gets the OS specific line ending string
+		 * @tiresult(for=Filesystem.getLineEnding,type=string) line ending
 		 */
 		this-&gt;SetMethod(&quot;getLineEnding&quot;,&amp;FilesystemBinding::GetLineEnding);
 		/**
-		 * @tiapi(method=True,returns=string,name=Filesystem.getSeparator) gets the OS specific path separator string
+		 * @tiapi(method=True,name=Filesystem.getSeparator) gets the OS specific path separator string
+		 * @tiresult(for=Filesystem.getSeparator,type=string) path separator
 		 */
 		this-&gt;SetMethod(&quot;getSeparator&quot;,&amp;FilesystemBinding::GetSeparator);
 		/**
-		 * @tiapi(method=True,returns=list,name=Filesystem.getRootDirectories) gets the OS specific root directories
+		 * @tiapi(method=True,name=Filesystem.getRootDirectories) gets the OS specific root directories
+		 * @tiresult(for=Filesystem.getRootDirectories,type=list) root directory names
 		 */
 		this-&gt;SetMethod(&quot;getRootDirectories&quot;,&amp;FilesystemBinding::GetRootDirectories);
 		/**
-		 * @tiapi(method=True,returns=object,name=Filesystem.asyncCopy) executes an async copy operation
+		 * @tiapi(method=True,name=Filesystem.asyncCopy) executes an async copy operation
+		 * @tiarg(for=Filesystem.asyncCopy,name=paths,type=object) either a path or array of paths to copy from
+		 * @tiarg(for=Filesystem.asyncCopy,name=destination,type=object) either a string or file object to copy to
+		 * @tiarg(for=Filesystem.asyncCopy,name=callback,type=method) callback to invoke on each copy completion operation
+		 * @tiresult(for=Filesystem.asyncCopy,type=object) async copy object
 		 */
 		this-&gt;SetMethod(&quot;asyncCopy&quot;,&amp;FilesystemBinding::ExecuteAsyncCopy);
 
@@ -103,7 +122,7 @@ namespace ti
 		 */
 		this-&gt;Set(&quot;FILESTREAM_MODE_WRITE&quot;, Value::NewString(FileStream::MODE_WRITE));
 		/**
-		 * @tiapi(property=True,immutable=True,returns=file,name=Filesystem.FILESTREAM_MODE_APPEND) file append constant
+		 * @tiapi(property=True,immutable=True,name=Filesystem.FILESTREAM_MODE_APPEND) file append constant
 		 */
 		this-&gt;Set(&quot;FILESTREAM_MODE_APPEND&quot;, Value::NewString(FileStream::MODE_APPEND));
 	}</diff>
      <filename>modules/ti.Filesystem/filesystem_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -12,11 +12,16 @@ namespace ti
 	GrowlBinding::GrowlBinding(SharedBoundObject global) : global(global)
 	{
 		/**
-		 * @tiapi(method=True,returns=void,name=Notification.showNotification) show a growl notification
+		 * @tiapi(method=True,name=Notification.showNotification,since=0.2) show a growl notification
+         * @tiarg(for=Notification.showNotification,name=title,type=string) title of the notification window (the first argument can also be an object with each argument as a property)
+         * @tiarg(for=Notification.showNotification,name=description,type=string) title of the notification window
+         * @tiarg(for=Notification.showNotification,name=icon,type=string,optional=False) icon path for the notification window
+         * @tiarg(for=Notification.showNotification,name=timeout,type=string,optional=False) timeout to hide the window
 		 */
 		SetMethod(&quot;showNotification&quot;, &amp;GrowlBinding::ShowNotification);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Notification.isRunning) returns true if Growl is running
+		 * @tiapi(method=True,name=Notification.isRunning,since=0.2) returns true if Growl is running
+		 * @tiresult(for=Notification.isRunning,type=boolean) returns true if running
 		 */
 		SetMethod(&quot;isRunning&quot;, &amp;GrowlBinding::IsRunning);
 	}</diff>
      <filename>modules/ti.Growl/growl_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -13,11 +13,13 @@ namespace ti
 	MediaBinding::MediaBinding(SharedBoundObject global) : global(global)
 	{
 		/**
-		 * @tiapi(method=True,returns=object,name=Sound.createSound) create a sound object
+		 * @tiapi(method=True,name=Sound.createSound,since=0.2) create a sound object
+		 * @tiarg(for=Sound.createSound,name=path,type=string) path or url to the sound file
+		 * @tiresult(for=Sound.createSound,type=object) returns the sound object
 		 */
 		this-&gt;SetMethod(&quot;createSound&quot;, &amp;MediaBinding::_CreateSound);
 		/**
-		 * @tiapi(method=True,returns=void,name=Sound.beep) cause the system to beep
+		 * @tiapi(method=True,name=Sound.beep,since=0.2) cause the system to beep
 		 */
 		this-&gt;SetMethod(&quot;beep&quot;, &amp;MediaBinding::_Beep);
 	}</diff>
      <filename>modules/ti.Media/media_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -10,47 +10,54 @@ namespace ti
 	Sound::Sound (std::string &amp;s) : url(s)
 	{
 		/**
-		 * @tiapi(method=True,returns=void,name=Media.Sound.play) starting playing the sound
+		 * @tiapi(method=True,name=Media.Sound.play,since=0.2) starting playing the sound
 		 */
 		this-&gt;SetMethod(&quot;play&quot;,&amp;Sound::Play);
 		/**
-		 * @tiapi(method=True,returns=void,name=Media.Sound.pause) pause a playing sound
+		 * @tiapi(method=True,name=Media.Sound.pause,since=0.2) pause a playing sound
 		 */
 		this-&gt;SetMethod(&quot;pause&quot;,&amp;Sound::Pause);
 		/**
-		 * @tiapi(method=True,returns=void,name=Media.Sound.stop) stop a playing sound
+		 * @tiapi(method=True,name=Media.Sound.stop,since=0.2) stop a playing sound
 		 */
 		this-&gt;SetMethod(&quot;stop&quot;,&amp;Sound::Stop);
 		/**
-		 * @tiapi(method=True,returns=void,name=Media.Sound.reload) reload a playing sound
+		 * @tiapi(method=True,name=Media.Sound.reload,since=0.2) reload a playing sound
 		 */
 		this-&gt;SetMethod(&quot;reload&quot;,&amp;Sound::Reload);
 		/**
-		 * @tiapi(method=True,returns=void,name=Media.Sound.setVolume) set the volume from 0.0-1.0
+		 * @tiapi(method=True,name=Media.Sound.setVolume,since=0.2) set the volume from 0.0-1.0
+		 * @tiarg(for=Media.Sound.setVolume,type=double,name=volume) volume from 0.0-1.0
 		 */
 		this-&gt;SetMethod(&quot;setVolume&quot;,&amp;Sound::SetVolume);
 		/**
-		 * @tiapi(method=True,returns=double,name=Media.Sound.getVolume) get the volume from 0.0-1.0
+		 * @tiapi(method=True,name=Media.Sound.getVolume,since=0.2) get the volume from 0.0-1.0
+		 * @tiresult(for=Media.Sound.getVolume,type=double) return the volume as 0.0-1.0
 		 */
 		this-&gt;SetMethod(&quot;getVolume&quot;,&amp;Sound::GetVolume);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Media.Sound.setLooping) sets the looping of the sound
+		 * @tiapi(method=True,name=Media.Sound.setLooping,since=0.2) sets the looping of the sound
+		 * @tiarg(for=Media.Sound.setLooping,name=loop,type=boolean) true to set looping
 		 */
 		this-&gt;SetMethod(&quot;setLooping&quot;,&amp;Sound::SetLooping);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Media.Sound.isLooping) returns true if the sound is looping
+		 * @tiapi(method=True,name=Media.Sound.isLooping,since=0.2) returns true if the sound is looping
+		 * @tiresult(for=Media.Sound.isLooping,type=boolean) returns true if looping
 		 */
 		this-&gt;SetMethod(&quot;isLooping&quot;,&amp;Sound::IsLooping);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Media.Sound.isPlaying) returns true if the sound is playing
+		 * @tiapi(method=True,name=Media.Sound.isPlaying,since=0.2) returns true if the sound is playing
+		 * @tiresult(for=Media.Sound.isPlaying,type=boolean) returns true if playing
 		 */
 		this-&gt;SetMethod(&quot;isPlaying&quot;,&amp;Sound::IsPlaying);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Media.Sound.isPaused) returns true if the sound is paused
+		 * @tiapi(method=True,name=Media.Sound.isPaused,since=0.2) returns true if the sound is paused
+		 * @tiresult(for=Media.Sound.isPaused,type=boolean) returns true if paused
 		 */
 		this-&gt;SetMethod(&quot;isPaused&quot;,&amp;Sound::IsPaused);
 		/**
-		 * @tiapi(method=True,returns=void,name=Media.Sound.onComplete) set the oncomplete function callback
+		 * @tiapi(method=True,name=Media.Sound.onComplete,since=0.2) set the oncomplete function callback
+		 * @tiarg(for=Media.Sound.onComplete,type=method,name=callback) callback method
 		 */
 		this-&gt;SetMethod(&quot;onComplete&quot;,&amp;Sound::OnComplete);
 	}</diff>
      <filename>modules/ti.Media/sound.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -51,23 +51,28 @@ namespace ti
 	{
 		this-&gt;invalid = false;
 		/**
-		 * @tiapi(method=True,returns=string,name=Network.Host.toString) returns a string representation
+		 * @tiapi(method=True,name=Network.Host.toString,since=0.2) returns a string representation
+		 * @tiresult(for=Network.Host.toString,type=string) string
 		 */
 		this-&gt;SetMethod(&quot;toString&quot;,&amp;HostBinding::ToString);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.Host.isInvalid) returns true if valid
+		 * @tiapi(method=True,name=Network.Host.isInvalid,since=0.2) returns true if valid
+		 * @tiresult(for=Network.Host.isInvalid,type=boolean) true if invalid
 		 */
 		this-&gt;SetMethod(&quot;isInvalid&quot;,&amp;HostBinding::IsInvalid);
 		/**
-		 * @tiapi(method=True,returns=string,name=Network.Host.getName) returns the hostname
+		 * @tiapi(method=True,name=Network.Host.getName,since=0.2) returns the hostname
+		 * @tiresult(for=Network.Host.getName,type=string) hostname
 		 */
 		this-&gt;SetMethod(&quot;getName&quot;,&amp;HostBinding::GetName);
 		/**
-		 * @tiapi(method=True,returns=list,name=Network.Host.getAliases) returns a list of aliases
+		 * @tiapi(method=True,name=Network.Host.getAliases,since=0.2) returns a list of aliases
+		 * @tiresult(for=Network.Host.getAliases,type=list) return a list of aliases
 		 */
 		this-&gt;SetMethod(&quot;getAliases&quot;,&amp;HostBinding::GetAliases);
 		/**
-		 * @tiapi(method=True,returns=list,name=Network.Host.getAddresses) returns a list of addresses
+		 * @tiapi(method=True,name=Network.Host.getAddresses,since=0.2) returns a list of addresses
+		 * @tiresult(for=Network.Host.getAddresses,type=list) return a list of ip addresses
 		 */
 		this-&gt;SetMethod(&quot;getAddresses&quot;,&amp;HostBinding::GetAddresses);
 	}</diff>
      <filename>modules/ti.Network/host_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -30,91 +30,98 @@ namespace ti
 		thread(NULL),response(NULL),async(true),filestream(NULL)
 	{
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.HTTPClient.abort) abort an in progress connection
+		 * @tiapi(method=True,name=Network.HTTPClient.abort,since=0.3) abort an in progress connection
 		 */
 		this-&gt;SetMethod(&quot;abort&quot;,&amp;HTTPClientBinding::Abort);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.HTTPClient.open) open the connection
+		 * @tiapi(method=True,name=Network.HTTPClient.open,since=0.3) open the connection
 		 */
 		this-&gt;SetMethod(&quot;open&quot;,&amp;HTTPClientBinding::Open);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.HTTPClient.setRequestHeader) set a request header
+		 * @tiapi(method=True,name=Network.HTTPClient.setRequestHeader,since=0.3) set a request header
+		 * @tiarg(for=Network.HTTPClient.setRequestHeader,name=key,type=string) request key
+		 * @tiarg(for=Network.HTTPClient.setRequestHeader,name=value,type=string) request value
 		 */
 		this-&gt;SetMethod(&quot;setRequestHeader&quot;,&amp;HTTPClientBinding::SetRequestHeader);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.HTTPClient.send) send data
+		 * @tiapi(method=True,name=Network.HTTPClient.send,since=0.3) send data
+		 * @tiarg(for=Network.HTTPClient.send,type=string,name=data) data to send
 		 */
 		this-&gt;SetMethod(&quot;send&quot;,&amp;HTTPClientBinding::Send);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.HTTPClient.sendFile) send file contents as body content
+		 * @tiapi(method=True,name=Network.HTTPClient.sendFile,since=0.3) send file contents as body content
+		 * @tiarg(for=Network.HTTPClient.sendFile,type=string,name=data) file path to send
 		 */
 		this-&gt;SetMethod(&quot;sendFile&quot;,&amp;HTTPClientBinding::SendFile);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.HTTPClient.sendDir) send a directory as a zipped body
+		 * @tiapi(method=True,name=Network.HTTPClient.sendDir,since=0.3) send a directory as a zipped body
+		 * @tiarg(for=Network.HTTPClient.sendDir,type=string,name=data) directory with contents to send
 		 */
 		this-&gt;SetMethod(&quot;sendDir&quot;,&amp;HTTPClientBinding::SendDir);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.HTTPClient.abort) abort an in progress connection
+		 * @tiapi(method=True,name=Network.HTTPClient.getResponseHeader,since=0.3) abort an in progress connection
+		 * @tiarg(for=Network.HTTPClient.getResponseHeader,type=string,name=name) the response header name
+		 * @tiresult(for=Network.HTTPClient.getResponseHeader,type=string) returns the response header by name
 		 */
 		this-&gt;SetMethod(&quot;getResponseHeader&quot;,&amp;HTTPClientBinding::GetResponseHeader);
 
 		/**
-		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.readyState) get the ready state property for the connection
+		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.readyState,since=0.3) get the ready state property for the connection
 		 */
 		SET_INT_PROP(&quot;readyState&quot;,0)
 
 		/**
-		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.UNSENT) the UNSENT readyState property
+		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.UNSENT,since=0.3) the UNSENT readyState property
 		 */
 		SET_INT_PROP(&quot;UNSENT&quot;,0)
 		/**
-		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.OPENED) the OPENED readyState property
+		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.OPENED,since=0.3) the OPENED readyState property
 		 */
 		SET_INT_PROP(&quot;OPENED&quot;,1)
 		/**
-		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.HEADERS_RECEIVED) the HEADERS_RECEIVED readyState property
+		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.HEADERS_RECEIVED,since=0.3) the HEADERS_RECEIVED readyState property
 		 */
 		SET_INT_PROP(&quot;HEADERS_RECEIVED&quot;,2)
 		/**
-		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.LOADING) the LOADING readyState property
+		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.LOADING,since=0.3) the LOADING readyState property
 		 */
 		SET_INT_PROP(&quot;LOADING&quot;,3)
 		/**
-		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.DONE) the DONE readyState property
+		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.DONE,since=0.3) the DONE readyState property
 		 */
 		SET_INT_PROP(&quot;DONE&quot;,4)
 
 		/**
-		 * @tiapi(property=True,type=string,name=Network.HTTPClient.responseText) returns the response as text
+		 * @tiapi(property=True,type=string,name=Network.HTTPClient.responseText,since=0.3) returns the response as text
 		 */
 		SET_NULL_PROP(&quot;responseText&quot;)
 		/**
-		 * @tiapi(property=True,type=object,name=Network.HTTPClient.responseXML) returns the response as DOM
+		 * @tiapi(property=True,type=object,name=Network.HTTPClient.responseXML,since=0.3) returns the response as DOM
 		 */
 		SET_NULL_PROP(&quot;responseXML&quot;)
 		/**
-		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.status) returns the status code
+		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.status,since=0.3) returns the status code
 		 */
 		SET_NULL_PROP(&quot;status&quot;)
 		/**
-		 * @tiapi(property=True,type=string,name=Network.HTTPClient.statusText) returns the status text
+		 * @tiapi(property=True,type=string,name=Network.HTTPClient.statusText,since=0.3) returns the status text
 		 */
 		SET_NULL_PROP(&quot;statusText&quot;)
 		/**
-		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.connected) return true if the connection is connected
+		 * @tiapi(property=True,type=integer,name=Network.HTTPClient.connected,since=0.3) return true if the connection is connected
 		 */
 		SET_BOOL_PROP(&quot;connected&quot;,false)
 
 		/**
-		 * @tiapi(property=True,type=function,name=Network.HTTPClient.onreadystatechange) set the ready state change function handler
+		 * @tiapi(property=True,type=method,name=Network.HTTPClient.onreadystatechange,since=0.3) set the ready state change function handler
 		 */
 		SET_NULL_PROP(&quot;onreadystatechange&quot;)
 		/**
-		 * @tiapi(property=True,type=function,name=Network.HTTPClient.ondatastream) set the function handler as the stream data is received
+		 * @tiapi(property=True,type=method,name=Network.HTTPClient.ondatastream,since=0.3) set the function handler as the stream data is received
 		 */
 		SET_NULL_PROP(&quot;ondatastream&quot;)
 		/**
-		 * @tiapi(property=True,type=function,name=Network.HTTPClient.onsendstream) set the function handler as the stream data is sent
+		 * @tiapi(property=True,type=method,name=Network.HTTPClient.onsendstream,since=0.3) set the function handler as the stream data is sent
 		 */
 		SET_NULL_PROP(&quot;onsendstream&quot;)
 </diff>
      <filename>modules/ti.Network/http/http_client_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -32,71 +32,87 @@ namespace ti
 	void IPAddressBinding::Init()
 	{
 		/**
-		 * @tiapi(method=True,returns=string,name=Network.IPAddress.toString) returns a string representation
+		 * @tiapi(method=True,returns=string,name=Network.IPAddress.toString,since=0.2) returns a string representation
 		 */
 		this-&gt;SetMethod(&quot;toString&quot;,&amp;IPAddressBinding::ToString);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if invalid
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isInvalid,since=0.2) returns true if invalid
+		 * @tiresult(for=Network.IPAddress.isInvalid,type=boolean) returns true if invalid
 		 */
 		this-&gt;SetMethod(&quot;isInvalid&quot;,&amp;IPAddressBinding::IsInvalid);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if an IPv4 address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isIPV4,since=0.2) returns true if an IPv4 address
+		 * @tiresult(for=Network.IPAddress.isIPV4,type=boolean) returns true if ipv4
 		 */
 		this-&gt;SetMethod(&quot;isIPV4&quot;,&amp;IPAddressBinding::IsIPV4);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if an IPv6 address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isIPV6,since=0.2) returns true if an IPv6 address
+		 * @tiresult(for=Network.IPAddress.isIPV6,type=boolean) returns true if ipv6
 		 */
 		this-&gt;SetMethod(&quot;isIPV6&quot;,&amp;IPAddressBinding::IsIPV6);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a wildcard address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isWildcard,since=0.2) returns true if a wildcard address
+		 * @tiresult(for=Network.IPAddress.isWildcard,type=boolean) returns true if wildcard
 		 */
 		this-&gt;SetMethod(&quot;isWildcard&quot;,&amp;IPAddressBinding::IsWildcard);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a broadcast address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isBroadcast,since=0.2) returns true if a broadcast address
+		 * @tiresult(for=Network.IPAddress.isBroadcast,type=boolean) returns true if broadcast
 		 */
 		this-&gt;SetMethod(&quot;isBroadcast&quot;,&amp;IPAddressBinding::IsBroadcast);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a loopback address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isLoopback,since=0.2) returns true if a loopback address
+		 * @tiresult(for=Network.IPAddress.isLoopback,type=boolean) returns true if loopback
 		 */
 		this-&gt;SetMethod(&quot;isLoopback&quot;,&amp;IPAddressBinding::IsLoopback);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a multicast address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isMulticast,since=0.2) returns true if a multicast address
+		 * @tiresult(for=Network.IPAddress.isMulticast,type=boolean) returns true if multicast
 		 */
 		this-&gt;SetMethod(&quot;isMulticast&quot;,&amp;IPAddressBinding::IsMulticast);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a unicast address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isUnicast,since=0.2) returns true if a unicast address
+		 * @tiresult(for=Network.IPAddress.isUnicast,type=boolean) returns true if unicast
 		 */
 		this-&gt;SetMethod(&quot;isUnicast&quot;,&amp;IPAddressBinding::IsUnicast);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a link local address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isLinkLocal,since=0.2) returns true if a link local address
+		 * @tiresult(for=Network.IPAddress.isLinkLocal,type=boolean) returns true if link local
 		 */
 		this-&gt;SetMethod(&quot;isLinkLocal&quot;,&amp;IPAddressBinding::IsLinkLocal);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a site local address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isSiteLocal,since=0.2) returns true if a site local address
+		 * @tiresult(for=Network.IPAddress.isSiteLocal,type=boolean) returns true if site local
 		 */
 		this-&gt;SetMethod(&quot;isSiteLocal&quot;,&amp;IPAddressBinding::IsSiteLocal);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a well-known multicast address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isWellKnownMC,since=0.2) returns true if a well-known multicast address
+		 * @tiresult(for=Network.IPAddress.isWellKnownMC,type=boolean) returns true if well known multicat
 		 */
 		this-&gt;SetMethod(&quot;isWellKnownMC&quot;,&amp;IPAddressBinding::IsWellKnownMC);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a node-local multicast address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isNodeLocalMC,since=0.2) returns true if a node-local multicast address
+		 * @tiresult(for=Network.IPAddress.isNodeLocalMC,type=boolean) returns true if node local multicast
 		 */
 		this-&gt;SetMethod(&quot;isNodeLocalMC&quot;,&amp;IPAddressBinding::IsNodeLocalMC);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a link-local multicast address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isLinkLocalMC,since=0.2) returns true if a link-local multicast address
+		 * @tiresult(for=Network.IPAddress.isLinkLocalMC,type=boolean) returns true if link local multicast
 		 */
 		this-&gt;SetMethod(&quot;isLinkLocalMC&quot;,&amp;IPAddressBinding::IsLinkLocalMC);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a site local multicast address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isSiteLocalMC,since=0.2) returns true if a site local multicast address
+		 * @tiresult(for=Network.IPAddress.isSiteLocalMC,type=boolean) returns true if site local multicast
 		 */
 		this-&gt;SetMethod(&quot;isSiteLocalMC&quot;,&amp;IPAddressBinding::IsSiteLocalMC);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if an organization local multicast address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isOrgLocalMC,since=0.2) returns true if an organization local multicast address
+		 * @tiresult(for=Network.IPAddress.isOrgLocalMC,type=boolean) returns true if org level multicast
 		 */
 		this-&gt;SetMethod(&quot;isOrgLocalMC&quot;,&amp;IPAddressBinding::IsOrgLocalMC);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.toString) returns true if a global multicast address
+		 * @tiapi(method=True,returns=boolean,name=Network.IPAddress.isGlobalMC,since=0.2) returns true if a global multicast address
+		 * @tiresult(for=Network.IPAddress.isGlobalMC,type=boolean) returns true if global multicast
 		 */
 		this-&gt;SetMethod(&quot;isGlobalMC&quot;,&amp;IPAddressBinding::IsGlobalMC);
 	}</diff>
      <filename>modules/ti.Network/ipaddress_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -18,47 +18,56 @@ namespace ti
 		host(host), global(host-&gt;GetGlobalObject()), thread(NULL)
 	{
 		/**
-		 * @tiapi(property=True,type=boolean,name=Network.IRC.connected) returns true if connected
+		 * @tiapi(property=True,type=boolean,name=Network.IRC.connected,since=0.2) returns true if connected
 		 */
 		this-&gt;Set(&quot;connected&quot;,Value::NewBool(false));
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.IRC.connect) connect the IRC connection
+		 * @tiapi(method=True,name=Network.IRC.connect,since=0.2) connect the IRC connection
 		 */
 		this-&gt;SetMethod(&quot;connect&quot;,&amp;IRCClientBinding::Connect);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.IRC.disconnect) disconnect the IRC connection
+		 * @tiapi(method=True,name=Network.IRC.disconnect,since=0.2) disconnect the IRC connection
 		 */
 		this-&gt;SetMethod(&quot;disconnect&quot;,&amp;IRCClientBinding::Disconnect);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.IRC.send) send data on the IRC connection
+		 * @tiapi(method=True,name=Network.IRC.send,since=0.2) send data on the IRC connection
+		 * @tiarg(for=Network.IRC.send,type=string,name=channel) channel
+		 * @tiarg(for=Network.IRC.send,type=string,name=message) message
 		 */
 		this-&gt;SetMethod(&quot;send&quot;,&amp;IRCClientBinding::Send);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.IRC.setNick) set the nick name for the connection
+		 * @tiapi(method=True,name=Network.IRC.setNick,since=0.2) set the nick name for the connection
+		 * @tiarg(for=Network.IRC.setNick,type=string,name=nick) nickname
 		 */
 		this-&gt;SetMethod(&quot;setNick&quot;,&amp;IRCClientBinding::SetNick);
 		/**
-		 * @tiapi(method=True,returns=string,name=Network.IRC.getNick) get the nick name for the connection
+		 * @tiapi(method=True,name=Network.IRC.getNick,since=0.2) get the nick name for the connection
+		 * @tiresult(for=Network.IRC.getNick,type=string) returns nickname
 		 */
 		this-&gt;SetMethod(&quot;getNick&quot;,&amp;IRCClientBinding::GetNick);
 		/**
-		 * @tiapi(method=True,returns=list,name=Network.IRC.getUsers) get a list of users for the channel
+		 * @tiapi(method=True,name=Network.IRC.getUsers,since=0.2) get a list of users for the channel
+		 * @tiresult(for=Network.IRC.getUsers,type=list) returns list of users
 		 */
 		this-&gt;SetMethod(&quot;getUsers&quot;,&amp;IRCClientBinding::GetUsers);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.IRC.join) join a channel
+		 * @tiapi(method=True,name=Network.IRC.join,since=0.2) join a channel
+		 * @tiarg(for=Network.IRC.join,type=string,name=channel) channel
 		 */
 		this-&gt;SetMethod(&quot;join&quot;,&amp;IRCClientBinding::Join);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.IRC.unjoin) unjoin from a channel
+		 * @tiapi(method=True,name=Network.IRC.unjoin,since=0.2) unjoin from a channel
+		 * @tiarg(for=Network.IRC.unjoin,type=string,name=channel) channel
 		 */
 		this-&gt;SetMethod(&quot;unjoin&quot;,&amp;IRCClientBinding::Unjoin);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IRC.isOp) returns true if the user is an operator
+		 * @tiapi(method=True,name=Network.IRC.isOp,since=0.2) returns true if the user is an operator
+		 * @tiresult(for=Network.IRC.isOp,type=boolean) true if user is operator
 		 */
 		this-&gt;SetMethod(&quot;isOp&quot;,&amp;IRCClientBinding::IsOp);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.IRC.isVoice) returns true if the user has voice
+		 * @tiapi(method=True,returns=boolean,name=Network.IRC.isVoice,since=0.2) returns true if the user has voice
+		 * @tiresult(for=Network.IRC.isVoice,type=boolean) true if user has voice
 		 */
 		this-&gt;SetMethod(&quot;isVoice&quot;,&amp;IRCClientBinding::IsVoice);
 </diff>
      <filename>modules/ti.Network/irc/irc_client_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -22,50 +22,69 @@ namespace ti
 	{
    		SharedValue online = Value::NewBool(true);
 		/**
-		 * @tiapi(property=True,returns=boolean,name=Network.online) returns true if the machine is connected to the Internet
+		 * @tiapi(property=True,name=Network.online,since=0.2) returns true if the machine is connected to the Internet
+		 * @tiresult(for=Network.online,type=boolean) returns true if online
 		 */
 		this-&gt;Set(&quot;online&quot;, online);
 
 		// methods that are available on Titanium.Network
 		/**
-		 * @tiapi(method=True,returns=object,name=Network.createTCPSocket) creates a TCP client socket
+		 * @tiapi(method=True,name=Network.createTCPSocket,since=0.2) creates a TCP client socket
+		 * @tiarg(for=Network.createTCPSocket,name=host,type=string) hostname
+		 * @tiarg(for=Network.createTCPSocket,name=port,type=integer) port
+		 * @tiresult(for=Network.createTCPSocket,type=object) return a Network.TCPSocket object
 		 */
 		this-&gt;SetMethod(&quot;createTCPSocket&quot;,&amp;NetworkBinding::CreateTCPSocket);
 		/**
-		 * @tiapi(method=True,returns=object,name=Network.createIRCClient) creates an IRC client socket
+		 * @tiapi(method=True,name=Network.createIRCClient,since=0.2) creates an IRC client socket
+		 * @tiresult(for=Network.createIRCClient,type=object) return a Network.IRCClient object
 		 */
 		this-&gt;SetMethod(&quot;createIRCClient&quot;,&amp;NetworkBinding::CreateIRCClient);
 		/**
-		 * @tiapi(method=True,returns=object,name=Network.createIPAddress) creates IP Address object
+		 * @tiapi(method=True,name=Network.createIPAddress,since=0.2) creates IP Address object
+		 * @tiarg(for=Network.createIPAddress,name=address,type=string) address
+		 * @tiresult(for=Network.createIPAddress,type=object) return a Network.IPAddress object
 		 */
 		this-&gt;SetMethod(&quot;createIPAddress&quot;,&amp;NetworkBinding::CreateIPAddress);
 		/**
-		 * @tiapi(method=True,returns=object,name=Network.createHTTPClient) creates an HTTP client
+		 * @tiapi(method=True,name=Network.createHTTPClient,since=0.3) creates an HTTP client
+		 * @tiresult(for=Network.createHTTPClient,type=object) return a Network.HTTPClient object
 		 */
 		this-&gt;SetMethod(&quot;createHTTPClient&quot;,&amp;NetworkBinding::CreateHTTPClient);
 		/**
-		 * @tiapi(method=True,returns=object,name=Network.getHostByName) convert a host by name into a Host object
+		 * @tiapi(method=True,name=Network.getHostByName,since=0.2) convert a host by name into a Host object
+		 * @tiarg(for=Network.getHostByName,name=name,type=string) hostname
+		 * @tiresult(for=Network.getHostByName,type=object) return a Network.Host object
 		 */
 		this-&gt;SetMethod(&quot;getHostByName&quot;,&amp;NetworkBinding::GetHostByName);
 		/**
-		 * @tiapi(method=True,returns=object,name=Network.getHostByAddress) convert a host by ip into a Host object
+		 * @tiapi(method=True,name=Network.getHostByAddress,since=0.2) convert a host by ip into a Host object
+		 * @tiarg(for=Network.getHostByAddress,name=address,type=string) address
+		 * @tiresult(for=Network.getHostByAddress,type=object) return a Network.Host object
 		 */
 		this-&gt;SetMethod(&quot;getHostByAddress&quot;,&amp;NetworkBinding::GetHostByAddress);
 		/**
-		 * @tiapi(method=True,returns=object,name=Network.encodeURIComponent) encode a URI component
+		 * @tiapi(method=True,name=Network.encodeURIComponent,since=0.3) encode a URI component
+		 * @tiarg(for=Network.encodeURIComponent,name=value,type=string) value to encode
+		 * @tiresult(for=Network.encodeURIComponent,type=string) encoded value
 		 */
 		this-&gt;SetMethod(&quot;encodeURIComponent&quot;,&amp;NetworkBinding::EncodeURIComponent);
 		/**
-		 * @tiapi(method=True,returns=object,name=Network.decodeURIComponent) decode a URI component
+		 * @tiapi(method=True,name=Network.decodeURIComponent,since=0.3) decode a URI component
+		 * @tiarg(for=Network.decodeURIComponent,name=value,type=string) value to decode
+		 * @tiresult(for=Network.decodeURIComponent,type=string) decoded value
 		 */
 		this-&gt;SetMethod(&quot;decodeURIComponent&quot;,&amp;NetworkBinding::DecodeURIComponent);
 
 		/**
-		 * @tiapi(method=True,returns=int,name=Network.addConnectivityListener) add a connectivity change listener. returns an id to be used when removing.
+		 * @tiapi(method=True,name=Network.addConnectivityListener,since=0.2) add a connectivity change listener. returns an id to be used when removing.
+		 * @tiarg(for=Network.addConnectivityListener,type=method,name=listener) callback method
+		 * @tiresult(for=Network.addConnectivityListener,type=integer) returns an registration id to use when removing
 		 */
 		this-&gt;SetMethod(&quot;addConnectivityListener&quot;,&amp;NetworkBinding::AddConnectivityListener);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.removeConnectivityListener) remove a connectivity change listener
+		 * @tiapi(method=True,name=Network.removeConnectivityListener,since=0.2) remove a connectivity change listener
+		 * @tiarg(for=Network.removeConnectivityListener,type=integer,name=id) registration id
 		 */
 		this-&gt;SetMethod(&quot;removeConnectivityListener&quot;,&amp;NetworkBinding::RemoveConnectivityListener);
 </diff>
      <filename>modules/ti.Network/network_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -16,37 +16,46 @@ namespace ti
 		onRead(NULL), onWrite(NULL), onTimeout(NULL), onReadComplete(NULL)
 	{
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.TCPSocket.connect) connect the socket
+		 * @tiapi(method=True,name=Network.TCPSocket.connect,version=0.2) connect the socket
+		 * @tiresult(for=Network.TCPSocket.connect,type=boolean) returns result as boolean
 		 */
 		this-&gt;SetMethod(&quot;connect&quot;,&amp;TCPSocketBinding::Connect);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.TCPSocket.close) close the socket connection
+		 * @tiapi(method=True,name=Network.TCPSocket.close,version=0.2) close the socket connection
+		 * @tiresult(for=Network.TCPSocket.close,type=boolean) returns result as boolean
 		 */
 		this-&gt;SetMethod(&quot;close&quot;,&amp;TCPSocketBinding::Close);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.TCPSocket.write) write data to the socket
+		 * @tiapi(method=True,name=Network.TCPSocket.write,version=0.2) write data to the socket
+		 * @tiarg(for=Network.TCPSocket.write,type=string,name=data) data to write
+		 * @tiresult(for=Network.TCPSocket.write,type=boolean) returns result as boolean
 		 */
 		this-&gt;SetMethod(&quot;write&quot;,&amp;TCPSocketBinding::Write);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Network.TCPSocket.isClosed) returns true if the socket is closed
+		 * @tiapi(method=True,name=Network.TCPSocket.isClosed,version=0.2) returns true if the socket is closed
+		 * @tiresult(for=Network.TCPSocket.isClosed,type=boolean) returns true if closed
 		 */
 		this-&gt;SetMethod(&quot;isClosed&quot;,&amp;TCPSocketBinding::IsClosed);
 
 		// event handler callbacks
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.TCPSocket.onRead) sets the callback to be invoked on a read
+		 * @tiapi(method=True,name=Network.TCPSocket.onRead,version=0.2) sets the callback to be invoked on a read
+		 * @tiarg(for=Network.TCPSocket.onRead,type=method,name=callback) callback method
 		 */
 		this-&gt;SetMethod(&quot;onRead&quot;,&amp;TCPSocketBinding::SetOnRead);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.TCPSocket.onWrite) sets the callback to be invoked on a write
+		 * @tiapi(method=True,name=Network.TCPSocket.onWrite,version=0.2) sets the callback to be invoked on a write
+		 * @tiarg(for=Network.TCPSocket.onWrite,type=method,name=callback) callback method
 		 */
 		this-&gt;SetMethod(&quot;onWrite&quot;,&amp;TCPSocketBinding::SetOnWrite);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.TCPSocket.onTimeout) sets the callback to be invoked when a read times out
+		 * @tiapi(method=True,name=Network.TCPSocket.onTimeout,version=0.2) sets the callback to be invoked when a read times out
+		 * @tiarg(for=Network.TCPSocket.onTimeout,type=method,name=callback) callback method
 		 */
 		this-&gt;SetMethod(&quot;onTimeout&quot;,&amp;TCPSocketBinding::SetOnTimeout);
 		/**
-		 * @tiapi(method=True,returns=void,name=Network.TCPSocket.onReadComplete) sets the callback to be invoked when no more data is available
+		 * @tiapi(method=True,name=Network.TCPSocket.onReadComplete,version=0.2) sets the callback to be invoked when no more data is available
+		 * @tiarg(for=Network.TCPSocket.onReadComplete,type=method,name=callback) callback method
 		 */
 		this-&gt;SetMethod(&quot;onReadComplete&quot;,&amp;TCPSocketBinding::SetOnReadComplete);
 </diff>
      <filename>modules/ti.Network/tcp_socket_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -66,22 +66,22 @@ namespace ti
 				std::string display_name = nitf.displayName();
 				std::string name = nitf.name();
 				/**
-				 * @tiapi(property=True,type=string,name=Platform.Interface.address) ip address
+				 * @tiapi(property=True,type=string,name=Platform.Interface.address,since=0.2) ip address
 				 */
 				obj-&gt;Set(&quot;address&quot;,Value::NewString(ip_addr));
 				/**
-				 * @tiapi(property=True,type=string,name=Platform.Interface.name) name of the interface
+				 * @tiapi(property=True,type=string,name=Platform.Interface.name,since=0.2) name of the interface
 				 */
 				obj-&gt;Set(&quot;name&quot;,Value::NewString(name));
 				/**
-				 * @tiapi(property=True,type=string,name=Platform.Interface.displayName) display name of the interface
+				 * @tiapi(property=True,type=string,name=Platform.Interface.displayName,since=0.2) display name of the interface
 				 */
 				obj-&gt;Set(&quot;displayName&quot;,Value::NewString(display_name));
 				interfaces-&gt;Append(Value::NewObject(obj));
 			}
 		}
 		/**
-		 * @tiapi(method=True,type=list,name=Platform.interfaces) returns a list of network interfaces
+		 * @tiapi(method=True,type=list,name=Platform.interfaces,since=0.3) returns a list of network interfaces
 		 */
 		this-&gt;Set(&quot;interfaces&quot;, Value::NewList(interfaces));
 
@@ -177,7 +177,7 @@ namespace ti
 //we might want to actually programmatically determine if running on
 //64-bit processor or not...
 		/**
-		 * @tiapi(property=True,type=string,name=Platform.ostype) the architecture type (either 32 bit or 64 bit)
+		 * @tiapi(property=True,type=string,name=Platform.ostype,since=0.3) the architecture type (either 32 bit or 64 bit)
 		 */
 #ifdef OS_32
 		this-&gt;Set(&quot;ostype&quot;, Value::NewString(&quot;32bit&quot;));
@@ -185,42 +185,43 @@ namespace ti
 		this-&gt;Set(&quot;ostype&quot;, Value::NewString(&quot;64bit&quot;));
 #endif
 		/**
-		 * @tiapi(property=True,type=string,name=Platform.name) the operating system name
+		 * @tiapi(property=True,type=string,name=Platform.name,since=0.2) the operating system name
 		 */
 		this-&gt;Set(&quot;name&quot;, Value::NewString(os_name));
 		/**
-		 * @tiapi(property=True,type=string,name=Platform.version) the operating system version
+		 * @tiapi(property=True,type=string,name=Platform.version,since=0.2) the operating system version
 		 */
 		this-&gt;Set(&quot;version&quot;, Value::NewString(os_version));
 		/**
-		 * @tiapi(property=True,type=string,name=Platform.architecture) the operating system architecture
+		 * @tiapi(property=True,type=string,name=Platform.architecture,since=0.2) the operating system architecture
 		 */
 		this-&gt;Set(&quot;architecture&quot;, Value::NewString(arch));
 		/**
-		 * @tiapi(property=True,type=string,name=Platform.address) the primary ip address
+		 * @tiapi(property=True,type=string,name=Platform.address,since=0.2) the primary ip address
 		 */
 		this-&gt;Set(&quot;address&quot;, Value::NewString(address));
 		/**
-		 * @tiapi(property=True,type=string,name=Platform.id) the unique machine id
+		 * @tiapi(property=True,type=string,name=Platform.id,since=0.2) the unique machine id
 		 */
 		this-&gt;Set(&quot;id&quot;, Value::NewString(machineid));
 		/**
-		 * @tiapi(property=True,type=string,name=Platform.macaddress) the primary mac address
+		 * @tiapi(property=True,type=string,name=Platform.macaddress,since=0.3) the primary mac address
 		 */
 		this-&gt;Set(&quot;macaddress&quot;, Value::NewString(macid));
 		/**
-		 * @tiapi(property=True,type=integer,name=Platform.processorCount) the number of processors for the machine
+		 * @tiapi(property=True,type=integer,name=Platform.processorCount,since=0.2) the number of processors for the machine
 		 */
 		this-&gt;Set(&quot;processorCount&quot;, Value::NewInt(num_proc));
 		std::string username = kroll::FileUtils::GetUsername();
 		/**
-		 * @tiapi(property=True,type=string,name=Platform.username) the platform's user name
+		 * @tiapi(property=True,type=string,name=Platform.username,since=0.2) the platform's user name
 		 */
 		this-&gt;Set(&quot;username&quot;, Value::NewString(username));
 
 		// UUID create function for the platform
 		/**
-		 * @tiapi(method=True,returns=string,name=Platform.createUUID) create a globally unique id
+		 * @tiapi(method=True,returns=string,name=Platform.createUUID,since=0.3) create a globally unique id
+		 * @tiresult(for=Platform.createUUID,type=string) result as string
 		 */
 		this-&gt;SetMethod(&quot;createUUID&quot;,&amp;PlatformBinding::CreateUUID);
 	}</diff>
      <filename>modules/ti.Platform/platform_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -13,19 +13,21 @@ namespace ti
 	Pipe::Pipe(Poco::PipeIOS* pipe) : pipe(pipe), closed(false)
 	{
 		/**
-		 * @tiapi(property=True,type=boolean,name=Process.Pipe.closed) returns true if the pipe is closed
+		 * @tiapi(property=True,type=boolean,name=Process.Pipe.closed,since=0.2) returns true if the pipe is closed
 		 */
 		this-&gt;Set(&quot;closed&quot;,Value::NewBool(false));
 		/**
-		 * @tiapi(method=True,returns=object,name=Process.Pipe.close) close the pipe
+		 * @tiapi(method=True,name=Process.Pipe.close,since=0.2) close the pipe
 		 */
 		this-&gt;SetMethod(&quot;close&quot;,&amp;Pipe::Close);
 		/**
-		 * @tiapi(method=True,returns=object,name=Process.Pipe.write) write data to the pipe
+		 * @tiapi(method=True,name=Process.Pipe.write,since=0.2) write data to the pipe
+		 * @tiarg(for=Process.Pipe.write,type=string,name=data) data to write
 		 */
 		this-&gt;SetMethod(&quot;write&quot;,&amp;Pipe::Write);
 		/**
-		 * @tiapi(method=True,returns=object,name=Process.Pipe.close) read data from the pipe
+		 * @tiapi(method=True,name=Process.Pipe.read,since=0.2) read data from the pipe
+		 * @tiresult(for=Process.Pipe.read,type=string) result read from pipe
 		 */
 		this-&gt;SetMethod(&quot;read&quot;,&amp;Pipe::Read);
 	}</diff>
      <filename>modules/ti.Process/pipe.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -30,39 +30,42 @@ namespace ti
 		}
 		
 		/**
-		 * @tiapi(property=True,type=string,name=Process.Process.command) returns the command for the process
+		 * @tiapi(property=True,type=string,name=Process.Process.command,version=0.2) returns the command for the process
 		 */
 		this-&gt;Set(&quot;command&quot;,Value::NewString(cmd));
 		/**
-		 * @tiapi(property=True,type=integer,name=Process.Process.pid) returns the process id for the process
+		 * @tiapi(property=True,type=integer,name=Process.Process.pid,version=0.2) returns the process id for the process
 		 */
 		this-&gt;Set(&quot;pid&quot;,Value::NewInt((int)process-&gt;id()));
 		/**
-		 * @tiapi(property=True,type=boolean,name=Process.Process.running) returns true if the command is running
+		 * @tiapi(property=True,type=boolean,name=Process.Process.running,version=0.2) returns true if the command is running
 		 */
 		this-&gt;Set(&quot;running&quot;,Value::NewBool(true)); 
 		 
 		this-&gt;err = new Pipe(new Poco::PipeInputStream(*errp));
 		SharedBoundObject errb = this-&gt;err;
 		/**
-		 * @tiapi(method=True,returns=object,name=Process.Process.err) returns the error stream as a Pipe object
+		 * @tiapi(property=True,name=Process.Process.err,version=0.2) returns the error stream as a Pipe object
 		 */
 		this-&gt;Set(&quot;err&quot;,Value::NewObject(errb));
 		
 		this-&gt;out = new Pipe(new Poco::PipeInputStream(*outp));
 		SharedBoundObject outb = this-&gt;out;
 		/**
-		 * @tiapi(method=True,returns=object,name=Process.Process.out) returns the output stream as a Pipe object
+		 * @tiapi(property=True,name=Process.Process.out,version=0.2) returns the output stream as a Pipe object
 		 */
 		this-&gt;Set(&quot;out&quot;,Value::NewObject(outb));
 		
 		this-&gt;in = new Pipe(new Poco::PipeOutputStream(*inp));
 		SharedBoundObject inb = this-&gt;in;
 		/**
-		 * @tiapi(method=True,returns=object,name=Process.Process.in) returns the input stream as a Pipe object
+		 * @tiapi(property=True,name=Process.Process.in,version=0.2) returns the input stream as a Pipe object
 		 */
 		this-&gt;Set(&quot;in&quot;,Value::NewObject(inb));
 		
+		/**
+		 * @tiapi(method=True,name=Process.Process.terminate,version=0.2) terminate the process
+		 */
 		this-&gt;SetMethod(&quot;terminate&quot;,&amp;Process::Terminate);
 	}
 	Process::~Process()</diff>
      <filename>modules/ti.Process/process.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -24,7 +24,7 @@ namespace ti
 	ProcessBinding::ProcessBinding(Host *h, SharedBoundObject global) : host(h),global(global)
 	{
 		/**
-		 * @tiapi(property=True,type=integer,name=Process.pid) returns the process id from the application
+		 * @tiapi(property=True,type=integer,name=Process.pid,since=0.3) returns the process id from the application
 		 */
 #ifdef OS_OSX
 		NSProcessInfo *p = [NSProcessInfo processInfo];
@@ -36,23 +36,31 @@ namespace ti
 		//static void times(long&amp; userTime, long&amp; kernelTime);
 
 		/**
-		 * @tiapi(method=True,returns=list,name=Process.getEnv) returns a list of environment variables
+		 * @tiapi(method=True,returns=list,name=Process.getEnv,since=0.2) returns a list of environment variables
+		 * @tiarg(for=Process.getEnv,name=name,type=string) name of the environment property
+		 * @tiresult(for=Process.getEnv,type=string) value for name
 		 */
 		this-&gt;SetMethod(&quot;getEnv&quot;,&amp;ProcessBinding::GetEnv);
 		/**
-		 * @tiapi(method=True,returns=void,name=Process.setEnv) sets an environment variable
+		 * @tiapi(method=True,returns=void,name=Process.setEnv,since=0.2) sets an environment variable
+		 * @tiarg(for=Process.setEnv,name=name,type=string) name of the environment property
+		 * @tiarg(for=Process.setEnv,name=value,type=string) value of the environment property
 		 */
 		this-&gt;SetMethod(&quot;setEnv&quot;,&amp;ProcessBinding::SetEnv);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=Process.hasEnv) returns true if a value exists in the environment
+		 * @tiapi(method=True,name=Process.hasEnv,since=0.2) returns true if a value exists in the environment
+		 * @tiarg(for=Process.hasEnv,name=name,type=string) name of the environment property
+		 * @tiresult(for=Process.hasEnv,type=boolean) returns true if found
 		 */
 		this-&gt;SetMethod(&quot;hasEnv&quot;,&amp;ProcessBinding::HasEnv);
 		/**
-		 * @tiapi(method=True,returns=object,name=Process.launch) launch an external application and returns a Process object
+		 * @tiapi(method=True,name=Process.launch,since=0.2) launch an external application and returns a Process object
+		 * @tiarg(for=Process.launch,name=command,type=string) command line
+		 * @tiresult(for=Process.launch,type=object) returns Process object
 		 */
 		this-&gt;SetMethod(&quot;launch&quot;,&amp;ProcessBinding::Launch);
 		/**
-		 * @tiapi(method=True,returns=void,name=Process.restart) restart the application
+		 * @tiapi(method=True,returns=void,name=Process.restart,since=0.3) restart the application
 		 */
 		this-&gt;SetMethod(&quot;restart&quot;,&amp;ProcessBinding::Restart);
 	}</diff>
      <filename>modules/ti.Process/process_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -15,47 +15,60 @@ namespace ti
 
 		// query methods
 		/**
-		 * @tiapi(method=True,returns=boolean,name=UI.Menu.isSeparator) returns true if a separator
+		 * @tiapi(method=True,name=UI.Menu.isSeparator,since=0.2) returns true if a separator
+		 * @tiresult(for=UI.Menu.isSeparator,type=boolean) true if separator
 		 */
 		this-&gt;SetMethod(&quot;isSeparator&quot;, &amp;MenuItem::_IsSeparator);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=UI.Menu.isItem) returns true if an item
+		 * @tiapi(method=True,name=UI.Menu.isItem,since=0.2) returns true if an item
+		 * @tiresult(for=UI.Menu.isItem,type=boolean) true if item
 		 */
 		this-&gt;SetMethod(&quot;isItem&quot;, &amp;MenuItem::_IsItem);
 		/**
-		 * @tiapi(method=True,returns=boolean,name=UI.Menu.isSubMenu) returns true if a submenu
+		 * @tiapi(method=True,name=UI.Menu.isSubMenu,since=0.2) returns true if a submenu
+		 * @tiresult(for=UI.Menu.isSubMenu,type=boolean) true if submenu
 		 */
 		this-&gt;SetMethod(&quot;isSubMenu&quot;, &amp;MenuItem::_IsSubMenu);
 
 		// submenu methods
 		/**
-		 * @tiapi(method=True,returns=object,name=UI.Menu.addSepartor) add a separator
+		 * @tiapi(method=True,name=UI.Menu.addSeparator,since=0.2) add a separator
+		 * @tiresult(for=UI.Menu.addSeparator,type=object) returns separator MenuItem
 		 */
 		this-&gt;SetMethod(&quot;addSeparator&quot;, &amp;MenuItem::_AddSeparator);
 		/**
-		 * @tiapi(method=True,returns=object,name=UI.Menu.addItem) add an item
+		 * @tiapi(method=True,name=UI.Menu.addItem,since=0.2) add an item
+		 * @tiarg(for=UI.Menu.addItem,name=label,type=string,optional=True) label for the menu
+		 * @tiarg(for=UI.Menu.addItem,name=callback,type=method,optional=True) callback for the menu
+		 * @tiarg(for=UI.Menu.addItem,name=icon,type=string,optional=True) icon for the menu
+		 * @tiresult(for=UI.Menu.addItem,type=object) returns item MenuItem
 		 */
 		this-&gt;SetMethod(&quot;addItem&quot;, &amp;MenuItem::_AddItem);
 		/**
-		 * @tiapi(method=True,returns=object,name=UI.Menu.addSubMenu) add a submenu
+		 * @tiapi(method=True,name=UI.Menu.addSubMenu,since=0.2) add a submenu
+		 * @tiarg(for=UI.Menu.addItem,name=label,type=string,optional=True) label for the menu
+		 * @tiarg(for=UI.Menu.addItem,name=icon,type=string,optional=True) icon for the menu
+		 * @tiresult(for=UI.Menu.addSubMenu,type=object) returns submenu MenuItem
 		 */
 		this-&gt;SetMethod(&quot;addSubMenu&quot;, &amp;MenuItem::_AddSubMenu);
 
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.Menu.enable) enable the menu item
+		 * @tiapi(method=True,name=UI.Menu.enable,since=0.2) enable the menu item
 		 */
 		this-&gt;SetMethod(&quot;enable&quot;, &amp;MenuItem::_Enable);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.Menu.disable) disable the menu item
+		 * @tiapi(method=True,name=UI.Menu.disable,since=0.2) disable the menu item
 		 */
 		this-&gt;SetMethod(&quot;disable&quot;, &amp;MenuItem::_Disable);
 
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.Menu.setLabel) set the menu label
+		 * @tiapi(method=True,name=UI.Menu.setLabel,since=0.2) set the menu label
+		 * @tiarg(for=UI.Menu.setLabel,name=label,type=string) label value
 		 */
 		this-&gt;SetMethod(&quot;setLabel&quot;, &amp;MenuItem::_SetLabel);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.Menu.setIcon) set the icon for the menu
+		 * @tiapi(method=True,name=UI.Menu.setIcon,since=0.2) set the icon for the menu
+		 * @tiarg(for=UI.Menu.setIcon,name=icon,type=string) icon value
 		 */
 		this-&gt;SetMethod(&quot;setIcon&quot;, &amp;MenuItem::_SetIcon);
 	}</diff>
      <filename>modules/ti.UI/menu_item.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -12,19 +12,22 @@ namespace ti
 	TrayItem::TrayItem() : StaticBoundObject()
 	{
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.Tray.setIcon) set the tray icon image
+		 * @tiapi(method=True,name=UI.Tray.setIcon,since=0.2) set the tray icon image
+		 * @tiarg(for=UI.Tray.setIcon,name=icon,type=string,optional=True) icon value or null to unset
 		 */
 		this-&gt;SetMethod(&quot;setIcon&quot;, &amp;TrayItem::_SetIcon);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.Tray.setMenu) set the tray menu
+		 * @tiapi(method=True,name=UI.Tray.setMenu,since=0.2) set the tray menu
+		 * @tiarg(for=UI.Tray.setMenu,name=menu,type=object,optional=True) MenuItem value or null to unset
 		 */
 		this-&gt;SetMethod(&quot;setMenu&quot;, &amp;TrayItem::_SetMenu);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.Tray.setHint) set the tray hint tooltip
+		 * @tiapi(method=True,name=UI.Tray.setHint,since=0.2) set the tray hint tooltip
+		 * @tiarg(for=UI.Tray.setHint,name=hint,type=string,optional=True) hint value or null to unset
 		 */
 		this-&gt;SetMethod(&quot;setHint&quot;, &amp;TrayItem::_SetHint);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.Tray.remove) remove the tray item
+		 * @tiapi(method=True,name=UI.Tray.remove,since=0.2) remove the tray item
 		 */
 		this-&gt;SetMethod(&quot;remove&quot;, &amp;TrayItem::_Remove);
 	}</diff>
      <filename>modules/ti.UI/tray_item.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -24,66 +24,79 @@ namespace ti
 		instance = this;
 
 		/**
-		 * @tiapi(method=True,returns=object,name=UI.createMenu) creates a Menu object
+		 * @tiapi(method=True,name=UI.createMenu,version=0.2) creates a MenuItem object
+		 * @tiresult(for=UI.createMenu,type=object) returns a new MenuItem object
 		 */
 		this-&gt;SetMethod(&quot;createMenu&quot;, &amp;UIBinding::_CreateMenu);
 		/**
-		 * @tiapi(method=True,returns=object,name=UI.createTrayMenu) creates a tray Menu object
+		 * @tiapi(method=True,name=UI.createTrayMenu,version=0.2) creates a tray Menu object
+		 * @tiresult(for=UI.createTrayMenu,type=object) returns a new MenuItem object
 		 */
 		this-&gt;SetMethod(&quot;createTrayMenu&quot;, &amp;UIBinding::_CreateTrayMenu);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.setMenu) sets a menu for the application
+		 * @tiapi(method=True,name=UI.setMenu,version=0.2) sets a menu for the application
+		 * @tiarg(for=UI.setMenu,type=object,name=menu) menu
 		 */
 		this-&gt;SetMethod(&quot;setMenu&quot;, &amp;UIBinding::_SetMenu);
 		/**
-		 * @tiapi(method=True,returns=object,name=UI.getMeu) returns the application menu
+		 * @tiapi(method=True,name=UI.getMenu,version=0.2) returns the application menu
+		 * @tiresult(for=UI.getMenu,type=object) returns the menu
 		 */
 		this-&gt;SetMethod(&quot;getMenu&quot;, &amp;UIBinding::_GetMenu);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.setContextMenu) sets the application context menu
+		 * @tiapi(method=True,name=UI.setContextMenu,version=0.2) sets the application context menu
+		 * @tiarg(for=UI.setContextMenu,type=object,name=menu) menu
 		 */
 		this-&gt;SetMethod(&quot;setContextMenu&quot;, &amp;UIBinding::_SetContextMenu);
 		/**
-		 * @tiapi(method=True,returns=object,name=UI.getContextMenu) gets the application context menu
+		 * @tiapi(method=True,name=UI.getContextMenu,version=0.2) gets the application context menu
+		 * @tiresult(for=UI.getContextMenu,type=object) returns the menu
 		 */
 		this-&gt;SetMethod(&quot;getContextMenu&quot;, &amp;UIBinding::_GetContextMenu);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.setIcon) sets the application icon
+		 * @tiapi(method=True,name=UI.setIcon,version=0.2) sets the application icon
+		 * @tiarg(for=UI.setIcon,type=object,name=menu) icon
 		 */
 		this-&gt;SetMethod(&quot;setIcon&quot;, &amp;UIBinding::_SetIcon);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.addTray) adds a tray menu
+		 * @tiapi(method=True,name=UI.addTray,version=0.2) adds a tray menu
+		 * @tiarg(for=UI.addTray,type=object,name=menu) tray menu
 		 */
 		this-&gt;SetMethod(&quot;addTray&quot;, &amp;UIBinding::_AddTray);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.clearTray) removes a tray menu
+		 * @tiapi(method=True,name=UI.clearTray,version=0.2) removes a tray menu
 		 */
 		this-&gt;SetMethod(&quot;clearTray&quot;, &amp;UIBinding::_ClearTray);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.setDockIcon) set the dock icon
+		 * @tiapi(method=True,name=UI.setDockIcon,version=0.2) set the dock icon
+		 * @tiarg(for=UI.setDockIcon,type=string,name=icon) icon
 		 */
 		this-&gt;SetMethod(&quot;setDockIcon&quot;, &amp;UIBinding::_SetDockIcon);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.setDockMenu) set the dock menu
+		 * @tiapi(method=True,name=UI.setDockMenu,version=0.2) set the dock menu
+		 * @tiarg(for=UI.setDockMenu,type=object,name=menu) menu
 		 */
 		this-&gt;SetMethod(&quot;setDockMenu&quot;, &amp;UIBinding::_SetDockMenu);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.setBadge) set the application badge value
+		 * @tiapi(method=True,name=UI.setBadge,version=0.2) set the application badge value
+		 * @tiarg(for=UI.setBadge,type=string,name=badge) badge value
 		 */
 		this-&gt;SetMethod(&quot;setBadge&quot;, &amp;UIBinding::_SetBadge);
 		/**
-		 * @tiapi(method=True,returns=void,name=UI.setBadgeImage) set the application badge image
+		 * @tiapi(method=True,name=UI.setBadgeImage,version=0.2) set the application badge image
+		 * @tiarg(for=UI.setBadge,type=string,name=badge_image) badge image path
 		 */
 		this-&gt;SetMethod(&quot;setBadgeImage&quot;, &amp;UIBinding::_SetBadgeImage);
 
 		/**
-		 * @tiapi(method=True,returns=long,name=UI.createMenu) get the user's idle time (for the machine, not just the application)
+		 * @tiapi(method=True,name=UI.getIdleTime,version=0.2) get the user's idle time (for the machine, not just the application)
+		 * @tiresult(for=UI.getIdleTime,type=double) returns the idle time as a double
 		 */
 		this-&gt;SetMethod(&quot;getIdleTime&quot;, &amp;UIBinding::_GetIdleTime);
 
 		this-&gt;open_window_list = new StaticBoundList();
 		/**
-		 * @tiapi(property=True,returns=list,name=UI.windows) gets a list of user created windows
+		 * @tiapi(property=True,name=UI.windows,version=0.2) gets a list of user created windows
 		 */
 		this-&gt;Set(&quot;windows&quot;, Value::NewList(this-&gt;open_window_list));
 
@@ -100,7 +113,7 @@ namespace ti
 
 		SharedBoundObject global = host-&gt;GetGlobalObject();
 		/**
-		 * @tiapi(property=True,returns=object,name=UI.mainWindow) get the main window 
+		 * @tiapi(property=True,name=UI.mainWindow) get the main window 
 		 */
 		global-&gt;SetNS(&quot;UI.mainWindow&quot;, Value::NewObject(main_window));
 </diff>
      <filename>modules/ti.UI/ui_binding.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -59,243 +59,300 @@ UserWindow::UserWindow(SharedUIBinding binding, WindowConfig *config, SharedUser
 	this-&gt;shared_this = this;
 
 	/**
-	 * @tiapi(property=True,type=int,name=UI.UserWindow.CENTERED) CENTERED constant
+	 * @tiapi(property=True,type=integer,name=UI.UserWindow.CENTERED,since=0.3) CENTERED constant
 	 */
 	this-&gt;Set(&quot;CENTERED&quot;, Value::NewInt(UserWindow::CENTERED));
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.hide) hides the window
+	 * @tiapi(method=True,name=UI.UserWindow.hide,since=0.2) hides the window
 	 */
 	this-&gt;SetMethod(&quot;hide&quot;, &amp;UserWindow::_Hide);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.show) shows the window
+	 * @tiapi(method=True,name=UI.UserWindow.show,since=0.2) shows the window
 	 */
 	this-&gt;SetMethod(&quot;show&quot;, &amp;UserWindow::_Show);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.focus) focus the window
+	 * @tiapi(method=True,name=UI.UserWindow.focus,since=0.2) focus the window
 	 */
 	this-&gt;SetMethod(&quot;focus&quot;, &amp;UserWindow::_Focus);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.unfocus) unfocus the window
+	 * @tiapi(method=True,name=UI.UserWindow.unfocus,since=0.2) unfocus the window
 	 */
 	this-&gt;SetMethod(&quot;unfocus&quot;, &amp;UserWindow::_Unfocus);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=UI.UserWindow.isUsingChrome) returns true if the window has system chrome
+	 * @tiapi(method=True,name=UI.UserWindow.isUsingChrome,since=0.2) returns true if the window has system chrome
+	 * @tiresult(for=UI.UserWindow.isUsingChrome,type=boolean) true if using system chrome
 	 */
 	this-&gt;SetMethod(&quot;isUsingChrome&quot;, &amp;UserWindow::_IsUsingChrome);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setUsingChrome) sets true if the window should use system chrome
+	 * @tiapi(method=True,name=UI.UserWindow.setUsingChrome,since=0.2) sets true if the window should use system chrome
+	 * @tiarg(for=UI.UserWindow.setUsingChrome,name=chrome,type=boolean) true to use system chrome
 	 */
 	this-&gt;SetMethod(&quot;setUsingChrome&quot;, &amp;UserWindow::_SetUsingChrome);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=UI.UserWindow.isFullscreen) returns true if the window is full screen
+	 * @tiapi(method=True,name=UI.UserWindow.isFullscreen,since=0.2) returns true if the window is full screen
+	 * @tiarg(for=UI.UserWindow.isFullscreen,name=chrome,type=boolean) true if system chrome
 	 */
 	this-&gt;SetMethod(&quot;isFullScreen&quot;, &amp;UserWindow::_IsFullScreen);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setFullScreen) make the window fullscreen
+	 * @tiapi(method=True,name=UI.UserWindow.setFullScreen,since=0.2) make the window fullscreen
+	 * @tiarg(for=UI.UserWindow.setFullScreen,name=fullscreen,type=boolean) true for fullscreen
 	 */
 	this-&gt;SetMethod(&quot;setFullScreen&quot;, &amp;UserWindow::_SetFullScreen);
 	/**
-	 * @tiapi(method=True,returns=integer,name=UI.UserWindow.getID) return the window id
+	 * @tiapi(method=True,returns=integer,name=UI.UserWindow.getID,since=0.2) return the window id
+	 * @tiresult(for=UI.UserWindow.getID,type=string) return id
 	 */
 	this-&gt;SetMethod(&quot;getID&quot;, &amp;UserWindow::_GetId);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.open) open the window
+	 * @tiapi(method=True,name=UI.UserWindow.open,since=0.2) open the window
 	 */
 	this-&gt;SetMethod(&quot;open&quot;, &amp;UserWindow::_Open);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.close) close the window
+	 * @tiapi(method=True,name=UI.UserWindow.close,since=0.2) close the window
 	 */
 	this-&gt;SetMethod(&quot;close&quot;, &amp;UserWindow::_Close);
 	/**
-	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getX) return the windows X position
+	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getX,since=0.2) return the windows X position
+	 * @tiresult(for=UI.UserWindow.getX,type=double) return the x value
 	 */
 	this-&gt;SetMethod(&quot;getX&quot;, &amp;UserWindow::_GetX);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setX) sets the windows X position
+	 * @tiapi(method=True,name=UI.UserWindow.setX,since=0.2) sets the windows X position
+	 * @tiarg(for=UI.UserWindow.setX,type=double,name=x) x position
 	 */
 	this-&gt;SetMethod(&quot;setX&quot;, &amp;UserWindow::_SetX);
 	/**
-	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getY) returns the windows Y position
+	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getY,since=0.2) returns the windows Y position
+	 * @tiresult(for=UI.UserWindow.getY,type=double) return the y value
 	 */
 	this-&gt;SetMethod(&quot;getY&quot;, &amp;UserWindow::_GetY);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setY) sets the windows Y position
+	 * @tiapi(method=True,name=UI.UserWindow.setY,since=0.2) sets the windows Y position
+	 * @tiarg(for=UI.UserWindow.setY,type=double,name=y) y position
 	 */
 	this-&gt;SetMethod(&quot;setY&quot;, &amp;UserWindow::_SetY);
 	/**
-	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getWidth) returns the windows width
+	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getWidth,since=0.2) returns the windows width
+	 * @tiresult(for=UI.UserWindow.getWidth,type=double) return the width value
 	 */
 	this-&gt;SetMethod(&quot;getWidth&quot;, &amp;UserWindow::_GetWidth);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setWidth) sets the windows width
+	 * @tiapi(method=True,name=UI.UserWindow.setWidth,since=0.2) sets the windows width
+	 * @tiarg(for=UI.UserWindow.setWidth,type=double,name=width) width 
 	 */
 	this-&gt;SetMethod(&quot;setWidth&quot;, &amp;UserWindow::_SetWidth);
 	/**
-	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getMaxWidth) gets the windows max width
+	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getMaxWidth,since=0.2) gets the windows max width
+	 * @tiresult(for=UI.UserWindow.getMaxWidth,type=double) return the max width value
 	 */
 	this-&gt;SetMethod(&quot;getMaxWidth&quot;, &amp;UserWindow::_GetMaxWidth);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setMaxWidth) sets the windows max width
+	 * @tiapi(method=True,name=UI.UserWindow.setMaxWidth,since=0.2) sets the windows max width
+	 * @tiarg(for=UI.UserWindow.setMaxWidth,type=double,name=width) max width
 	 */
 	this-&gt;SetMethod(&quot;setMaxWidth&quot;, &amp;UserWindow::_SetMaxWidth);
 	/**
-	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getMinWidth) gets the windows min width
+	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getMinWidth,since=0.2) gets the windows min width
+	 * @tiresult(for=UI.UserWindow.getMinWidth,type=double) return the min width value
 	 */
 	this-&gt;SetMethod(&quot;getMinWidth&quot;, &amp;UserWindow::_GetMinWidth);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setMinWidth) sets the windows min width
+	 * @tiapi(method=True,name=UI.UserWindow.setMinWidth,since=0.2) sets the windows min width
+	 * @tiarg(for=UI.UserWindow.setMinWidth,type=double,name=width) min width
 	 */
 	this-&gt;SetMethod(&quot;setMinWidth&quot;, &amp;UserWindow::_SetMinWidth);
 	/**
-	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getHeight) get the windows height
+	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getHeight,since=0.2) get the windows height
+	 * @tiresult(for=UI.UserWindow.getHeight,type=double) return the height value
 	 */
 	this-&gt;SetMethod(&quot;getHeight&quot;, &amp;UserWindow::_GetHeight);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setHeight) set the windows height
+	 * @tiapi(method=True,name=UI.UserWindow.setHeight,since=0.2) set the windows height
+	 * @tiarg(for=UI.UserWindow.setHeight,type=double,name=height) height
 	 */
 	this-&gt;SetMethod(&quot;setHeight&quot;, &amp;UserWindow::_SetHeight);
 	/**
-	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getMaxHeight) get the windows max height
+	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getMaxHeight,since=0.2) get the windows max height
+	 * @tiresult(for=UI.UserWindow.getMaxHeight,type=double) return the max height value
 	 */
 	this-&gt;SetMethod(&quot;getMaxHeight&quot;, &amp;UserWindow::_GetMaxHeight);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setMaxHeight) set the windows max height
+	 * @tiapi(method=True,name=UI.UserWindow.setMaxHeight,since=0.2) set the windows max height
+	 * @tiarg(for=UI.UserWindow.setMaxHeight,type=double,name=height) max height
 	 */
 	this-&gt;SetMethod(&quot;setMaxHeight&quot;, &amp;UserWindow::_SetMaxHeight);
 	/**
-	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getMinHeight) get the windows min height
+	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getMinHeight,since=0.2) get the windows min height
+	 * @tiresult(for=UI.UserWindow.getMinHeight,type=double) return the min height value
 	 */
 	this-&gt;SetMethod(&quot;getMinHeight&quot;, &amp;UserWindow::_GetMinHeight);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setMinHeight) sets the windows min height
+	 * @tiapi(method=True,name=UI.UserWindow.setMinHeight,since=0.2) sets the windows min height
+	 * @tiarg(for=UI.UserWindow.setMinHeight,type=double,name=height) min height
 	 */
 	this-&gt;SetMethod(&quot;setMinHeight&quot;, &amp;UserWindow::_SetMinHeight);
 	/**
-	 * @tiapi(method=True,returns=object,name=UI.UserWindow.getBounds) get the window bounds
+	 * @tiapi(method=True,name=UI.UserWindow.getBounds,since=0.2) get the window bounds
+	 * @tiresult(for=UI.UserWindow.getBounds,type=object) returns bound object
 	 */
 	this-&gt;SetMethod(&quot;getBounds&quot;, &amp;UserWindow::_GetBounds);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setBounds) set the window bounds
+	 * @tiapi(method=True,name=UI.UserWindow.setBounds,since=0.2) set the window bounds
+	 * @tiarg(for=UI.UserWindow.setBounds,type=object,name=bounds) bounds object
 	 */
 	this-&gt;SetMethod(&quot;setBounds&quot;, &amp;UserWindow::_SetBounds);
 	/**
-	 * @tiapi(method=True,returns=string,name=UI.UserWindow.getTitle) get the title of the window
+	 * @tiapi(method=True,returns=string,name=UI.UserWindow.getTitle,since=0.2) get the title of the window
+	 * @tiresult(for=UI.UserWindow.isUsingChrome,type=boolean) true if using system chrome
 	 */
 	this-&gt;SetMethod(&quot;getTitle&quot;, &amp;UserWindow::_GetTitle);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setTitle) set the title of the window
+	 * @tiapi(method=True,name=UI.UserWindow.setTitle,since=0.2) set the title of the window
+	 * @tiarg(for=UI.UserWindow.setTitle,type=object,name=title) title
 	 */
 	this-&gt;SetMethod(&quot;setTitle&quot;, &amp;UserWindow::_SetTitle);
 	/**
-	 * @tiapi(method=True,returns=string,name=UI.UserWindow.getURL) get the url for the window
+	 * @tiapi(method=True,returns=string,name=UI.UserWindow.getURL,since=0.2) get the url for the window
+	 * @tiresult(for=UI.UserWindow.isUsingChrome,type=boolean) true if using system chrome
 	 */
 	this-&gt;SetMethod(&quot;getURL&quot;, &amp;UserWindow::_GetURL);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setURL) set the url for the window
+	 * @tiapi(method=True,name=UI.UserWindow.setURL,since=0.2) set the url for the window
+	 * @tiarg(for=UI.UserWindow.setURL,type=string,name=url) url
 	 */
 	this-&gt;SetMethod(&quot;setURL&quot;, &amp;UserWindow::_SetURL);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=UI.UserWindow.isResizable) returns true if the window is resizable
+	 * @tiapi(method=True,name=UI.UserWindow.isResizable,since=0.2) returns true if the window is resizable
+	 * @tiresult(for=UI.UserWindow.isResizable,type=boolean) true if using resizable
 	 */
 	this-&gt;SetMethod(&quot;isResizable&quot;, &amp;UserWindow::_IsResizable);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setResizable) sets the resizability of the window
+	 * @tiapi(method=True,name=UI.UserWindow.setResizable,since=0.2) sets the resizability of the window
+	 * @tiarg(for=UI.UserWindow.setResizable,type=boolean,name=resizable) resizable
 	 */
 	this-&gt;SetMethod(&quot;setResizable&quot;, &amp;UserWindow::_SetResizable);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=UI.UserWindow.isMaximizable) returns true if the window is maximizable
+	 * @tiapi(method=True,name=UI.UserWindow.isMaximizable,since=0.2) returns true if the window is maximizable
+	 * @tiresult(for=UI.UserWindow.isUsingChrome,type=boolean) true if using system chrome
 	 */
 	this-&gt;SetMethod(&quot;isMaximizable&quot;, &amp;UserWindow::_IsMaximizable);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setMaximizable) sets the maximizability of the window
+	 * @tiapi(method=True,name=UI.UserWindow.setMaximizable,since=0.2) sets the maximizability of the window
+	 * @tiarg(for=UI.UserWindow.setMaximizable,type=boolean,name=maximizable) maximizable
 	 */
 	this-&gt;SetMethod(&quot;setMaximizable&quot;, &amp;UserWindow::_SetMaximizable);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=UI.UserWindow.isMinimizable) returns true if the window is minimizable
+	 * @tiapi(method=True,name=UI.UserWindow.isMinimizable,since=0.2) returns true if the window is minimizable
+	 * @tiresult(for=UI.UserWindow.isMinimizable,type=boolean) true if minimizable
 	 */
 	this-&gt;SetMethod(&quot;isMinimizable&quot;, &amp;UserWindow::_IsMinimizable);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setMinimizable) sets the minimizability of the window
+	 * @tiapi(method=True,name=UI.UserWindow.setMinimizable,since=0.2) sets the minimizability of the window
+	 * @tiarg(for=UI.UserWindow.setMinimizable,type=boolean,name=minimizable) minimizable
 	 */
 	this-&gt;SetMethod(&quot;setMinimizable&quot;, &amp;UserWindow::_SetMinimizable);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=UI.UserWindow.isCloseable) returns true if the window is closeable
+	 * @tiapi(method=True,name=UI.UserWindow.isCloseable,since=0.2) returns true if the window is closeable
+	 * @tiresult(for=UI.UserWindow.isCloseable,type=boolean) true if closeable
 	 */
 	this-&gt;SetMethod(&quot;isCloseable&quot;, &amp;UserWindow::_IsCloseable);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setCloseable) sets the closeability of the window
+	 * @tiapi(method=True,name=UI.UserWindow.setCloseable,since=0.2) sets the closeability of the window
+	 * @tiarg(for=UI.UserWindow.setCloseable,type=boolean,name=closeable) closeable
 	 */
 	this-&gt;SetMethod(&quot;setCloseable&quot;, &amp;UserWindow::_SetCloseable);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=UI.UserWindow.isVisible) returns true if the window is visible
+	 * @tiapi(method=True,name=UI.UserWindow.isVisible,since=0.2) returns true if the window is visible
+	 * @tiresult(for=UI.UserWindow.isVisible,type=boolean) true if visible
 	 */
 	this-&gt;SetMethod(&quot;isVisible&quot;, &amp;UserWindow::_IsVisible);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setVisible) sets the visibility of the window
+	 * @tiapi(method=True,name=UI.UserWindow.setVisible,since=0.2) sets the visibility of the window
+	 * @tiarg(for=UI.UserWindow.setVisible,type=boolean,name=visible) visible
 	 */
 	this-&gt;SetMethod(&quot;setVisible&quot;, &amp;UserWindow::_SetVisible);
 	/**
-	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getTransparency) returns the window transparency
+	 * @tiapi(method=True,returns=double,name=UI.UserWindow.getTransparency,since=0.2) returns the window transparency
+	 * @tiresult(for=UI.UserWindow.getTransparency,type=double) return transparency value
 	 */
 	this-&gt;SetMethod(&quot;getTransparency&quot;, &amp;UserWindow::_GetTransparency);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setTransparency) gets the windows transparency
+	 * @tiapi(method=True,name=UI.UserWindow.setTransparency,since=0.2) gets the windows transparency
+	 * @tiarg(for=UI.UserWindow.setTransparency,type=double,name=url) transparency value
 	 */
 	this-&gt;SetMethod(&quot;setTransparency&quot;, &amp;UserWindow::_SetTransparency);
 	/**
-	 * @tiapi(method=True,returns=string,name=UI.UserWindow.getTransparencyColor) returns the transparency color for the window
+	 * @tiapi(method=True,returns=string,name=UI.UserWindow.getTransparencyColor,since=0.2) returns the transparency color for the window
+	 * @tiresult(for=UI.UserWindow.getTransparencyColor,type=string) color
 	 */
 	this-&gt;SetMethod(&quot;getTransparencyColor&quot;, &amp;UserWindow::_GetTransparencyColor);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setMenu) set the window menu
+	 * @tiapi(method=True,name=UI.UserWindow.setMenu,since=0.2) set the window menu
+	 * @tiarg(for=UI.UserWindow.setMenu,type=object,name=menu) menu
 	 */
 	this-&gt;SetMethod(&quot;setMenu&quot;, &amp;UserWindow::_SetMenu);
 	/**
-	 * @tiapi(method=True,returns=object,name=UI.UserWindow.getMenu) gets the window menu
+	 * @tiapi(method=True,name=UI.UserWindow.getMenu,since=0.2) gets the window menu
+	 * @tiresult(for=UI.UserWindow.getMenu,type=object) return the menu
 	 */
 	this-&gt;SetMethod(&quot;getMenu&quot;, &amp;UserWindow::_GetMenu);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setContextMenu) set the window context menu
+	 * @tiapi(method=True,name=UI.UserWindow.setContextMenu,since=0.2) set the window context menu
+	 * @tiarg(for=UI.UserWindow.setContextMenu,type=object,name=menu) menu
 	 */
 	this-&gt;SetMethod(&quot;setContextMenu&quot;, &amp;UserWindow::_SetContextMenu);
 	/**
-	 * @tiapi(method=True,returns=object,name=UI.UserWindow.getContextMenu) get the window context menu
+	 * @tiapi(method=True,name=UI.UserWindow.getContextMenu,since=0.2) get the window context menu
+	 * @tiresult(for=UI.UserWindow.getContextMenu,type=object) returns context menu
 	 */
 	this-&gt;SetMethod(&quot;getContextMenu&quot;, &amp;UserWindow::_GetContextMenu);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setIcon) set the window icon
+	 * @tiapi(method=True,name=UI.UserWindow.setIcon,since=0.2) set the window icon
+	 * @tiarg(for=UI.UserWindow.setIcon,type=string,name=icon) icon
 	 */
 	this-&gt;SetMethod(&quot;setIcon&quot;, &amp;UserWindow::_SetIcon);
 	/**
-	 * @tiapi(method=True,returns=string,name=UI.UserWindow.getIcon) get the window icon
+	 * @tiapi(method=True,name=UI.UserWindow.getIcon,since=0.2) get the window icon
+	 * @tiresult(for=UI.UserWindow.getIcon,type=string) icon
 	 */
 	this-&gt;SetMethod(&quot;getIcon&quot;, &amp;UserWindow::_GetIcon);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.setTopMost) sets whether the window is top most (above other windows)
+	 * @tiapi(method=True,name=UI.UserWindow.setTopMost,since=0.3) sets whether the window is top most (above other windows)
+	 * @tiarg(for=UI.UserWindow.setTopMost,type=boolean,name=topmost) true if top most
 	 */
 	this-&gt;SetMethod(&quot;setTopMost&quot;, &amp;UserWindow::_SetTopMost);
 	/**
-	 * @tiapi(method=True,returns=boolean,name=UI.UserWindow.isTopMost) returns true if the window is top most
+	 * @tiapi(method=True,name=UI.UserWindow.isTopMost,since=0.3) returns true if the window is top most
+	 * @tiresult(for=UI.UserWindow.isTopMost,type=boolean) true if top most
 	 */
 	this-&gt;SetMethod(&quot;isTopMost&quot;, &amp;UserWindow::_IsTopMost);
 	/**
-	 * @tiapi(method=True,returns=object,name=UI.UserWindow.createWindow) create a new window as a child of this window
+	 * @tiapi(method=True,name=UI.UserWindow.createWindow,since=0.2) create a new window as a child of this window
+	 * @tiarg(for=UI.UserWindow.createWindow,name=options,type=object,optional=True) pass in either an object of properties or a url to the window content
+	 * @tiresult(for=UI.UserWindow.createWindow,type=object) return window
 	 */
 	this-&gt;SetMethod(&quot;createWindow&quot;, &amp;UserWindow::_CreateWindow);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.openFiles) show the open files dialog
+	 * @tiapi(method=True,name=UI.UserWindow.openFiles,since=0.2) show the open files dialog
+	 * @tiarg(for=UI.UserWindow.openFiles,type=method,name=callback) callback method
+	 * @tiarg(for=UI.UserWindow.openFiles,type=object,name=options,optional=True) options
 	 */
 	this-&gt;SetMethod(&quot;openFiles&quot;, &amp;UserWindow::_OpenFiles);
 	/**
-	 * @tiapi(method=True,returns=object,name=UI.UserWindow.getParent) get the window parent
+	 * @tiapi(method=True,name=UI.UserWindow.getParent,since=0.3) get the window parent
+	 * @tiresult(for=UI.UserWindow.getParent,type=object) return the parent window or NULL if no parent
 	 */
 	this-&gt;SetMethod(&quot;getParent&quot;, &amp;UserWindow::_GetParent);
 	/**
-	 * @tiapi(method=True,returns=integer,name=UI.UserWindow.addEventListener) add an event listener to the window and returns integer to use when removing
+	 * @tiapi(method=True,returns=integer,name=UI.UserWindow.addEventListener,since=0.3) add an event listener to the window and returns integer to use when removing
+	 * @tiarg(for=UI.UserWindow.addEventListener,type=method,name=listener) listener method
+	 * @tiresult(for=UI.UserWindow.addEventListener,type=integer) return the listener id
 	 */
 	this-&gt;SetMethod(&quot;addEventListener&quot;, &amp;UserWindow::_AddEventListener);
 	/**
-	 * @tiapi(method=True,returns=void,name=UI.UserWindow.removeEventListener) removes an event listener from the window
+	 * @tiapi(method=True,name=UI.UserWindow.removeEventListener,since=0.3) removes an event listener from the window
+	 * @tiarg(for=UI.UserWindow.removeEventListener,type=integer,name=id) the id returned from addEventListener
+	 * @tiresult(for=UI.UserWindow.removeEventListener,type=boolean) return true if removed
 	 */
 	this-&gt;SetMethod(&quot;removeEventListener&quot;, &amp;UserWindow::_RemoveEventListener);
 </diff>
      <filename>modules/ti.UI/user_window.cpp</filename>
    </modified>
    <modified>
      <diff>@@ -4,95 +4,178 @@
 # Initial Author: Jeff Haynie, 3/30/09
 #
 import glob, re, os.path as path
-import fnmatch, os
+import fnmatch, os, sys
 import simplejson as json
 
 class GlobDirectoryWalker:
-    # a forward iterator that traverses a directory tree
-
-    def __init__(self, directory, pattern=&quot;*&quot;):
-        self.stack = [directory]
-        self.pattern = pattern
-        self.files = []
-        self.index = 0
-
-    def __getitem__(self, index):
-        while 1:
-            try:
-                file = self.files[self.index]
-                self.index = self.index + 1
-            except IndexError:
-                # pop next directory from stack
-                self.directory = self.stack.pop()
-                self.files = os.listdir(self.directory)
-                self.index = 0
-            else:
-                # got a filename
-                fullname = os.path.join(self.directory, file)
-                if os.path.isdir(fullname) and not os.path.islink(fullname):
-                    self.stack.append(fullname)
-                if fnmatch.fnmatch(file, self.pattern):
-                    return fullname
+	# a forward iterator that traverses a directory tree
 
+	def __init__(self, directory, pattern=&quot;*&quot;):
+		self.stack = [directory]
+		self.pattern = pattern
+		self.files = []
+		self.index = 0
+
+	def __getitem__(self, index):
+		while 1:
+			try:
+				file = self.files[self.index]
+				self.index = self.index + 1
+			except IndexError:
+				# pop next directory from stack
+				self.directory = self.stack.pop()
+				self.files = os.listdir(self.directory)
+				self.index = 0
+			else:
+				# got a filename
+				fullname = os.path.join(self.directory, file)
+				if os.path.isdir(fullname) and not os.path.islink(fullname):
+					self.stack.append(fullname)
+				if fnmatch.fnmatch(file, self.pattern):
+					return fullname
+
+def convert_type(value):
+	# trivial type conversions
+	if type(value)!=str:
+		return value
+	if value == 'True' or value == 'true':
+		return True
+	elif value == 'False' or value == 'false':
+		return False
+	elif re.match('^[0-9]+$',value):
+		return int(value)
+	elif re.match('^[0-9\.]+$',value):
+		return float(value)
+	return value
+
+def parse_pattern(m,ignoreDescription=False):
+	description = None
+	if not ignoreDescription:
+		description = m.group(2).strip()
+	metadata = {}
+	for value in m.group(1).strip().split(','):
+		key,value = value.split('=')
+		metadata[key]=value
+	return description,metadata
+
+def get_property(h,name,default,convert=True):
+	try:
+		if convert:
+			return convert_type(h[name])
+		else:
+			return h[name]
+	except:
+		return default
+		
+class API(dict):
+	def __init__(self, params, name, description):
+		self['description'] = description
+		self.name = name
+		if get_property(params,'method',False):
+			self['method'] = True
+			self['returns'] = None
+			self['arguments'] = []
+		if get_property(params,'property',False):
+			self['property'] = True
+		self['since'] = get_property(params,'since','0.30',False)
 	
-def generate_api_coverage(dir,fs):
-	pattern = '@tiapi\(([^\)]*)\)\s+(.*)'
+	def __str__(self):
+		return 'API&lt;%s&gt;' % self.name
+		
+	def add_argument(self,arg):
+		try:
+			self['arguments'].append(arg)
+		except:
+			print &quot;Invalid type: %s&quot; % self
+		
+	def set_return_type(self,return_type):
+		self['returns'] = return_type
+
+class APIArgument(dict):
+	def __init__(self, params, description):
+		self['description'] = description
+		self['name'] = params['name']
+		self.forname = params['for']
+		self['type'] = get_property(params,'type','object')
+		self['optional'] = get_property(params,'optional',False)
+
+	def __str__(self):
+		return 'APIArgument&lt;%s&gt;' % self['name']
+
+class APIReturnType(dict):
+	def __init__(self, params, description):
+		self.forname = params['for']
+		self['description'] = description
+		self['type'] = get_property(params,'type','void')
+
+	def __str__(self):
+		return 'APIReturnType&lt;%s&gt;' % self['name']
+
+def get_api_names(name):
+	tok = name.split('.')
+	module = tok[0]
+	tok.pop(0)
+	return module,'.'.join(tok)
+
+def generate_api_coverage(dirs,fs):
+	api_pattern = '@tiapi\(([^\)]*)\)\s+(.*)'
+	arg_pattern = '@tiarg\(([^\)]*)\)\s+(.*)'
+	res_pattern = '@tiresult\(([^\)]*)\)\s+(.*)'
 	
-	extensions = ['cc','c','cpp','m','mm','js']
+	extensions = ['cc','c','cpp','m','mm','js','py','rb']
 
 	files = []
-	modules = {}
+	apis = {}
+	api_count = 0
+	file_count = 0
+	module_count = 0
 
 	for ext in extensions:
-		for i in GlobDirectoryWalker(dir,'*.'+ext):
-			files.append(i)
+		for dirname in dirs:
+			for i in GlobDirectoryWalker(dirname,'*.'+ext):
+				try:
+					files.index(i)
+				except:
+					files.append(i)
 
 	for f in files:
 		fh = open(str(f),'r')
 		content = fh.read()
-		for m in re.finditer(pattern,content):
-			description = m.group(2).strip()
-			metadata = {}
-			for value in m.group(1).strip().split(','):
-				key,value = value.split('=')
-				# trivial type conversions
-				if value == 'True' or value == 'true':
-					value = True
-				elif value == 'False' or value == 'false':
-					value = False
-				elif re.match('^[0-9]+$',value):
-					value = int(value)
-				elif re.match('^[0-9\.]+$',value):
-					value = float(value)
-				metadata[key]=value
-			
-			rargs = {}
-			if metadata.has_key('args'):
-				args = metadata['args'].replace('[', '').replace(']', '')
-				for value in args.split(','):
-					key,value = value.split(':')
-					rargs[key] = value
-					
-				metadata['args'] = rargs
-				
-			api = metadata['name']
-			del metadata['name']
-			tok = api.split('.')
-			module = tok[0]
-			entry = {}
-			if modules.has_key(module):
-				entry = modules[module]
-			else:
-				modules[module] = entry
-			tok.pop(0)
-			name = '.'.join(tok)
-			if not entry.has_key(name):
-				entry[name]={'metadata':metadata,'description':description}
+		found = False
+		match = None
+		try:
+			for m in re.finditer(api_pattern,content):
+				match = m
+				description,metadata = parse_pattern(m)
+				module_name,fn_name = get_api_names(metadata['name'])
+				if not apis.has_key(module_name):
+					apis[module_name] = {}
+					module_count+=1
+				if not apis[module_name].has_key(fn_name):
+					api = API(metadata,fn_name,description)
+					apis[module_name][fn_name]=api
+					api_count+=1
+					found = True
+			for m in re.finditer(arg_pattern,content):
+				match = m
+				description,metadata = parse_pattern(m)
+				module_name,fn_name = get_api_names(metadata['for'])
+				api = apis[module_name][fn_name]
+				api.add_argument(APIArgument(metadata,description))
+			for m in re.finditer(res_pattern,content):
+				match = m
+				description,metadata = parse_pattern(m)
+				module_name,fn_name = get_api_names(metadata['for'])
+				api = apis[module_name][fn_name]
+				api.set_return_type(APIReturnType(metadata,description))
+			if found:
+				file_count+=1
+		except:
+			print &quot;Exception parsing API metadata in file: %s&quot; % str(f)
+			if match:
+				print &quot;Error was for: %s&quot; % str(match.group(0))
+			sys.exit(1)
 
-	fs.write(json.dumps(modules, sort_keys=True, indent=4))
+	fs.write(json.dumps(apis, sort_keys=True, indent=4))
 
-#
-#EXAMPLE:
-#
-#import sys
-#generate_api_coverage('.',sys.stdout)
\ No newline at end of file
+	print &quot;Found %i APIs for %i modules in %i files&quot; % (api_count,module_count,file_count)
\ No newline at end of file</diff>
      <filename>site_scons/apicoverage.py</filename>
    </modified>
  </modified>
  <removed type="array">
    <removed>
      <filename>COPYING</filename>
    </removed>
  </removed>
  <parents type="array">
    <parent>
      <id>dec14d8ab6409029fc42298545ec3d141dbb04fd</id>
    </parent>
  </parents>
  <author>
    <name>Jeff Haynie</name>
    <email>jhaynie@jeff-haynies-macbook.local</email>
  </author>
  <url>http://github.com/marshall/titanium/commit/302e9d075c48b9fb75bba4e23348eb65dd27ae66</url>
  <id>302e9d075c48b9fb75bba4e23348eb65dd27ae66</id>
  <committed-date>2009-04-01T00:47:09-07:00</committed-date>
  <authored-date>2009-04-01T00:47:09-07:00</authored-date>
  <message>refactor api generation to use a better format, updated API documentation</message>
  <tree>fffeb1822ea701a77ee7b7c5afd18e2bfdf9310f</tree>
  <committer>
    <name>Jeff Haynie</name>
    <email>jhaynie@jeff-haynies-macbook.local</email>
  </committer>
</commit>
