Commits

lfoust committed 919b2d7

Finished porting all implemented methods to async

Comments (0)

Files changed (13)

trunk/data/V2.0 Upgrade Checklist.xlsx

Binary file modified.

trunk/source/Stacky.Net35/Stacky.Net35.csproj

     <Compile Include="..\Stacky\Entities\NetworkUser.cs">
       <Link>NetworkUser.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\Entities\Post.cs">
+      <Link>Entities\Post.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\Entities\PostEvent.cs">
       <Link>Entities\PostEvent.cs</Link>
     </Compile>
     <Compile Include="..\Stacky\Entities\Tag.cs">
       <Link>Entities\Tag.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\Entities\TagScore.cs">
+      <Link>Entities\TagScore.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\Entities\TagSynonym.cs">
       <Link>Entities\TagSynonym.cs</Link>
     </Compile>
     <Compile Include="..\Stacky\Sites.cs">
       <Link>Sites.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\StackyClientAsync\NetworkMethods.cs">
+      <Link>StackyClientAsync\NetworkMethods.cs</Link>
+    </Compile>
+    <Compile Include="..\Stacky\StackyClientAsync\PostMethods.cs">
+      <Link>StackyClientAsync\PostMethods.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\StackyClientAsync\PrivilegeMethods.cs">
       <Link>StackyClientAsync\PrivilegeMethods.cs</Link>
     </Compile>

trunk/source/Stacky.Silverlight/Stacky.Silverlight.csproj

     <Compile Include="..\Stacky\Entities\NetworkUser.cs">
       <Link>NetworkUser.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\Entities\Post.cs">
+      <Link>Entities\Post.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\Entities\PostEvent.cs">
       <Link>Entities\PostEvent.cs</Link>
     </Compile>
     <Compile Include="..\Stacky\Entities\Tag.cs">
       <Link>Entities\Tag.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\Entities\TagScore.cs">
+      <Link>Entities\TagScore.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\Entities\TagSynonym.cs">
       <Link>Entities\TagSynonym.cs</Link>
     </Compile>
     <Compile Include="..\Stacky\StackyClientAsync\CommentMethods.cs">
       <Link>StackyClient\CommentMethods.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\StackyClientAsync\NetworkMethods.cs">
+      <Link>StackyClient\NetworkMethods.cs</Link>
+    </Compile>
+    <Compile Include="..\Stacky\StackyClientAsync\PostMethods.cs">
+      <Link>StackyClient\PostMethods.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\StackyClientAsync\PrivilegeMethods.cs">
       <Link>StackyClient\PrivilegeMethods.cs</Link>
     </Compile>

trunk/source/Stacky.WindowsPhone/Stacky.WindowsPhone.csproj

     <Compile Include="..\Stacky\Entities\NetworkUser.cs">
       <Link>NetworkUser.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\Entities\Post.cs">
+      <Link>Entities\Post.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\Entities\PostEvent.cs">
       <Link>Entities\PostEvent.cs</Link>
     </Compile>
     <Compile Include="..\Stacky\Entities\Tag.cs">
       <Link>Entities\Tag.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\Entities\TagScore.cs">
+      <Link>Entities\TagScore.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\Entities\TagSynonym.cs">
       <Link>Entities\TagSynonym.cs</Link>
     </Compile>
     <Compile Include="..\Stacky\StackyClientAsync\CommentMethods.cs">
       <Link>StackyClient\CommentMethods.cs</Link>
     </Compile>
+    <Compile Include="..\Stacky\StackyClientAsync\NetworkMethods.cs">
+      <Link>StackyClient\NetworkMethods.cs</Link>
+    </Compile>
+    <Compile Include="..\Stacky\StackyClientAsync\PostMethods.cs">
+      <Link>StackyClient\PostMethods.cs</Link>
+    </Compile>
     <Compile Include="..\Stacky\StackyClientAsync\PrivilegeMethods.cs">
       <Link>StackyClient\PrivilegeMethods.cs</Link>
     </Compile>

trunk/source/Stacky/Stacky.csproj

     <Compile Include="StackyClientAsync\BadgeMethods.cs" />
     <Compile Include="StackyClientAsync\CommentMethods.cs" />
     <Compile Include="StackyClientAsync\NetworkMethods.cs" />
+    <Compile Include="StackyClientAsync\PostMethods.cs" />
     <Compile Include="StackyClientAsync\PrivilegeMethods.cs" />
     <Compile Include="StackyClientAsync\QuestionMethods.cs" />
     <Compile Include="StackyClientAsync\RevisionMethods.cs" />
     <Compile Include="StackyClientAsync\StackyClientAsync.cs" />
     <Compile Include="StackyClientAsync\StatsMethods.cs" />
+    <Compile Include="StackyClientAsync\SuggestedEditMethods.cs" />
     <Compile Include="StackyClientAsync\TagMethods.cs" />
     <Compile Include="StackyClientAsync\UserMethods.cs" />
     <Compile Include="StackyClientBase.cs" />

trunk/source/Stacky/StackyClientAsync/PostMethods.cs

+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Stacky
+{
+#if SILVERLIGHT
+    public partial class StackyClient
+#else
+    public partial class StackyClientAsync
+#endif
+    {
+        public void GetPosts(Action<IPagedList<Post>> onSuccess, Action<ApiException> onError = null,
+            PostSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Post>("posts", null,
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        public void GetPosts(IEnumerable<int> ids, Action<IPagedList<Post>> onSuccess, Action<ApiException> onError = null,
+            PostSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Post>("posts", new string[] { ids.Vectorize() },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        public void GetPosts(int id, Action<Post> onSuccess, Action<ApiException> onError = null, 
+            PostSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetPosts(id.ToArray(), items => onSuccess(items.FirstOrDefault()), onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        public void GetPostComments(IEnumerable<int> ids, Action<IPagedList<Comment>> onSuccess, Action<ApiException> onError = null,
+            CommentSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Comment>("posts", new string[] { ids.Vectorize(), "comments" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        public void GetPostRevisions(int id, Action<IPagedList<Revision>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            GetPostRevisions(id.ToArray(), onSuccess, onError, page, pageSize, fromDate, toDate, filter);
+        }
+
+        public void GetPostRevisions(IEnumerable<int> ids, Action<IPagedList<Revision>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            Execute<Revision>("posts", new string[] { ids.Vectorize(), "revisions" },
+                onSuccess, onError,
+                null, null, page, pageSize, fromDate, toDate, null, null, filter);
+        }
+
+        public void GetPostSuggestedEdits(int id, Action<IPagedList<SuggestedEdit>> onSuccess, Action<ApiException> onError = null, 
+            SuggestedEditSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            GetPostSuggestedEdits(id.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, filter);
+        }
+
+        public void GetPostSuggestedEdits(IEnumerable<int> ids, Action<IPagedList<SuggestedEdit>> onSuccess, Action<ApiException> onError = null,
+            SuggestedEditSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            Execute<SuggestedEdit>("posts", new string[] { ids.Vectorize(), "suggested-edits" },
+                onSuccess, onError,
+                null, null, page, pageSize, fromDate, toDate, null, null, filter);
+        }
+    }
+}

trunk/source/Stacky/StackyClientAsync/QuestionMethods.cs

     public partial class StackyClientAsync
 #endif
     {
-        public virtual void GetQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, bool includeBody = false, bool includeComments = false, bool includeAnswers = false, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string[] tags = null)
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/questions
+        /// </summary>
+        public void GetQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            var sortArgs = sortBy.GetAttribute<SortArgsAttribute>();
-            GetQuestions(onSuccess, onError, "questions", sortArgs.UrlArgs, sortArgs.Sort, GetSortDirection(sortDirection), page, pageSize, includeBody, includeAnswers, includeComments, fromDate, toDate, min, max, tags);
+            Execute<Question>("questions", null,
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
-        public virtual void GetQuestionsByUser(int userId, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, QuestionsByUserSort sortBy = QuestionsByUserSort.Activity, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, bool includeBody = false, bool includeComments = false, bool includeAnswers = false, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string[] tags = null)
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/questions-by-ids
+        /// </summary>
+        public void GetQuestion(int id, Action<Question> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            GetQuestions(onSuccess, onError, "users", new string[] { userId.ToString(), "questions" }, sortBy.ToString().ToLower(), GetSortDirection(sortDirection), page, pageSize, includeBody, includeComments, includeAnswers, fromDate, toDate, min, max, tags);
+            GetQuestions(id.ToArray(), items => onSuccess(items.FirstOrDefault()), onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
-        public virtual void GetFavoriteQuestions(int userId, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, FavoriteQuestionsSort sortBy = FavoriteQuestionsSort.Activity, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, bool includeBody = false, bool includeAnswers = false, bool includeComments = false, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string[] tags = null)
+        /// <summary>
+        /// https://api.stackexchange.com/docs/questions-by-ids
+        /// </summary>
+        public void GetQuestions(IEnumerable<int> ids, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            GetQuestions(onSuccess, onError, "users", new string[] { userId.ToString(), "favorites" }, sortBy.ToString().ToLower(), GetSortDirection(sortDirection), page, pageSize, includeBody, includeComments, includeAnswers, fromDate, toDate, min, max, tags);
+            Execute<Question>("questions", new string[] { ids.Vectorize() },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
-        private void GetQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, string method, string[] urlArgs, string sort, string order, int? page, int? pageSize, bool includeBody, bool includeComments, bool includeAnswers, DateTime? fromDate, DateTime? toDate, int? min, int? max, params string[] tags)
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/answers-on-questions
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetQuestionAnswers(int id, Action<IPagedList<Answer>> onSuccess, Action<ApiException> onError = null,
+            AnswerSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            MakeRequest<Question>(method, urlArgs, new
+            GetQuestionAnswers(id.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/answers-on-questions
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetQuestionAnswers(IEnumerable<int> ids, Action<IPagedList<Answer>> onSuccess, Action<ApiException> onError = null,
+            AnswerSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Answer>("questions", new string[] { ids.Vectorize(), "answers" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/comments-on-questions
+        /// </summary>
+        public void GetQuestionComments(int id, Action<IPagedList<Comment>> onSuccess, Action<ApiException> onError = null,
+            CommentSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetQuestionComments(id.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/comments-on-questions
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetQuestionComments(IEnumerable<int> ids, Action<IPagedList<Comment>> onSuccess, Action<ApiException> onError = null,
+            CommentSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Comment>("questions", new string[] { ids.Vectorize(), "comments" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/linked-questions
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetLinkedQuestions(int id, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null, 
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetLinkedQuestions(id.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/linked-questions
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetLinkedQuestions(IEnumerable<int> ids, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Question>("questions", new string[] { ids.Vectorize(), "linked" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/linked-questions
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetRelatedQuestions(int id, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetRelatedQuestions(id.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/linked-questions
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetRelatedQuestions(IEnumerable<int> ids, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Question>("questions", new string[] { ids.Vectorize(), "related" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/questions-timeline
+        /// </summary>
+        public void GetQuestionTimeline(int id, Action<IPagedList<QuestionTimeline>> onSuccess, Action<ApiException> onError = null, 
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            GetQuestionTimeline(id.ToArray(), onSuccess, onError, page, pageSize, fromDate, toDate, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/questions-timeline
+        /// </summary>
+        public void GetQuestionTimeline(IEnumerable<int> ids, Action<IPagedList<QuestionTimeline>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            Execute<QuestionTimeline>("questions", new string[] { ids.Vectorize(), "timeline" },
+                onSuccess, onError,
+                null, null, page, pageSize, fromDate, toDate, null, null, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/unanswered-questions
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetUnansweredQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null, QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string tagged = null, string filter = null)
+        {
+            MakeRequest<Question>("questions", new string[] { "unanswered" }, new
             {
                 site = this.SiteUrlName,
                 page = page ?? null,
                 pagesize = pageSize ?? null,
-                body = includeBody ? (bool?)true : null,
-                comments = includeComments ? (bool?)true : null,
-                answers = includeAnswers ? (bool?)true : null,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                tagged = tags == null ? (string)null : String.Join(" ", tags),
-                sort = sort,
-                order = order,
-                min = min,
-                max = max
-            }, (items) => onSuccess(new PagedList<Question>(items)), onError);
+                fromdate = GetDateValue(fromDate),
+                todate = GetDateValue(toDate),
+                sort = GetEnumValue(sortBy),
+                order = GetSortDirection(sortDirection),
+                min = GetDateValue(min),
+                max = GetDateValue(max),
+                tagged = tagged,
+                filter = filter
+            }, response => onSuccess(new PagedList<Question>(response)), onError);
         }
 
-        public virtual void GetQuestions(IEnumerable<int> questionIds, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, int? page = null, int? pageSize = null, bool includeBody = false, bool includeComments = false, bool includeAnswers = false)
+        // <summary>
+        /// See https://api.stackexchange.com/docs/unanswered-questions
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetQuestionsWithNoAnswers(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string tagged = null, string filter = null)
         {
-            MakeRequest<Question>("questions", new string[] { questionIds.Vectorize() }, new
+            MakeRequest<Question>("questions", new string[] { "no-answers" }, new
             {
                 site = this.SiteUrlName,
-                body = includeBody ? (bool?)true : null,
-                comments = includeComments ? (bool?)true : null,
-                answers = includeAnswers ? (bool?)true : null,
                 page = page ?? null,
-                pagesize = pageSize ?? null
-            }, (items) => onSuccess(new PagedList<Question>(items)), onError);
+                pagesize = pageSize ?? null,
+                fromdate = GetDateValue(fromDate),
+                todate = GetDateValue(toDate),
+                sort = GetEnumValue(sortBy),
+                order = GetSortDirection(sortDirection),
+                min = GetDateValue(min),
+                max = GetDateValue(max),
+                tagged = tagged,
+                filter = filter
+            }, response => onSuccess(new PagedList<Question>(response)), onError);
         }
 
-        public virtual void GetQuestion(int questionId, Action<Question> onSuccess, Action<ApiException> onError, int? page = null, int? pageSize = null, bool includeBody = false, bool includeComments = false, bool includeAnswers = false)
+        // <summary>
+        /// See https://api.stackexchange.com/docs/search
+        /// </summary>
+        /// TODO: Fix Sort
+        public void SearchQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string[] tagged = null, string[] notTagged = null, string inTitle = null, string filter = null)
         {
-            GetQuestions(questionId.ToArray(), returnedQuestions => onSuccess(returnedQuestions.FirstOrDefault()), onError, page, pageSize, includeBody, includeComments, includeAnswers);
-        }
-
-        public virtual void GetQuestionTimeline(IEnumerable<int> questionIds, Action<IPagedList<PostEvent>> onSuccess, Action<ApiException> onError, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            MakeRequest<PostEvent>("questions", new string[] { questionIds.Vectorize(), "timeline" }, new
+            if (((tagged != null && tagged.Length == 0) || tagged == null) &&
+                ((notTagged != null && notTagged.Length == 0) || notTagged == null))
             {
-                site = this.SiteUrlName,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                page = page ?? null,
-                pagesize = pageSize ?? null
-            }, (items) => onSuccess(new PagedList<PostEvent>(items)), onError);
-        }
-
-        public virtual void GetQuestionTimeline(int questionId, Action<IPagedList<PostEvent>> onSuccess, Action<ApiException> onError, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            GetQuestionTimeline(questionId.ToArray(), onSuccess, onError, page, pageSize, fromDate, toDate);
-        }
-
-        public virtual void Search(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, string inTitle = null, IEnumerable<string> tagged = null, IEnumerable<string> notTagged = null, SearchSort sortBy = SearchSort.Activity, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null)
-        {
-            string taggedString = null;
-            if (tagged != null)
-                taggedString = String.Join(" ", tagged.ToArray());
-
-            string notTaggedString = null;
-            if (notTagged != null)
-                notTaggedString = String.Join(" ", notTagged.ToArray());
+                throw new ArgumentException("At least one of tagged or intitle must be set on this method");
+            }
 
             MakeRequest<Question>("search", null, new
             {
                 site = this.SiteUrlName,
+                page = page ?? null,
+                pagesize = pageSize ?? null,
+                fromdate = GetDateValue(fromDate),
+                todate = GetDateValue(toDate),
+                sort = GetEnumValue(sortBy),
+                order = GetSortDirection(sortDirection),
+                min = GetDateValue(min),
+                max = GetDateValue(max),
+                tagged = tagged != null ? String.Join(";", tagged) : null,
+                nottagged = notTagged != null ? String.Join(";", notTagged) : null,
                 intitle = inTitle,
-                tagged = taggedString,
-                nottagged = notTaggedString,
-                sort = sortBy,
-                order = GetSortDirection(sortDirection),
-                page = page ?? null,
-                pagesize = pageSize ?? null
-            }, (items) => onSuccess(new PagedList<Question>(items)), onError);
+                filter = filter
+            }, response => onSuccess(new PagedList<Question>(response)), onError);
         }
 
-        public virtual void GetLinkedQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, int questionId, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, bool includeBody = false, bool includeComments = false, bool includeAnswers = false, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
+        // <summary>
+        /// See https://api.stackexchange.com/docs/similar
+        /// </summary>
+        /// TODO: Fix Sort
+        public void SimiliarQuestions(string title, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string[] tagged = null, string[] notTagged = null, string filter = null)
         {
-            GetLinkedQuestions(onSuccess, onError, questionId.ToArray(), sortBy, sortDirection, page, pageSize, includeBody, includeComments, includeAnswers, fromDate, toDate, min, max);
-        }
-
-        public virtual void GetLinkedQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, IEnumerable<int> questionIds, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, bool includeBody = false, bool includeComments = false, bool includeAnswers = false, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
-        { 
-            GetQuestions(onSuccess, onError, "questions", new string[] { questionIds.Vectorize(), "linked" }, sortBy.ToString(), GetSortDirection(sortDirection), page, pageSize, includeBody, includeComments, includeAnswers, fromDate, toDate, min, max, null);
-        }
-
-        public virtual void GetRelatedQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, int questionId, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, bool includeBody = false, bool includeComments = false, bool includeAnswers = false, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
-        {
-            GetRelatedQuestions(onSuccess, onError, questionId.ToArray(), sortBy, sortDirection, page, pageSize, includeBody, includeComments, includeAnswers, fromDate, toDate, min, max);
-        }
-
-        public virtual void GetRelatedQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, IEnumerable<int> questionIds, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, bool includeBody = false, bool includeComments = false, bool includeAnswers = false, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
-        {
-            GetQuestions(onSuccess, onError, "questions", new string[] { questionIds.Vectorize(), "related" }, sortBy.ToString(), GetSortDirection(sortDirection), page, pageSize, includeBody, includeComments, includeAnswers, fromDate, toDate, min, max, null);
-        }
-
-        public virtual void GetNoAnswerQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, bool includeBody = false, bool includeComments = false, bool includeAnswers = false, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
-        {
-            GetQuestions(onSuccess, onError, "questions", new string[] { "no-answers" }, sortBy.ToString(), GetSortDirection(sortDirection), page, pageSize, includeBody, includeComments, includeAnswers, fromDate, toDate, min, max, null);
-        }
-
-        public virtual void GetSimilarQuestions(Action<IEnumerable<Question>> onSuccess, Action<ApiException> onError, string title, bool includeBody = false, bool includeComments = false, bool includeAnswers = false, IEnumerable<string> tagged = null, IEnumerable<string> notTagged = null)
-        {
-            string taggedString = null;
-            if (tagged != null)
-                taggedString = String.Join(";", tagged.ToArray());
-
-            string notTaggedString = null;
-            if (notTagged != null)
-                notTaggedString = String.Join(";", notTagged.ToArray());
-
             MakeRequest<Question>("similar", null, new
             {
                 site = this.SiteUrlName,
+                page = page ?? null,
+                pagesize = pageSize ?? null,
+                fromdate = GetDateValue(fromDate),
+                todate = GetDateValue(toDate),
+                sort = GetEnumValue(sortBy),
+                order = GetSortDirection(sortDirection),
+                min = GetDateValue(min),
+                max = GetDateValue(max),
+                tagged = tagged != null ? String.Join(";", tagged) : null,
+                nottagged = notTagged != null ? String.Join(";", notTagged) : null,
                 title = title,
-                body = includeBody ? (bool?)true : null,
-                comments = includeComments ? (bool?)true : null,
-                answers = includeAnswers ? (bool?)true : null,
-                tagged = taggedString,
-                nottagged = notTaggedString
-            }, (items) => onSuccess(items.Items), onError);
+                filter = filter
+            }, response => onSuccess(new PagedList<Question>(response)), onError);
         }
     }
 }

trunk/source/Stacky/StackyClientAsync/RevisionMethods.cs

     public partial class StackyClientAsync
 #endif
     {
-        public virtual void GetRevisions(IEnumerable<int> ids, Action<IEnumerable<Revision>> onSuccess, Action<ApiException> onError, DateTime? fromDate = null, DateTime? toDate = null)
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/revisions-by-guids
+        /// </summary>
+        public void GetRevisions(IEnumerable<string> ids, Action<IPagedList<Revision>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
         {
-            MakeRequest<Revision>("revisions", new string[] { ids.Vectorize() }, new
-            {
-                site = this.SiteUrlName,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null
-            }, (items) => onSuccess(items.Items), onError);
+            Execute<Revision>("revisions", new string[] { ids.Vectorize() },
+                onSuccess, onError,
+                null, null, page, pageSize, fromDate, toDate, null, null, filter);
         }
 
-        public virtual void GetRevisions(int id, Action<IEnumerable<Revision>> onSuccess, Action<ApiException> onError, DateTime? fromDate = null, DateTime? toDate = null)
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/revisions-by-guids
+        /// </summary>
+        public void GetRevisions(IEnumerable<Guid> ids, Action<IPagedList<Revision>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
         {
-            GetRevisions(id.ToArray(), onSuccess, onError, fromDate, toDate);
+            GetRevisions(ids.Select(i => i.ToString()), onSuccess, onError, page, pageSize, fromDate, toDate, filter);
         }
 
-        public virtual void GetRevision(int id, Guid revision, Action<Revision> onSuccess, Action<ApiException> onError = null)
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/revisions-by-guids
+        /// </summary>
+        public void GetRevision(string id, Action<Revision> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
         {
-            MakeRequest<Revision>("revisions", new string[] { id.ToString(), revision.ToString() }, new
-            {
-                site = this.SiteUrlName
-            }, returnedItems => onSuccess(returnedItems.Items.FirstOrDefault()), onError);
+            GetRevisions(new string[] { id }, items => onSuccess(items.FirstOrDefault()), onError, page, pageSize, fromDate, toDate, filter);
+        }
+
+        /// <summary>
+        /// See https://api.stackexchange.com/docs/revisions-by-guids
+        /// </summary>
+        public void GetRevision(Guid id, Action<Revision> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            GetRevisions(new string[] { id.ToString() }, items => onSuccess(items.FirstOrDefault()), onError, page, pageSize, fromDate, toDate, filter);
         }
     }
 }

trunk/source/Stacky/StackyClientAsync/SuggestedEditMethods.cs

+using System;
+using System.Collections.Generic;
+using System.Linq;
+
+namespace Stacky
+{
+#if SILVERLIGHT
+    public partial class StackyClient
+#else
+    public partial class StackyClientAsync
+#endif
+    {
+        /// <summary>
+        /// See http://api.stackexchange.com/docs/suggested-edits
+        /// </summary>
+        public void GetSuggestedEdits(Action<IPagedList<SuggestedEdit>> onSuccess, Action<ApiException> onError = null,
+            SuggestedEditSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<SuggestedEdit>("suggested-edits", null,
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See http://api.stackexchange.com/docs/suggested-edits-by-ids
+        /// </summary>
+        public void GetSuggestedEdits(IEnumerable<int> ids, Action<IPagedList<SuggestedEdit>> onSuccess, Action<ApiException> onError = null,
+            SuggestedEditSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<SuggestedEdit>("suggested-edits", new string[] { ids.Vectorize() },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See http://api.stackexchange.com/docs/suggested-edits-by-ids
+        /// </summary>
+        public void GetSuggestedEdit(int id, Action<SuggestedEdit> onSuccess, Action<ApiException> onError = null,
+            SuggestedEditSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetSuggestedEdits(id.ToArray(), items => onSuccess(items.FirstOrDefault()), onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+    }
+}

trunk/source/Stacky/StackyClientAsync/TagMethods.cs

     public partial class StackyClientAsync
 #endif
     {
-        public virtual void GetTags(Action<IPagedList<Tag>> onSuccess, Action<ApiException> onError, TagSort sortBy = TagSort.Popular, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/tags
+        /// </summary>
+        public void GetTags(Action<IPagedList<Tag>> onSuccess, Action<ApiException> onError = null,
+            TagSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string inName = null, string filter = null)
         {
-            GetTags(onSuccess, onError, "tags", null, sortBy.ToString().ToLower(), GetSortDirection(sortDirection), page, pageSize);
-        }
-
-        private void GetTags(Action<IPagedList<Tag>> onSuccess, Action<ApiException> onError, string method, string[] urlParameters, string sort, string order, int? page = null, int? pageSize = null)
-        {
-            MakeRequest<Tag>(method, urlParameters, new
+            MakeRequest<Tag>("tags", null, new
             {
                 site = this.SiteUrlName,
                 page = page ?? null,
                 pagesize = pageSize ?? null,
-                sort = sort,
-                order = order
-            }, (items) => onSuccess(new PagedList<Tag>(items)), onError);
+                fromdate = GetDateValue(fromDate),
+                todate = GetDateValue(toDate),
+                sort = GetEnumValue(sortBy),
+                order = GetSortDirection(sortDirection),
+                min = min ?? null,
+                max = max ?? null,
+                inname = inName,
+                filter = filter
+            }, response => onSuccess(new PagedList<Tag>(response)), onError);
         }
 
-        public virtual void GetTagsByUser(int userId, Action<IPagedList<Tag>> onSuccess, Action<ApiException> onError, int? page = null, int? pageSize = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/tag-synonyms
+        /// </summary>
+        public void GetTagSynonyms(Action<IPagedList<TagSynonym>> onSuccess, Action<ApiException> onError = null,
+            TagSynonymSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            GetTagsByUser(userId.ToArray(), onSuccess, onError, page, pageSize);
+            Execute<TagSynonym>("tags", new string[] { "synonyms" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
-        public virtual void GetTagsByUser(IEnumerable<int> userIds, Action<IPagedList<Tag>> onSuccess, Action<ApiException> onError, int? page = null, int? pageSize = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/synonyms-by-tags
+        /// </summary>
+        public void GetTagSynonyms(IEnumerable<string> tags, Action<IPagedList<TagSynonym>> onSuccess, Action<ApiException> onError = null,
+            TagSynonymSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            //TODO: does this method support sort and order?
-            GetTags(onSuccess, onError, "users", new string[] { userIds.Vectorize(), "tags" }, null, null, page, pageSize);
+            Execute<TagSynonym>("tags", new string[] { tags.Vectorize(), "synonyms" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
-        public virtual void GetAllTagSynonyms(Action<IPagedList<TagSynonym>> onSuccess, Action<ApiException> onError, TagSynonymSort sortBy = TagSynonymSort.Creation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, int? min = null, int? max = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/synonyms-by-tags
+        /// </summary>
+        public void GetTagSynonyms(string tag, Action<IPagedList<TagSynonym>> onSuccess, Action<ApiException> onError = null, 
+            TagSynonymSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            MakeRequest<TagSynonym>("tags", new string[] { "synonyms" }, new
+            GetTagSynonyms(new string[] { tag }, onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-answerers-on-tags
+        /// </summary>
+        public void GetTagTopAnswerers(string tag, Action<IPagedList<TagScore>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, AnswerTimePeriod period = AnswerTimePeriod.AllTime, string filter = null)
+        {
+            MakeRequest<TagScore>("tags", new string[] { tag, "top-answerers", GetEnumValue(period) }, new
             {
                 site = this.SiteUrlName,
                 page = page ?? null,
                 pagesize = pageSize ?? null,
-                sort = sortBy.ToString(),
-                order = GetSortDirection(sortDirection),
-                max = max,
-                min = min
-            }, (items) => onSuccess(new PagedList<TagSynonym>(items)), onError);
+                filter = filter
+            }, response => onSuccess(new PagedList<TagScore>(response)), onError);
         }
 
-        public virtual void GetTagSynonyms(Action<IPagedList<TagSynonym>> onSuccess, Action<ApiException> onError, string tag, TagSynonymSort sortBy = TagSynonymSort.Creation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, int? min = null, int? max = null, DateTime? fromDate = null, DateTime? toDate = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-askers-on-tags
+        /// </summary>
+        public void GetTagTopAskers(string tag, Action<IPagedList<TagScore>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, AnswerTimePeriod period = AnswerTimePeriod.AllTime, string filter = null)
         {
-            GetTagSynonyms(onSuccess, onError, new string[] { tag }, sortBy, sortDirection, page, pageSize, min, max, fromDate, toDate);
-        }
-
-        public virtual void GetTagSynonyms(Action<IPagedList<TagSynonym>> onSuccess, Action<ApiException> onError, IEnumerable<string> tags, TagSynonymSort sortBy = TagSynonymSort.Creation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, int? min = null, int? max = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            MakeRequest<TagSynonym>("tags", new string[] { tags.Vectorize(), "synonyms" }, new
+            MakeRequest<TagScore>("tags", new string[] { tag, "top-askers", GetEnumValue(period) }, new
             {
                 site = this.SiteUrlName,
                 page = page ?? null,
                 pagesize = pageSize ?? null,
-                sort = sortBy.ToString(),
-                order = GetSortDirection(sortDirection),
-                max = max,
-                min = min,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null
-            }, (items) => onSuccess(new PagedList<TagSynonym>(items)), onError);
+                filter = filter
+            }, response => onSuccess(new PagedList<TagScore>(response)), onError);
         }
 
-        public void GetTagWikis(Action<IEnumerable<TagWiki>> onSuccess, Action<ApiException> onError, string tag)
-        {
-            GetTagWikis(onSuccess, onError, new string[] { tag });
-        }
-
-        public void GetTagWikis(Action<IEnumerable<TagWiki>> onSuccess, Action<ApiException> onError, IEnumerable<string> tags)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/wikis-by-tags
+        /// </summary>
+        public void GetTagWikis(IEnumerable<string> tags, Action<IPagedList<TagWiki>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = 0, string filter = null)
         {
             MakeRequest<TagWiki>("tags", new string[] { tags.Vectorize(), "wikis" }, new
             {
                 site = this.SiteUrlName,
-            }, (items) => onSuccess(items.Items), onError);
+                page = page ?? null,
+                pagesize = pageSize ?? null,
+                filter = filter
+            }, response => onSuccess(new PagedList<TagWiki>(response)), onError);
         }
 
         /// <summary>
-        /// Returns the top 30 question askers active in a single tag, of either all-time or the last 30 days.
+        /// See: http://api.stackexchange.com/docs/wikis-by-tags
         /// </summary>
-        /// <param name="onSuccess"></param>
-        /// <param name="onError"></param>
-        /// <param name="tag">The name of the tag to query</param>
-        /// <param name="period">The period of time to query</param>
-        /// <returns></returns>
-        public void GetTopAskers(Action<IEnumerable<TopUser>> onSuccess, Action<ApiException> onError, string tag, TopUserPeriod period)
+        public void GetTagWikis(string tag, Action<IPagedList<TagWiki>> onSuccess, Action<ApiException> onError = null, 
+            int? page = null, int? pageSize = 0, string filter = null)
         {
-            GetTopAskers(onSuccess, onError, new string[] { tag }, period);
-        }
-
-        /// <summary>
-        /// Returns the top 30 question askers active in a single tag, of either all-time or the last 30 days.
-        /// </summary>
-        /// <param name="onSuccess"></param>
-        /// <param name="onError"></param>
-        /// <param name="tags">The list of tags to query</param>
-        /// <param name="period">The time period to query</param>
-        /// <returns></returns>
-        public void GetTopAskers(Action<IEnumerable<TopUser>> onSuccess, Action<ApiException> onError, IEnumerable<string> tags, TopUserPeriod period)
-        {
-            var sortArgs = period.GetAttribute<SortArgsAttribute>();
-            MakeRequest<TopUser>("tags", new string[] { tags.Vectorize(), "top-askers", sortArgs.Sort }, new
-            {
-                site = this.SiteUrlName,
-            }, (items) => onSuccess(items.Items), onError);
-        }
-
-        /// <summary>
-        /// Returns the top 30 question askers active in a single tag, of either all-time or the last 30 days.
-        /// </summary>
-        /// <param name="onSuccess"></param>
-        /// <param name="onError"></param>
-        /// <param name="tag">The name of the tag to query</param>
-        /// <param name="period">The period of time to query</param>
-        /// <returns></returns>
-        public void GetTopAnswerers(Action<IEnumerable<TopUser>> onSuccess, Action<ApiException> onError, string tag, TopUserPeriod period)
-        {
-            GetTopAnswerers(onSuccess, onError, new string[] { tag }, period);
-        }
-
-        /// <summary>
-        /// Returns the top 30 question askers active in a single tag, of either all-time or the last 30 days.
-        /// </summary>
-        /// <param name="onSuccess"></param>
-        /// <param name="onError"></param>
-        /// <param name="tags">The list of tags to query</param>
-        /// <param name="period">The time period to query</param>
-        /// <returns></returns>
-        public void GetTopAnswerers(Action<IEnumerable<TopUser>> onSuccess, Action<ApiException> onError, IEnumerable<string> tags, TopUserPeriod period)
-        {
-            var sortArgs = period.GetAttribute<SortArgsAttribute>();
-            MakeRequest<TopUser>("tags", new string[] { tags.Vectorize(), "top-answerers", sortArgs.Sort }, new
-            {
-                site = this.SiteUrlName,
-            }, (items) => onSuccess(items.Items), onError);
+            GetTagWikis(new string[] { tag }, onSuccess, onError, page, pageSize, filter);
         }
     }
 }

trunk/source/Stacky/StackyClientAsync/UserMethods.cs

     public partial class StackyClientAsync
 #endif
     {
-        public virtual void GetUsers(Action<IPagedList<User>> onSuccess, Action<ApiException> onError, UserSort sortBy = UserSort.Reputation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, string filter = null)
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/users
+        /// </summary>
+        public void GetUsers(Action<IPagedList<User>> onSuccess, Action<ApiException> onError = null,
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string filter = null)
         {
-            MakeRequest<User>("users", null, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                filter = filter,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection)
-            }, (items) => onSuccess(new PagedList<User>(items)), onError);
-        }
-
-        public virtual void GetUsers(IEnumerable<int> userIds, Action<IPagedList<User>> onSuccess, Action<ApiException> onError = null)
-        {
-            MakeRequest<User>("users", new string[] { userIds.Vectorize() }, new
-            {
-                site = this.SiteUrlName,
-            }, (items) => onSuccess(new PagedList<User>(items)), onError);
-        }
-
-        public virtual void GetUser(int userId, Action<User> onSuccess, Action<ApiException> onError = null)
-        {
-            GetUsers(new int[] { userId }, results => onSuccess(results.FirstOrDefault()), onError);
-        }
-
-        public virtual void GetUserMentions(int userId, Action<IPagedList<Comment>> onSuccess, Action<ApiException> onError, UserMentionSort sortBy = UserMentionSort.Creation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
-        {
-            GetUserMentions(new int[] { userId }, onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max);
-        }
-
-        public virtual void GetUserMentions(IEnumerable<int> userIds, Action<IPagedList<Comment>> onSuccess, Action<ApiException> onError, UserMentionSort sortBy = UserMentionSort.Creation, SortDirection sortDirection = SortDirection.Descending, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null)
-        {
-            MakeRequest<Comment>("users", new string[] { userIds.Vectorize(), "mentioned" }, new
-            {
-                site = this.SiteUrlName,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                min = min ?? null,
-                max = max ?? null,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection)
-            }, (items) => onSuccess(new PagedList<Comment>(items)), onError);
-        }
-
-        public virtual void GetUserTimeline(int userId, Action<IPagedList<UserEvent>> onSuccess, Action<ApiException> onError, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            GetUserTimeline(new int[] { userId }, onSuccess, onError, fromDate, toDate);
-        }
-
-        public virtual void GetUserTimeline(IEnumerable<int> userIds, Action<IPagedList<UserEvent>> onSuccess, Action<ApiException> onError, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            MakeRequest<UserEvent>("users", new string[] { userIds.Vectorize(), "timeline" }, new
-            {
-                site = this.SiteUrlName,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null
-            }, (items) => onSuccess(new PagedList<UserEvent>(items)), onError);
-        }
-
-        public virtual void GetUserReputation(int userId, Action<IPagedList<Reputation>> onSuccess, Action<ApiException> onError, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            GetUserReputation(new int[] { userId }, onSuccess, onError, page, pageSize, fromDate, toDate);
-        }
-
-        public virtual void GetUserReputation(IEnumerable<int> userIds, Action<IPagedList<Reputation>> onSuccess, Action<ApiException> onError, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            MakeRequest<Reputation>("users", new string[] { userIds.Vectorize(), "reputation" }, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null
-            }, (items) => onSuccess(new PagedList<Reputation>(items)), onError);
-        }
-
-        public virtual void GetModerators(Action<IPagedList<User>> onSuccess, Action<ApiException> onError, int? page = null, int? pageSize = null, UserSort sortBy = UserSort.Reputation, SortDirection sortDirection = SortDirection.Descending, string filter = null, DateTime? fromDate = null, DateTime? toDate = null)
-        {
-            MakeRequest<User>("users", new string[] { "moderators" }, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                filter = filter,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection),
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null
-            }, (response) => onSuccess(new PagedList<User>(response)), onError);
-        }
-
-        public virtual void GetNoAnswerQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, int userId, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
-        {
-            GetNoAnswerQuestions(onSuccess, onError, userId.ToArray(), page, pageSize, sortBy, sortDirection, fromDate, toDate, min, max, includeBody, includeAnswers, includeComments);
-        }
-
-        public virtual void GetNoAnswerQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, IEnumerable<int> userIds, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
-        {
-            MakeRequest<Question>("users", new string[] { userIds.Vectorize(), "questions", "no-answers" }, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection),
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                min = min ?? null,
-                max = max ?? null,
-                body = includeBody,
-                comments = includeComments,
-                answers = includeAnswers
-            }, (response) => onSuccess(new PagedList<Question>(response)), onError);
+            Execute<User, Int32>("users", null,
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Gets the questions asked by the users in userId which have at least one answer, but no accepted answer.
-        /// Questions returned by this method have answers, but the owner has not opted to accept any of them.
+        /// See: http://api.stackexchange.com/docs/users-by-ids
         /// </summary>
-        public virtual void GetUnacceptedQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, int userId, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
+        public void GetUsers(IEnumerable<int> ids, Action<IPagedList<User>> onSuccess, Action<ApiException> onError = null,
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string filter = null)
         {
-            GetUnacceptedQuestions(onSuccess, onError, userId.ToArray(), page, pageSize, sortBy, sortDirection, fromDate, toDate, min, max, includeBody, includeAnswers, includeComments);
+            Execute<User, Int32>("users", new string[] { ids.Vectorize() },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Gets the questions asked by the users in userIds which have at least one answer, but no accepted answer.
-        /// Questions returned by this method have answers, but the owner has not opted to accept any of them.
+        /// See: http://api.stackexchange.com/docs/users-by-ids
         /// </summary>
-        public virtual void GetUnacceptedQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, IEnumerable<int> userIds, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
+        public void GetUser(int id, Action<User> onSuccess, Action<ApiException> onError = null, 
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string filter = null)
         {
-            MakeRequest<Question>("users", new string[] { userIds.Vectorize(), "questions", "unaccepted" }, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection),
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                min = min ?? null,
-                max = max ?? null,
-                body = includeBody,
-                comments = includeComments,
-                answers = includeAnswers
-            }, (response) => onSuccess(new PagedList<Question>(response)), onError);
+            GetUsers(id.ToArray(), items => onSuccess(items.FirstOrDefault()), onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Gets the questions asked by the users in id which the site consideres unanswered, while still having at least one answer posted.
-        /// These rules are subject to change, but currently any question without at least one upvoted or accepted answer is considered unanswered.
+        /// See: http://api.stackexchange.com/docs/answers-on-users
         /// </summary>
-        public virtual void GetUnansweredQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, int userId, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
+        public void GetUserAnswers(IEnumerable<int> ids, Action<IPagedList<Answer>> onSuccess, Action<ApiException> onError = null,
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            GetUnansweredQuestions(onSuccess, onError, userId.ToArray(), page, pageSize, sortBy, sortDirection, fromDate, toDate, min, max, includeBody, includeAnswers, includeComments);
+            Execute<Answer>("users", new string[] { ids.Vectorize(), "answers" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Gets the questions asked by the users in id which the site consideres unanswered, while still having at least one answer posted.
-        /// These rules are subject to change, but currently any question without at least one upvoted or accepted answer is considered unanswered.
+        /// See: http://api.stackexchange.com/docs/answers-on-users
         /// </summary>
-        public virtual void GetUnansweredQuestions(Action<IPagedList<Question>> onSuccess, Action<ApiException> onError, IEnumerable<int> userIds, int? page = null, int? pageSize = null, QuestionSort sortBy = QuestionSort.Activity, SortDirection sortDirection = SortDirection.Descending, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, bool? includeBody = null, bool? includeAnswers = null, bool? includeComments = null)
+        public void GetUserAnswers(int id, Action<IPagedList<Answer>> onSuccess, Action<ApiException> onError = null, 
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            MakeRequest<Question>("users", new string[] { userIds.Vectorize(), "questions", "unanswered" }, new
-            {
-                site = this.SiteUrlName,
-                page = page ?? null,
-                pagesize = pageSize ?? null,
-                sort = sortBy.ToString().ToLower(),
-                order = GetSortDirection(sortDirection),
-                fromdate = fromDate.HasValue ? (long?)fromDate.Value.ToUnixTime() : null,
-                todate = toDate.HasValue ? (long?)toDate.Value.ToUnixTime() : null,
-                min = min ?? null,
-                max = max ?? null,
-                body = includeBody,
-                comments = includeComments,
-                answers = includeAnswers
-            }, (response) => onSuccess(new PagedList<Question>(response)), onError);
+            GetUserAnswers(id.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns the top 30 answer a user has posted in resposne to questions with the given tags.
+        /// See: http://api.stackexchange.com/docs/badges-on-users
         /// </summary>
-        public virtual void GetTopTaggedAnswers(Action<IEnumerable<Answer>> onSuccess, Action<ApiException> onError, int userId, string tag, bool? includeBody = null, bool? includeComments = null)
+        public void GetUserBadges(IEnumerable<int> ids, Action<IPagedList<Badge>> onSuccess, Action<ApiException> onError = null,
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, BadgeMinMax? min = null, BadgeMinMax? max = null, string filter = null)
         {
-            GetTopTaggedAnswers(onSuccess, onError, userId, new string[] { tag }, includeBody, includeComments);
+            Execute<Badge, BadgeMinMax>("users", new string[] { ids.Vectorize(), "badges" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns the top 30 answer a user has posted in resposne to questions with the given tags.
+        /// See: http://api.stackexchange.com/docs/badges-on-users
         /// </summary>
-        public virtual void GetTopTaggedAnswers(Action<IEnumerable<Answer>> onSuccess, Action<ApiException> onError, int userId, IEnumerable<string> tags, bool? includeBody = null, bool? includeComments = null)
+        public void GetUserBadges(int id, Action<IPagedList<Badge>> onSuccess, Action<ApiException> onError = null,
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, BadgeMinMax? min = null, BadgeMinMax? max = null, string filter = null)
         {
-            if (tags == null)
-                throw new ArgumentNullException("tags");
-
-            MakeRequest<Answer>("users", new string[] { userId.ToString(), "tags", tags.Vectorize(), "top-answers" }, new
-            {
-                site = this.SiteUrlName,
-                body = includeBody,
-                comments = includeComments
-            }, (response) => onSuccess(new PagedList<Answer>(response)), onError);
+            GetUserBadges(id.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns the top 30 answer a user has posted in resposne to questions with the given tags.
+        /// See: http://api.stackexchange.com/docs/comments-on-users
         /// </summary>
-        public virtual void GetTopTaggedQuestions(Action<IEnumerable<Question>> onSuccess, Action<ApiException> onError, int userId, string tag, bool? includeBody = null, bool? includeComments = null, bool? includeAnswers = null)
+        public void GetUserComments(IEnumerable<int> ids, Action<IPagedList<Comment>> onSuccess, Action<ApiException> onError = null,
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            GetTopTaggedQuestions(onSuccess, onError, userId, new string[] { tag }, includeBody, includeComments, includeAnswers);
+            Execute<Comment>("users", new string[] { ids.Vectorize(), "comments" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns the top 30 answer a user has posted in resposne to questions with the given tags.
+        /// See: http://api.stackexchange.com/docs/comments-on-users
         /// </summary>
-        public virtual void GetTopTaggedQuestions(Action<IEnumerable<Question>> onSuccess, Action<ApiException> onError, int userId, IEnumerable<string> tags, bool? includeBody = null, bool? includeComments = null, bool? includeAnswers = null)
+        public void GetUserComments(int id, Action<IPagedList<Comment>> onSuccess, Action<ApiException> onError = null, 
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            if (tags == null)
-                throw new ArgumentNullException("tags");
-
-            MakeRequest<Question>("users", new string[] { userId.ToString(), "tags", tags.Vectorize(), "top-questions" }, new
-            {
-                site = this.SiteUrlName,
-                body = includeBody,
-                comments = includeComments,
-                answers = includeAnswers
-            }, (response) => onSuccess(new PagedList<Question>(response)), onError);
+            GetUserComments(id.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns a single user's top 30 tags by answer score.
+        /// See: http://api.stackexchange.com/docs/comments-by-users-to-user
         /// </summary>
-        public virtual void GetTopAnswerTags(Action<IEnumerable<TopTag>> onSuccess, Action<ApiException> onError, int userId)
+        /// TODO: Fix Sort
+        public void GetUserCommentsTo(IEnumerable<int> fromIds, IEnumerable<int> toIds, Action<IPagedList<Comment>> onSuccess, Action<ApiException> onError = null,
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            MakeRequest<TopTag>("users", new string[] { userId.ToString(), "top-answer-tags" }, new
-            {
-                site = this.SiteUrlName,
-                id = userId
-            }, (response) => onSuccess(response.Items), onError);
+            Execute<Comment>("users", new string[] { fromIds.Vectorize(), "comments", toIds.Vectorize() },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
 
         /// <summary>
-        /// Returns a single user's top 30 tags by question score.
+        /// See: https://api.stackexchange.com/docs/favorites-on-users
         /// </summary>
-        public virtual void GetTopQuestionTags(Action<IEnumerable<TopTag>> onSuccess, Action<ApiException> onError, int userId)
+        /// TODO: Fix Sort
+        public void GetUserFavoriteQuestions(IEnumerable<int> userIds, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
         {
-            MakeRequest<TopTag>("users", new string[] { userId.ToString(), "top-question-tags" }, new
-            {
-                site = this.SiteUrlName,
-                id = userId
-            }, (response) => onSuccess(response.Items), onError);
+            Execute<Question>("users", new string[] { userIds.Vectorize(), "favorites" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/favorites-on-users
+        /// </summary>
+        public void GetUserFavoriteQuestions(int userId, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null, 
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserFavoriteQuestions(userId.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/mentions-on-users
+        /// </summary>
+        public void GetUserMentions(IEnumerable<int> userIds, Action<IPagedList<Comment>> onSuccess, Action<ApiException> onError = null,
+            CommentSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Comment>("users", new string[] { userIds.Vectorize(), "mentioned" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/mentions-on-users
+        /// </summary>
+        public void GetUserMentions(int userId, Action<IPagedList<Comment>> onSuccess, Action<ApiException> onError = null, 
+            CommentSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserMentions(userId.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/privileges-on-users
+        /// </summary>
+        public void GetUserPrivileges(IEnumerable<int> userIds, Action<IPagedList<Privilege>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, string filter = null)
+        {
+            Execute<Privilege>("users", new string[] { userIds.Vectorize(), "privileges" },
+                onSuccess, onError,
+                null, null, page, pageSize, null, null, null, null, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/privileges-on-users
+        /// </summary>
+        public void GetUserPrivileges(int userId, Action<IPagedList<Privilege>> onSuccess, Action<ApiException> onError = null, 
+            CommentSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserPrivileges(userId.ToArray(), onSuccess, onError, page, pageSize, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/questions-on-users
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetUserQuestions(IEnumerable<int> userIds, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Question>("users", new string[] { userIds.Vectorize(), "questions" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/questions-on-users
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetUserQuestions(int userId, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null, 
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserQuestions(userId.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/no-answer-questions-on-users
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetUserQuestionsWithNoAnswers(IEnumerable<int> userIds, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Question>("users", new string[] { userIds.Vectorize(), "questions", "no-answers" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/no-answer-questions-on-users    
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetUserQuestionsWithNoAnswers(int userId, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null, 
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserQuestionsWithNoAnswers(userId.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/unaccepted-questions-on-users
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetUserUnacceptedQuestions(IEnumerable<int> userIds, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Question>("users", new string[] { userIds.Vectorize(), "questions", "unaccepted" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/unaccepted-questions-on-users    
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetUserUnacceptedQuestions(int userId, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null, 
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserUnacceptedQuestions(userId.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/unanswered-questions-on-users
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetUserUnansweredQuestions(IEnumerable<int> userIds, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Question>("users", new string[] { userIds.Vectorize(), "questions", "unanswered" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/unanswered-questions-on-users  
+        /// </summary>
+        /// TODO: Fix Sort
+        public void GetUserUnansweredQuestions(int userId, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null, 
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserUnansweredQuestions(userId.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/reputation-on-users
+        /// </summary>
+        public void GetUserReputation(IEnumerable<int> userIds, Action<IPagedList<Reputation>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            Execute<Reputation>("users", new string[] { userIds.Vectorize(), "reputation" },
+                onSuccess, onError,
+                null, null, page, pageSize, fromDate, toDate, null, null, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/reputation-on-users 
+        /// </summary>
+        public void GetUserReputation(int userId, Action<IPagedList<Reputation>> onSuccess, Action<ApiException> onError = null, 
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            GetUserReputation(userId.ToArray(), onSuccess, onError, page, pageSize, fromDate, toDate, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/suggested-edits-on-users
+        /// </summary>
+        public void GetUserSuggestedEdits(IEnumerable<int> userIds, Action<IPagedList<SuggestedEdit>> onSuccess, Action<ApiException> onError = null,
+            SuggestedEditSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<SuggestedEdit>("users", new string[] { userIds.Vectorize(), "suggested-edits" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/suggested-edits-on-users 
+        /// </summary>
+        public void GetUserUnansweredQuestions(int userId, Action<IPagedList<SuggestedEdit>> onSuccess, Action<ApiException> onError = null, 
+            SuggestedEditSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserSuggestedEdits(userId.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/tags-on-users
+        /// </summary>
+        public void GetUserTags(IEnumerable<int> userIds, Action<IPagedList<Tag>> onSuccess, Action<ApiException> onError = null,
+            TagSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Tag>("users", new string[] { userIds.Vectorize(), "tags" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: https://api.stackexchange.com/docs/tags-on-users
+        /// </summary>
+        public void GetUserTags(int userId, Action<IPagedList<Tag>> onSuccess, Action<ApiException> onError = null, 
+            TagSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserTags(userId.ToArray(), onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-user-answers-in-tags
+        /// </summary>
+        public void GetUserTopAnswersByTag(IEnumerable<int> userIds, IEnumerable<string> tags, Action<IPagedList<Answer>> onSuccess, Action<ApiException> onError = null,
+            AnswerSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Answer>("users", new string[] { userIds.Vectorize(), "tags", tags.Vectorize(), "top-answers" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-user-answers-in-tags
+        /// </summary>
+        public void GetUserTopAnswersByTag(int userId, IEnumerable<string> tags, Action<IPagedList<Answer>> onSuccess, Action<ApiException> onError = null, 
+            AnswerSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserTopAnswersByTag(userId.ToArray(), tags, onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-answer-tags-on-users
+        /// </summary>
+        public void GetUserTopAnswersByTag(IEnumerable<int> userIds, Action<IPagedList<TopTag>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, string filter = null)
+        {
+            Execute<TopTag>("users", new string[] { userIds.Vectorize(), "top-answer-tags" },
+                onSuccess, onError,
+                null, null, page, pageSize, null, null, null, null, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-answer-tags-on-users
+        /// </summary>
+        public void GetUserTopAnswersByTag(int userId, Action<IPagedList<TopTag>> onSuccess, Action<ApiException> onError = null, 
+            int? page = null, int? pageSize = null, string filter = null)
+        {
+            GetUserTopAnswersByTag(userId.ToArray(), onSuccess, onError, page, pageSize, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-user-questions-in-tags
+        /// </summary>
+        public void GetUserTopQuestionsByTag(IEnumerable<int> userIds, IEnumerable<string> tags, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null,
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            Execute<Question>("users", new string[] { userIds.Vectorize(), "tags", tags.Vectorize(), "top-questions" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-user-questions-in-tags
+        /// </summary>
+        public void GetUserTopQuestionsByTag(int userId, IEnumerable<string> tags, Action<IPagedList<Question>> onSuccess, Action<ApiException> onError = null, 
+            QuestionSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, DateTime? min = null, DateTime? max = null, string filter = null)
+        {
+            GetUserTopQuestionsByTag(userId.ToArray(), tags, onSuccess, onError, sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-question-tags-on-users
+        /// </summary>
+        public void GetUserTopQuestionsByTag(IEnumerable<int> userIds, Action<IPagedList<TopTag>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, string filter = null)
+        {
+            Execute<TopTag>("users", new string[] { userIds.Vectorize(), "top-question-tags" },
+                onSuccess, onError,
+                null, null, page, pageSize, null, null, null, null, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/top-question-tags-on-users
+        /// </summary>
+        public void GetUserTopQuestionsByTag(int userId, Action<IPagedList<TopTag>> onSuccess, Action<ApiException> onError = null, 
+            int? page = null, int? pageSize = null, string filter = null)
+        {
+            GetUserTopQuestionsByTag(userId.ToArray(), onSuccess, onError, page, pageSize, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/timeline-on-users
+        /// </summary>
+        public void GetUserTimeline(IEnumerable<int> userIds, Action<IPagedList<UserTimeline>> onSuccess, Action<ApiException> onError = null,
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            Execute<UserTimeline>("users", new string[] { userIds.Vectorize(), "timeline" },
+                onSuccess, onError,
+                null, null, page, pageSize, fromDate, toDate, null, null, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/timeline-on-users
+        /// </summary>
+        public void GetUserTimeline(int userId, Action<IPagedList<UserTimeline>> onSuccess, Action<ApiException> onError = null, 
+            int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, string filter = null)
+        {
+            GetUserTimeline(userId.ToArray(), onSuccess, onError, page, pageSize, fromDate, toDate, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/moderators
+        /// </summary>
+        public void GetModerators(Action<IPagedList<User>> onSuccess, Action<ApiException> onError = null,
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string filter = null)
+        {
+            Execute<User, Int32>("users", new string[] { "moderators" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
+        }
+
+        /// <summary>
+        /// See: http://api.stackexchange.com/docs/elected-moderators
+        /// </summary>
+        public void GetElectedModerators(Action<IPagedList<User>> onSuccess, Action<ApiException> onError = null,
+            UserSort? sortBy = null, SortDirection? sortDirection = null, int? page = null, int? pageSize = null, DateTime? fromDate = null, DateTime? toDate = null, int? min = null, int? max = null, string filter = null)
+        {
+            Execute<User, Int32>("users", new string[] { "moderators", "elected" },
+                onSuccess, onError,
+                sortBy, sortDirection, page, pageSize, fromDate, toDate, min, max, filter);
         }
     }
 }

trunk/source/Tests/Stacky.IntegrationTests/QuestionTests.cs

         //    Assert.IsNotNull(questions);
         //}
 
-        [TestMethod]
-        public void Question_Search_Async()
-        {
-            ClientAsync.Search(questions => Assert.IsNotNull(questions), error => Assert.Fail(), inTitle: "Thread");
-        }
+        //[TestMethod]
+        //public void Question_Search_Async()
+        //{
+        //    ClientAsync.Search(questions => Assert.IsNotNull(questions), error => Assert.Fail(), inTitle: "Thread");
+        //}
 
         [TestMethod]
         public void Question_GetQuestions_HasPagingInformation()

trunk/source/Tests/Stacky.IntegrationTests/TagTests.cs

         //    Assert.IsNotNull(tags);
         //}
 
-        [TestMethod]
-        public void Tag_GetTagsByUser_Async()
-        {
-            ClientAsync.GetTagsByUser(1464, tags => Assert.IsNotNull(tags), error => Assert.Fail());
-        }
+        //[TestMethod]
+        //public void Tag_GetTagsByUser_Async()
+        //{
+        //    ClientAsync.GetTagsByUser(1464, tags => Assert.IsNotNull(tags), error => Assert.Fail());
+        //}
 
         //[TestMethod]
         //public void Tag_GetAllTagSynonyms()