 MediaPortal/Incubator/Login/LoginModel.cs          |    2 +-
 .../Incubator/Trakt/Models/TraktSetupModel.cs      |  114 +-
 .../Incubator/Trakt/Service/TraktHandler.cs        |   25 +-
 MediaPortal/Incubator/Trakt/Trakt.csproj           |    2 +
 .../Settings/ReSharper/TeamMediaPortal.DotSettings |    6 +-
 .../Trakt/DataStructures/MovieScrobbleAndMode.cs   |   11 -
 .../Trakt/DataStructures/MovieSyncAndMode.cs       |   11 -
 .../Libraries/Trakt/DataStructures/TraktAccount.cs |   11 -
 .../Trakt/DataStructures/TraktActivity.cs          |   89 +-
 .../Trakt/DataStructures/TraktCalendar.cs          |   14 +-
 .../Libraries/Trakt/DataStructures/TraktEpisode.cs |   61 +-
 .../Trakt/DataStructures/TraktEpisodeSummary.cs    |   38 +-
 .../Trakt/DataStructures/TraktListItem.cs          |   30 +-
 .../Libraries/Trakt/DataStructures/TraktMovie.cs   |   69 +-
 .../Trakt/DataStructures/TraktMovieSummary.cs      |   48 +-
 .../Libraries/Trakt/DataStructures/TraktPerson.cs  |   13 +-
 .../Libraries/Trakt/DataStructures/TraktShow.cs    |  102 +-
 .../Trakt/DataStructures/TraktShowSeason.cs        |   39 -
 .../Trakt/DataStructures/TraktShowSummary.cs       |   75 +-
 .../Trakt/DataStructures/TraktSyncMovieResponse.cs |   35 +-
 .../Libraries/Trakt/DataStructures/TraktUser.cs    |   32 +-
 .../Trakt/DataStructures/TraktUserList.cs          |   47 +-
 .../Trakt/DataStructures/TraktUserListItem.cs      |  875 ++++---
 .../Trakt/Extension/DateTimeExtensions.cs          |   69 +
 .../Libraries/Trakt/Extension/JsonExtensions.cs    |   20 +-
 .../OnlineLibraries/Libraries/Trakt/TraktAPI.cs    | 2527 +++++++++++++-------
 .../OnlineLibraries/Libraries/Trakt/TraktLogger.cs |  245 +-
 .../Libraries/Trakt/TraktSettings.cs               |  234 +-
 .../OnlineLibraries/Libraries/Trakt/TraktURIs.cs   |  300 ++-
 .../OnlineLibraries/OnlineLibraries.csproj         |  109 +-
 30 files changed, 3183 insertions(+), 2070 deletions(-)

diff --git a/MediaPortal/Incubator/Login/LoginModel.cs b/MediaPortal/Incubator/Login/LoginModel.cs
index 4fad025..77ee235 100644
--- a/MediaPortal/Incubator/Login/LoginModel.cs
+++ b/MediaPortal/Incubator/Login/LoginModel.cs
@@ -132,7 +132,7 @@ namespace MediaPortal.UiComponents.Login
     /// </summary>
     public IUser CurrentUser
     {
-      get { return (IUser) _currentUser.GetValue(); }
+      get { return (IUser)_currentUser.GetValue(); }
       set { _currentUser.SetValue(value); }
     }
 
diff --git a/MediaPortal/Incubator/Trakt/Models/TraktSetupModel.cs b/MediaPortal/Incubator/Trakt/Models/TraktSetupModel.cs
index 6e67cd5..2880388 100644
--- a/MediaPortal/Incubator/Trakt/Models/TraktSetupModel.cs
+++ b/MediaPortal/Incubator/Trakt/Models/TraktSetupModel.cs
@@ -53,7 +53,7 @@ namespace MediaPortal.UiComponents.Trakt.Models
     public const string SERIES_BANNER_URL = "http://trakt.tv/user/{0}/widgets/watched/episode-thin-banner@2x.jpg";
     public const string MOVIES_BANNER_URL = "http://trakt.tv/user/{0}/widgets/watched/movie-thin-banner@2x.jpg";
 
-    public readonly static Guid TRAKT_SETUP_MODEL_ID = new Guid(TRAKT_SETUP_MODEL_ID_STR);
+    public static readonly Guid TRAKT_SETUP_MODEL_ID = new Guid(TRAKT_SETUP_MODEL_ID_STR);
 
     #endregion
 
@@ -221,23 +221,87 @@ namespace MediaPortal.UiComponents.Trakt.Models
           return false;
         }
         var movies = contentDirectory.Search(new MediaItemQuery(types, null, null), true);
-        TraktMovieSync syncData = new TraktMovieSync { UserName = Username, Password = Password, MovieList = new List<TraktMovieSync.Movie>() };
-        // First send all movies to Trakt that we have so they appear in library
-        foreach (var movie in movies)
-          syncData.MovieList.Add(ToMovie(movie));
-
-        TraktSyncModes traktSyncMode = TraktSyncModes.library;
-        var response = TraktAPI.SyncMovieLibrary(syncData, traktSyncMode);
-        ServiceRegistration.Get<ILogger>().Info("Trakt.tv: Movies '{0}': {1} inserted, {2} existing, {3} skipped movies.", traktSyncMode, response.Inserted, SafeCount(response.AlreadyExistMovies), SafeCount(response.SkippedMovies));
-
-        syncData.MovieList.Clear();
-        // Then send only the watched movies as "seen"
-        foreach (var movie in movies.Where(IsWatched))
-          syncData.MovieList.Add(ToMovie(movie));
-
-        traktSyncMode = TraktSyncModes.seen;
-        response = TraktAPI.SyncMovieLibrary(syncData, traktSyncMode);
-        ServiceRegistration.Get<ILogger>().Info("Trakt.tv: Movies '{0}': {1} inserted, {2} existing, {3} skipped movies.", traktSyncMode, response.Inserted, SafeCount(response.AlreadyExistMovies), SafeCount(response.SkippedMovies));
+
+        var syncCollectedMovies = movies.Select(movie => new TraktSyncMovieCollected
+        {
+          Ids = new TraktMovieId { Imdb = ToMovie(movie).Ids.Imdb, Tmdb = ToMovie(movie).Ids.Tmdb },
+          Title = ToMovie(movie).Title,
+          Year = ToMovie(movie).Year,
+          //TODO
+          //add "AudioChannels", "AudiCodec", etc...
+        }).ToList();
+
+        if (syncCollectedMovies.Count > 0)
+        {
+          //update cache
+          TraktCache.AddMoviesToCollection(syncCollectedMovies);
+          int pageSize = Extensions.OnlineLibraries.Libraries.Trakt.TraktSettings.SyncBatchSize;
+          int pages = (int)Math.Ceiling((double)syncCollectedMovies.Count / pageSize);
+          for (int i = 0; i < pages; i++)
+          {
+            var pagedMovies = syncCollectedMovies.Skip(i * pageSize).Take(pageSize).ToList();
+
+            // remove title/year such that match against online ID only
+            if (Extensions.OnlineLibraries.Libraries.Trakt.TraktSettings.SkipMoviesWithNoIdsOnSync)
+            {
+              pagedMovies.ForEach(m =>
+              {
+                m.Title = null;
+                m.Year = null;
+              });
+            }
+
+            var response = TraktAPI.AddMoviesToCollecton(new TraktSyncMoviesCollected { Movies = pagedMovies });
+
+            // remove movies from cache which didn't succeed
+            if (response != null && response.NotFound != null && response.NotFound.Movies.Count > 0)
+            {
+              TraktCache.RemoveMoviesFromCollection(response.NotFound.Movies);
+            }
+          }
+        }
+
+        // ServiceRegistration.Get<ILogger>().Info("Trakt.tv: Movies '{0}': {1} inserted, {2} existing, {3} skipped movies.", syncCollectedMovies, response.Inserted, SafeCount(response.AlreadyExistMovies), SafeCount(response.SkippedMovies));
+
+        var syncWatchedMovies = movies.Where(IsWatched).Select(movie => new TraktSyncMovieWatched
+        {
+          Ids = new TraktMovieId { Imdb = ToMovie(movie).Ids.Imdb, Tmdb = ToMovie(movie).Ids.Tmdb },
+          Title = ToMovie(movie).Title,
+          Year = ToMovie(movie).Year
+          // TODO
+          // add "watched add" 
+        }).ToList();
+
+        if (syncWatchedMovies.Count > 0)
+        {
+          // update internal cache
+          TraktCache.AddMoviesToWatchHistory(syncWatchedMovies);
+          int pageSize = Extensions.OnlineLibraries.Libraries.Trakt.TraktSettings.SyncBatchSize;
+          int pages = (int)Math.Ceiling((double)syncWatchedMovies.Count / pageSize);
+          for (int i = 0; i < pages; i++)
+          {
+            var pagedMovies = syncWatchedMovies.Skip(i * pageSize).Take(pageSize).ToList();
+            // remove title/year such that match against online ID only
+            if (Extensions.OnlineLibraries.Libraries.Trakt.TraktSettings.SkipMoviesWithNoIdsOnSync)
+            {
+              pagedMovies.ForEach(m =>
+              {
+                m.Title = null;
+                m.Year = null;
+              });
+            }
+
+            var response = TraktAPI.AddMoviesToWatchedHistory(new TraktSyncMoviesWatched { Movies = pagedMovies });
+
+            // remove movies from cache which didn't succeed
+            if (response != null && response.NotFound != null && response.NotFound.Movies.Count > 0)
+            {
+              TraktCache.RemoveMoviesFromWatchHistory(response.NotFound.Movies);
+            }
+          }
+        }
+
+        // ServiceRegistration.Get<ILogger>().Info("Trakt.tv: Movies '{0}': {1} inserted, {2} existing, {3} skipped movies.", traktSyncMode, response.Inserted, SafeCount(response.AlreadyExistMovies), SafeCount(response.SkippedMovies));
         return true;
       }
       catch (Exception ex)
@@ -358,24 +422,24 @@ namespace MediaPortal.UiComponents.Trakt.Models
       return list != null ? list.Count : 0;
     }
 
-    private TraktMovieSync.Movie ToMovie(MediaItem mediaItem)
+    private TraktMovie ToMovie(MediaItem mediaItem)
     {
       string value;
       int iValue;
-      DateTime dtValue;
+      int dtValue;
 
-      TraktMovieSync.Movie movie = new TraktMovieSync.Movie();
+      TraktMovie movie = new TraktMovie();
       if (MediaItemAspect.TryGetAttribute(mediaItem.Aspects, MovieAspect.ATTR_MOVIE_NAME, out value) && !string.IsNullOrWhiteSpace(value))
         movie.Title = value;
 
       if (MediaItemAspect.TryGetAttribute(mediaItem.Aspects, MovieAspect.ATTR_IMDB_ID, out value) && !string.IsNullOrWhiteSpace(value))
-        movie.IMDBID = value;
+        movie.Ids.Imdb = value;
 
       if (MediaItemAspect.TryGetAttribute(mediaItem.Aspects, MovieAspect.ATTR_TMDB_ID, out iValue) && iValue > 0)
-        movie.TMDBID = iValue.ToString();
+        movie.Ids.Tmdb = iValue;
 
       if (MediaItemAspect.TryGetAttribute(mediaItem.Aspects, MediaAspect.ATTR_RECORDINGTIME, out dtValue))
-        movie.Year = dtValue.Year.ToString();
+        movie.Year = dtValue;
 
       return movie;
     }
@@ -487,4 +551,4 @@ namespace MediaPortal.UiComponents.Trakt.Models
 
     #endregion
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Incubator/Trakt/Service/TraktHandler.cs b/MediaPortal/Incubator/Trakt/Service/TraktHandler.cs
index 5878d34..81122d4 100644
--- a/MediaPortal/Incubator/Trakt/Service/TraktHandler.cs
+++ b/MediaPortal/Incubator/Trakt/Service/TraktHandler.cs
@@ -39,6 +39,7 @@ using MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures;
 using MediaPortal.UI.Presentation.Players;
 using MediaPortal.UI.Presentation.Players.ResumeState;
 using MediaPortal.UI.Services.Players;
+using TraktSettings = MediaPortal.UiComponents.Trakt.Settings.TraktSettings;
 
 namespace MediaPortal.UiComponents.Trakt.Service
 {
@@ -57,7 +58,7 @@ namespace MediaPortal.UiComponents.Trakt.Service
 
     private AsynchronousMessageQueue _messageQueue;
     private readonly object _syncObj = new object();
-    private readonly SettingsChangeWatcher<Settings.TraktSettings> _settings = new SettingsChangeWatcher<Settings.TraktSettings>();
+    private readonly SettingsChangeWatcher<TraktSettings> _settings = new SettingsChangeWatcher<TraktSettings>();
     private readonly Dictionary<IPlayerSlotController, PositionWatcher> _progressUpdateWorks = new Dictionary<IPlayerSlotController, PositionWatcher>();
 
     public TraktHandler()
@@ -83,19 +84,19 @@ namespace MediaPortal.UiComponents.Trakt.Service
       }
     }
 
-    void SubscribeToMessages()
+    private void SubscribeToMessages()
     {
       if (_messageQueue != null)
         return;
       _messageQueue = new AsynchronousMessageQueue(this, new string[]
-        {
-           PlayerManagerMessaging.CHANNEL,
-        });
+      {
+        PlayerManagerMessaging.CHANNEL,
+      });
       _messageQueue.MessageReceived += OnMessageReceived;
       _messageQueue.Start();
     }
 
-    void UnsubscribeFromMessages()
+    private void UnsubscribeFromMessages()
     {
       if (_messageQueue == null)
         return;
@@ -103,7 +104,7 @@ namespace MediaPortal.UiComponents.Trakt.Service
       _messageQueue = null;
     }
 
-    void OnMessageReceived(AsynchronousMessageQueue queue, SystemMessage message)
+    private void OnMessageReceived(AsynchronousMessageQueue queue, SystemMessage message)
     {
       if (message.ChannelName == PlayerManagerMessaging.CHANNEL)
       {
@@ -160,7 +161,7 @@ namespace MediaPortal.UiComponents.Trakt.Service
 
           TraktMovieScrobble movie = scrobbleData as TraktMovieScrobble;
           if (movie != null)
-            TraktAPI.ScrobbleMovieState(movie, state);
+            TraktAPI.StartMovieScrobble(movie, state);
 
           TraktEpisodeScrobble episode = scrobbleData as TraktEpisodeScrobble;
           if (episode != null)
@@ -170,10 +171,10 @@ namespace MediaPortal.UiComponents.Trakt.Service
         if (removePsc)
           lock (_syncObj)
             _progressUpdateWorks.Remove(psc);
-
       }
       catch (ThreadAbortException)
-      { }
+      {
+      }
       catch (Exception ex)
       {
         ServiceRegistration.Get<ILogger>().Error("Trakt.tv: Exception while scrobbling", ex);
@@ -318,7 +319,7 @@ namespace MediaPortal.UiComponents.Trakt.Service
       if (!starting && progress < WATCHED_PERCENT)
         state = TraktScrobbleStates.cancelwatching;
 
-      scrobbleData.PluginVersion = TraktSettings.Version;
+      scrobbleData.PluginVersion = Extensions.OnlineLibraries.Libraries.Trakt.TraktSettings.Version;
       scrobbleData.MediaCenter = "MediaPortal 2";
       scrobbleData.MediaCenterVersion = Assembly.GetEntryAssembly().GetName().Version.ToString();
       scrobbleData.MediaCenterBuildDate = String.Empty;
@@ -333,4 +334,4 @@ namespace MediaPortal.UiComponents.Trakt.Service
       UnsubscribeFromMessages();
     }
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Incubator/Trakt/Trakt.csproj b/MediaPortal/Incubator/Trakt/Trakt.csproj
index 24e8e9d..2083d00 100644
--- a/MediaPortal/Incubator/Trakt/Trakt.csproj
+++ b/MediaPortal/Incubator/Trakt/Trakt.csproj
@@ -33,6 +33,7 @@
   <ItemGroup>
     <Reference Include="System" />
     <Reference Include="System.Core" />
+    <Reference Include="System.Runtime.Serialization" />
     <Reference Include="System.Xml.Linq" />
     <Reference Include="System.Data.DataSetExtensions" />
     <Reference Include="Microsoft.CSharp" />
@@ -45,6 +46,7 @@
     </Compile>
     <Compile Include="Models\TraktSetupModel.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="Service\TraktBasicHandler.cs" />
     <Compile Include="Service\TraktHandler.cs" />
     <Compile Include="Settings\Configuration\TraktSettingConfiguration.cs" />
     <Compile Include="Settings\TraktSettings.cs" />
diff --git a/MediaPortal/Resources/Settings/ReSharper/TeamMediaPortal.DotSettings b/MediaPortal/Resources/Settings/ReSharper/TeamMediaPortal.DotSettings
index f6ada1c..596faa9 100644
--- a/MediaPortal/Resources/Settings/ReSharper/TeamMediaPortal.DotSettings
+++ b/MediaPortal/Resources/Settings/ReSharper/TeamMediaPortal.DotSettings
@@ -59,7 +59,7 @@
 	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/INDENT_NESTED_FIXED_STMT/@EntryValue">False</s:Boolean>
 	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/INDENT_NESTED_USINGS_STMT/@EntryValue">False</s:Boolean>
 	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/INITIALIZER_BRACES/@EntryValue">NEXT_LINE</s:String>
-	<s:String x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/INVOCABLE_DECLARATION_BRACES/@EntryValue">NEXT_LINE</s:String>
+	
 	<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_BLANK_LINES_IN_CODE/@EntryValue">2</s:Int64>
 	<s:Int64 x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_BLANK_LINES_IN_DECLARATIONS/@EntryValue">2</s:Int64>
 	<s:Boolean x:Key="/Default/CodeStyle/CodeFormatting/CSharpFormat/KEEP_USER_LINEBREAKS/@EntryValue">True</s:Boolean>
@@ -227,4 +227,6 @@
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypeParameters/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="T" Suffix="" Style="AaBb" /&gt;</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypesAndNamespaces/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /&gt;</s:String>
 	<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=f3b4c4c3_002D5ae8_002D47fd_002D8cde_002D9a05099b24cb/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Instance" AccessRightKinds="Protected" Description=""&gt;&lt;ElementKinds&gt;&lt;Kind Name="FIELD" /&gt;&lt;Kind Name="READONLY_FIELD" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="_" Suffix="" Style="aaBb" /&gt;&lt;/Policy&gt;</s:String>
-	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
\ No newline at end of file
+	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EAddAccessorOwnerDeclarationBracesMigration/@EntryIndexedValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateBlankLinesAroundFieldToBlankLinesAroundProperty/@EntryIndexedValue">True</s:Boolean>
+	<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EMigrateThisQualifierSettings/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/MovieScrobbleAndMode.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/MovieScrobbleAndMode.cs
deleted file mode 100644
index e7e9655..0000000
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/MovieScrobbleAndMode.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-﻿namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
-{
-  /// <summary>
-  /// Class to pass scrobbling data and state to background worker
-  /// </summary>
-  class MovieScrobbleAndMode
-  {
-    public TraktMovieScrobble MovieScrobble { get; set; }
-    public TraktScrobbleStates ScrobbleState { get; set; }
-  }
-}
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/MovieSyncAndMode.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/MovieSyncAndMode.cs
deleted file mode 100644
index 5403ef3..0000000
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/MovieSyncAndMode.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-﻿namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
-{
-  /// <summary>
-  /// Class used to pass syncdata and sync mode to background worker
-  /// </summary>
-  class MovieSyncAndMode
-  {
-    public TraktMovieSync SyncData { get; set; }
-    public TraktSyncModes Mode { get; set; }
-  }
-}
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktAccount.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktAccount.cs
deleted file mode 100644
index e8fec97..0000000
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktAccount.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-﻿using System.Runtime.Serialization;
-
-namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
-{
-  [DataContract]
-  public class TraktAccount : TraktAuthentication
-  {
-    [DataMember(Name = "email")]
-    public string Email { get; set; }
-  }
-}
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktActivity.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktActivity.cs
index 276eca8..c5bd877 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktActivity.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktActivity.cs
@@ -27,27 +27,29 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
     public class Activity : IEquatable<Activity>
     {
       #region IEquatable
+
       public bool Equals(Activity other)
       {
         if (other == null)
           return false;
 
-        return (Id == other.Id && Type == other.Type);
+        return (this.Id == other.Id && this.Type == other.Type);
       }
 
       public override int GetHashCode()
       {
-        return (Id + "-" + Type).GetHashCode();
+        return (this.Id.ToString() + "-" + this.Type).GetHashCode();
       }
+
       #endregion
 
       [DataMember(Name = "id")]
       public long Id { get; set; }
 
       [DataMember(Name = "timestamp")]
-      public long Timestamp { get; set; }
+      public string Timestamp { get; set; }
 
-      [DataMember(Name = "when")]
+      [DataMember(Name = "when", EmitDefaultValue = false)]
       public TraktWhen When { get; set; }
 
       [DataContract]
@@ -60,7 +62,7 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
         public string Time { get; set; }
       }
 
-      [DataMember(Name = "elapsed")]
+      [DataMember(Name = "elapsed", EmitDefaultValue = false)]
       public TraktElapsed Elapsed { get; set; }
 
       [DataContract]
@@ -80,73 +82,40 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
       public string Action { get; set; }
 
       [DataMember(Name = "user")]
-      public TraktUser User { get; set; }
-
-      [DataMember(Name = "rating")]
-      public string Rating { get; set; }
+      public TraktUserSummary User { get; set; }
 
-      [DataMember(Name = "rating_advanced")]
-      public string RatingAdvanced { get; set; }
+      [DataMember(Name = "rating", EmitDefaultValue = false)]
+      public int Rating { get; set; }
 
-      [DataMember(Name = "use_rating_advanced")]
-      public bool UseRatingAdvanced { get; set; }
+      [DataMember(Name = "progress", EmitDefaultValue = false)]
+      public float Progress { get; set; }
 
-      [DataMember(Name = "episode")]
-      public TraktEpisode Episode { get; set; }
+      [DataMember(Name = "episode", EmitDefaultValue = false)]
+      public TraktEpisodeSummary Episode { get; set; }
 
-      [DataMember(Name = "episodes")]
-      public List<TraktEpisode> Episodes { get; set; }
+      [DataMember(Name = "episodes", EmitDefaultValue = false)]
+      public List<TraktEpisodeSummary> Episodes { get; set; }
 
-      [DataMember(Name = "show")]
-      public TraktShow Show { get; set; }
+      [DataMember(Name = "show", EmitDefaultValue = false)]
+      public TraktShowSummary Show { get; set; }
 
-      [DataMember(Name = "movie")]
-      public TraktMovie Movie { get; set; }
+      [DataMember(Name = "season", EmitDefaultValue = false)]
+      public TraktSeasonSummary Season { get; set; }
 
-      [DataMember(Name = "review")]
-      public Activity.TraktShout Review { get; set; }
+      [DataMember(Name = "movie", EmitDefaultValue = false)]
+      public TraktMovieSummary Movie { get; set; }
 
-      [DataMember(Name = "shout")]
-      public TraktShout Shout { get; set; }
+      [DataMember(Name = "shout", EmitDefaultValue = false)]
+      public TraktComment Shout { get; set; }
 
-      [DataContract]
-      public class TraktShout
-      {
-        [DataMember(Name = "id")]
-        public long Id { get; set; }
-
-        [DataMember(Name = "text")]
-        public string Text { get; set; }
-
-        [DataMember(Name = "text_html")]
-        public string TextHTML { get; set; }
-
-        [DataMember(Name = "spoiler")]
-        public bool Spoiler { get; set; }
-      }
+      [DataMember(Name = "list", EmitDefaultValue = false)]
+      public TraktListDetail List { get; set; }
 
-      [DataMember(Name = "list")]
-      public TraktList List { get; set; }
-
-      [DataMember(Name = "list_item")]
+      [DataMember(Name = "list_item", EmitDefaultValue = false)]
       public TraktListItem ListItem { get; set; }
 
-      [DataContract]
-      public class TraktListItem
-      {
-        [DataMember(Name = "type")]
-        public string Type { get; set; }
-
-        [DataMember(Name = "show")]
-        public TraktShow Show { get; set; }
-
-        [DataMember(Name = "movie")]
-        public TraktMovie Movie { get; set; }
-
-        [DataMember(Name = "episode")]
-        public TraktEpisode Episode { get; set; }
-      }
+      [DataMember(Name = "person", EmitDefaultValue = false)]
+      public TraktPersonSummary Person { get; set; }
     }
-
   }
 }
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktCalendar.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktCalendar.cs
index e0cb518..3174d17 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktCalendar.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktCalendar.cs
@@ -1,15 +1,11 @@
-﻿using System.Collections.Generic;
-using System.Runtime.Serialization;
+﻿using System.Runtime.Serialization;
 
 namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
 {
   [DataContract]
-  public class TraktCalendar : TraktResponse
+  public class TraktCalendar : TraktEpisodeSummaryEx
   {
-    [DataMember(Name = "date")]
-    public string Date { get; set; }
-
-    [DataMember(Name = "episodes")]
-    public List<TraktEpisodeSummary> Episodes { get; set; }
+    [DataMember(Name = "airs_at")]
+    public string AirsAt { get; set; }
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktEpisode.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktEpisode.cs
index cdb617d..7b20b15 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktEpisode.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktEpisode.cs
@@ -14,62 +14,7 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
     [DataMember(Name = "title")]
     public string Title { get; set; }
 
-    [DataMember(Name = "tvdb_id")]
-    public int TVDbID { get; set; }
-
-    [DataMember(Name = "imdb_id")]
-    public string IMDbID { get; set; }
-
-    [DataMember(Name = "overview")]
-    public string Overview { get; set; }
-
-    [DataMember(Name = "url")]
-    public string Url { get; set; }
-
-    [DataMember(Name = "first_aired")]
-    public long FirstAired { get; set; }
-
-    [DataMember(Name = "first_aired_utc")]
-    public long FirstAiredUtc { get; set; }
-
-    [DataMember(Name = "first_aired_iso")]
-    public string FirstAiredIso { get; set; }
-
-    [DataMember(Name = "first_aired_localized")]
-    public long FirstAiredLocalized { get; set; }
-
-    [DataMember(Name = "runtime")]
-    public int Runtime { get; set; }
-
-    [DataMember(Name = "in_watchlist")]
-    public bool InWatchList { get; set; }
-
-    [DataMember(Name = "in_collection")]
-    public bool InCollection { get; set; }
-
-    [DataMember(Name = "watched")]
-    public bool Watched { get; set; }
-
-    [DataMember(Name = "plays")]
-    public int Plays { get; set; }
-
-    [DataMember(Name = "rating")]
-    public string Rating { get; set; }
-
-    [DataMember(Name = "rating_advanced")]
-    public int RatingAdvanced { get; set; }
-
-    [DataMember(Name = "ratings")]
-    public TraktRatings Ratings { get; set; }
-
-    [DataMember(Name = "images")]
-    public ShowImages Images { get; set; }
-
-    [DataContract]
-    public class ShowImages
-    {
-      [DataMember(Name = "screen")]
-      public string Screen { get; set; }
-    }
+    [DataMember(Name = "ids")]
+    public TraktEpisodeId Ids { get; set; }
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktEpisodeSummary.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktEpisodeSummary.cs
index 55b3518..1d7899a 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktEpisodeSummary.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktEpisodeSummary.cs
@@ -1,19 +1,33 @@
-﻿using System.Runtime.Serialization;
+﻿using System.Collections.Generic;
+using System.Runtime.Serialization;
 
 namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
 {
-  [DataContract]
-  public class TraktEpisodeSummary
-  {
-    [DataMember(Name = "show")]
-    public TraktShow Show { get; set; }
+    [DataContract]
+    public class TraktEpisodeSummary : TraktEpisode
+    {
+        [DataMember(Name = "images")]
+        public TraktEpisodeImages Images { get; set; }
 
-    [DataMember(Name = "episode")]
-    public TraktEpisode Episode { get; set; }
+        [DataMember(Name = "number_abs")]
+        public int? AbsoluteNumber { get; set; }
 
-    public override string ToString()
-    {
-      return string.Format("{0} - {1}x{2}{3}", Show.Title, Episode.Season, Episode.Number, string.IsNullOrEmpty(Episode.Title) ? string.Empty : " - " + Episode.Title);
+        [DataMember(Name = "first_aired")]
+        public string FirstAired { get; set; }
+
+        [DataMember(Name = "updated_at")]
+        public string UpdatedAt { get; set; }
+
+        [DataMember(Name = "overview")]
+        public string Overview { get; set; }
+
+        [DataMember(Name = "rating")]
+        public double? Rating { get; set; }
+
+        [DataMember(Name = "votes")]
+        public int Votes { get; set; }
+
+        [DataMember(Name = "available_translations")]
+        public List<string> AvailableTranslations { get; set; }
     }
-  }
 }
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktListItem.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktListItem.cs
index b378de9..63f62b4 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktListItem.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktListItem.cs
@@ -5,29 +5,25 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
   [DataContract]
   public class TraktListItem
   {
+    [DataMember(Name = "listed_at")]
+    public string ListedAt { get; set; }
+
     [DataMember(Name = "type")]
     public string Type { get; set; }
 
-    [DataMember(Name = "title")]
-    public string Title { get; set; }
-
-    #region Movies
-    [DataMember(Name = "imdb_id")]
-    public string ImdbId { get; set; }
+    [DataMember(Name = "movie")]
+    public TraktMovieSummary Movie { get; set; }
 
-    [DataMember(Name = "year")]
-    public int Year { get; set; }
-    #endregion
-
-    #region Shows/Episodes
-    [DataMember(Name = "tvdb_id")]
-    public string TvdbId { get; set; }
+    [DataMember(Name = "show")]
+    public TraktShowSummary Show { get; set; }
 
     [DataMember(Name = "season")]
-    public int Season { get; set; }
+    public TraktSeasonSummary Season { get; set; }
 
     [DataMember(Name = "episode")]
-    public int Episode { get; set; }
-    #endregion
+    public TraktEpisodeSummary Episode { get; set; }
+
+    [DataMember(Name = "person")]
+    public TraktPersonSummary Person { get; set; }
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktMovie.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktMovie.cs
index fb158ee..1f11c27 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktMovie.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktMovie.cs
@@ -1,70 +1,17 @@
-﻿using System.Collections.Generic;
-using System.Runtime.Serialization;
+﻿using System.Runtime.Serialization;
 
 namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
 {
   [DataContract]
-  public class TraktMovie : TraktMovieBase
+  public class TraktMovie
   {
-    [DataMember(Name = "certification")]
-    public string Certification { get; set; }
+    [DataMember(Name = "title", EmitDefaultValue = false)]
+    public string Title { get; set; }
 
-    [DataMember(Name = "overview")]
-    public string Overview { get; set; }
+    [DataMember(Name = "year", EmitDefaultValue = false)]
+    public int? Year { get; set; }
 
-    [DataMember(Name = "released")]
-    public long Released { get; set; }
-
-    [DataMember(Name = "runtime")]
-    public int Runtime { get; set; }
-
-    [DataMember(Name = "tagline")]
-    public string Tagline { get; set; }
-
-    [DataMember(Name = "rt_id")]
-    public string RtId { get; set; }
-
-    [DataMember(Name = "trailer")]
-    public string Trailer { get; set; }
-
-    [DataMember(Name = "url")]
-    public string Url { get; set; }
-
-    [DataMember(Name = "plays")]
-    public int Plays { get; set; }
-
-    [DataMember(Name = "watched")]
-    public bool Watched { get; set; }
-
-    [DataMember(Name = "in_collection")]
-    public bool InCollection { get; set; }
-
-    [DataMember(Name = "in_watchlist")]
-    public bool InWatchList { get; set; }
-
-    [DataMember(Name = "rating")]
-    public string Rating { get; set; }
-
-    [DataMember(Name = "rating_advanced")]
-    public int RatingAdvanced { get; set; }
-
-    [DataMember(Name = "ratings")]
-    public TraktRatings Ratings { get; set; }
-
-    [DataMember(Name = "genres")]
-    public List<string> Genres { get; set; }
-
-    [DataMember(Name = "images")]
-    public MovieImages Images { get; set; }
-
-    [DataContract]
-    public class MovieImages
-    {
-      [DataMember(Name = "fanart")]
-      public string Fanart { get; set; }
-
-      [DataMember(Name = "poster")]
-      public string Poster { get; set; }
-    }
+    [DataMember(Name = "ids")]
+    public TraktMovieId Ids { get; set; }
   }
 }
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktMovieSummary.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktMovieSummary.cs
index 895f331..865f04e 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktMovieSummary.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktMovieSummary.cs
@@ -6,16 +6,46 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
   [DataContract]
   public class TraktMovieSummary : TraktMovie
   {
-    [DataMember(Name = "last_updated")]
-    public long LastUpdated { get; set; }
+    [DataMember(Name = "images")]
+    public TraktMovieImages Images { get; set; }
 
-    [DataMember(Name = "people")]
-    public TraktPeople People { get; set; }
+    [DataMember(Name = "tagline")]
+    public string Tagline { get; set; }
 
-    [DataMember(Name = "stats")]
-    public TraktStatistics Stats { get; set; }
+    [DataMember(Name = "overview")]
+    public string Overview { get; set; }
 
-    [DataMember(Name = "top_watchers")]
-    public List<TraktTopWatcher> TopWatchers { get; set; }
+    [DataMember(Name = "released")]
+    public string Released { get; set; }
+
+    [DataMember(Name = "runtime")]
+    public int? Runtime { get; set; }
+
+    [DataMember(Name = "trailer")]
+    public string Trailer { get; set; }
+
+    [DataMember(Name = "updated_at")]
+    public string UpdatedAt { get; set; }
+
+    [DataMember(Name = "homepage")]
+    public string Homepage { get; set; }
+
+    [DataMember(Name = "certification")]
+    public string Certification { get; set; }
+
+    [DataMember(Name = "rating")]
+    public double? Rating { get; set; }
+
+    [DataMember(Name = "votes")]
+    public int Votes { get; set; }
+
+    [DataMember(Name = "language")]
+    public string Language { get; set; }
+
+    [DataMember(Name = "available_translations")]
+    public List<string> AvailableTranslations { get; set; }
+
+    [DataMember(Name = "genres")]
+    public List<string> Genres { get; set; }
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktPerson.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktPerson.cs
index d25f082..99f2d3c 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktPerson.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktPerson.cs
@@ -8,14 +8,7 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
     [DataMember(Name = "name")]
     public string Name { get; set; }
 
-    [DataMember(Name = "images")]
-    public PersonImages Images { get; set; }
-
-    [DataContract]
-    public class PersonImages
-    {
-      [DataMember(Name = "headshot")]
-      public string Headshot { get; set; }
-    }
+    [DataMember(Name = "ids")]
+    public TraktPersonId Ids { get; set; }
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShow.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShow.cs
index 1f3bc4c..9049937 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShow.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShow.cs
@@ -1,5 +1,4 @@
-﻿using System.Collections.Generic;
-using System.Runtime.Serialization;
+﻿using System.Runtime.Serialization;
 
 namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
 {
@@ -10,100 +9,9 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
     public string Title { get; set; }
 
     [DataMember(Name = "year")]
-    public int Year { get; set; }
+    public int? Year { get; set; }
 
-    [DataMember(Name = "url")]
-    public string Url { get; set; }
-
-    [DataMember(Name = "first_aired")]
-    public long FirstAired { get; set; }
-
-    [DataMember(Name = "first_aired_iso")]
-    public string FirstAiredIso { get; set; }
-
-    [DataMember(Name = "first_aired_utc")]
-    public long FirstAiredUtc { get; set; }
-
-    [DataMember(Name = "country")]
-    public string Country { get; set; }
-
-    [DataMember(Name = "overview")]
-    public string Overview { get; set; }
-
-    [DataMember(Name = "runtime")]
-    public int Runtime { get; set; }
-
-    [DataMember(Name = "network")]
-    public string Network { get; set; }
-
-    [DataMember(Name = "air_day")]
-    public string AirDay { get; set; }
-
-    [DataMember(Name = "air_day_utc")]
-    public string AirDayUtc { get; set; }
-
-    [DataMember(Name = "air_time")]
-    public string AirTime { get; set; }
-
-    [DataMember(Name = "air_time_utc")]
-    public string AirTimeUtc { get; set; }
-
-    [DataMember(Name = "air_time_localized")]
-    public string AirTimeLocalized { get; set; }
-
-    [DataMember(Name = "certification")]
-    public string Certification { get; set; }
-
-    [DataMember(Name = "status")]
-    public string Status { get; set; }
-
-    [DataMember(Name = "imdb_id")]
-    public string Imdb { get; set; }
-
-    [DataMember(Name = "tvdb_id")]
-    public string Tvdb { get; set; }
-
-    [DataMember(Name = "tvrage_id")]
-    public string TvRage { get; set; }
-
-    [DataMember(Name = "in_watchlist")]
-    public bool InWatchList { get; set; }
-
-    [DataMember(Name = "watched")]
-    public bool Watched { get; set; }
-
-    [DataMember(Name = "plays")]
-    public int Plays { get; set; }
-
-    [DataMember(Name = "rating")]
-    public string Rating { get; set; }
-
-    [DataMember(Name = "rating_advanced")]
-    public int RatingAdvanced { get; set; }
-
-    [DataMember(Name = "ratings")]
-    public TraktRatings Ratings { get; set; }
-
-    [DataMember(Name = "genres")]
-    public List<string> Genres { get; set; }
-
-    [DataMember(Name = "images")]
-    public ShowImages Images { get; set; }
-
-    [DataContract]
-    public class ShowImages
-    {
-      [DataMember(Name = "fanart")]
-      public string Fanart { get; set; }
-
-      [DataMember(Name = "poster")]
-      public string Poster { get; set; }
-
-      [DataMember(Name = "banner")]
-      public string Banner { get; set; }
-
-      [DataMember(Name = "season")]
-      public string Season { get; set; }
-    }
+    [DataMember(Name = "ids")]
+    public TraktShowId Ids { get; set; }
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShowSeason.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShowSeason.cs
deleted file mode 100644
index 694f128..0000000
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShowSeason.cs
+++ /dev/null
@@ -1,39 +0,0 @@
-﻿using System.Collections.Generic;
-using System.Runtime.Serialization;
-
-namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
-{
-  [DataContract]
-  public class TraktSeason
-  {
-    [DataMember(Name = "season")]
-    public int Season { get; set; }
-
-    [DataMember(Name = "url")]
-    public string Url { get; set; }
-
-    [DataMember(Name = "images")]
-    public SeasonImages Images { get; set; }
-
-    [DataContract]
-    public class SeasonImages
-    {
-      [DataMember(Name = "poster")]
-      public string Poster { get; set; }
-    }
-  }
-
-  [DataContract]
-  public class TraktShowSeason : TraktSeason
-  {
-    [DataMember(Name = "episodes")]
-    public int EpisodeCount { get; set; }
-  }
-
-  [DataContract]
-  public class TraktShowSeasonEx : TraktSeason
-  {
-    [DataMember(Name = "episodes")]
-    public List<TraktEpisode> Episodes { get; set; }
-  }
-}
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShowSummary.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShowSummary.cs
index 42ff751..db2ae46 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShowSummary.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktShowSummary.cs
@@ -6,22 +6,71 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
   [DataContract]
   public class TraktShowSummary : TraktShow
   {
-    [DataMember(Name = "last_updated")]
-    public long LastUpdated { get; set; }
+    [DataMember(Name = "images")]
+    public TraktShowImages Images { get; set; }
 
-    [DataMember(Name = "people")]
-    public TraktPeople People { get; set; }
+    [DataMember(Name = "first_aired")]
+    public string FirstAired { get; set; }
 
-    [DataMember(Name = "stats")]
-    public TraktStatistics Stats { get; set; }
+    [DataMember(Name = "airs")]
+    public AirDate Airs { get; set; }
 
-    [DataMember(Name = "top_episodes")]
-    public List<TraktEpisode> TopEpisodes { get; set; }
+    [DataMember(Name = "runtime")]
+    public int? Runtime { get; set; }
 
-    [DataMember(Name = "top_watchers")]
-    public List<TraktTopWatcher> TopWatchers { get; set; }
+    [DataMember(Name = "certification")]
+    public string Certification { get; set; }
 
-    [DataMember(Name = "seasons")]
-    public List<TraktShowSeasonEx> Seasons { get; set; }
+    [DataMember(Name = "network")]
+    public string Network { get; set; }
+
+    [DataMember(Name = "country")]
+    public string Country { get; set; }
+
+    [DataMember(Name = "updated_at")]
+    public string UpdatedAt { get; set; }
+
+    [DataMember(Name = "overview")]
+    public string Overview { get; set; }
+
+    [DataMember(Name = "trailer")]
+    public string Trailer { get; set; }
+
+    [DataMember(Name = "homepage")]
+    public string Homepage { get; set; }
+
+    [DataMember(Name = "status")]
+    public string Status { get; set; }
+
+    [DataMember(Name = "rating")]
+    public double? Rating { get; set; }
+
+    [DataMember(Name = "votes")]
+    public int Votes { get; set; }
+
+    [DataMember(Name = "language")]
+    public string Language { get; set; }
+
+    [DataMember(Name = "available_translations")]
+    public List<string> AvailableTranslations { get; set; }
+
+    [DataMember(Name = "genres")]
+    public List<string> Genres { get; set; }
+
+    [DataMember(Name = "aired_episodes")]
+    public int AiredEpisodes { get; set; }
+
+    [DataContract]
+    public class AirDate
+    {
+      [DataMember(Name = "day")]
+      public string Day { get; set; }
+
+      [DataMember(Name = "time")]
+      public string Time { get; set; }
+
+      [DataMember(Name = "timezone")]
+      public string Timezone { get; set; }
+    }
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktSyncMovieResponse.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktSyncMovieResponse.cs
index 8784bff..a6af3b8 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktSyncMovieResponse.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktSyncMovieResponse.cs
@@ -1,24 +1,21 @@
-﻿using System.Collections.Generic;
-using System.Runtime.Serialization;
-
-namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
+﻿namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
 {
-  [DataContract]
-  public class TraktSyncResponse : TraktResponse
-  {
-    [DataMember(Name = "inserted")]
-    public string Inserted { get; set; }
+  //[DataContract]
+  //public class TraktSyncResponse : TraktResponse
+  //{
+  //  [DataMember(Name = "inserted")]
+  //  public string Inserted { get; set; }
 
-    [DataMember(Name = "already_exist")]
-    public string AlreadyExist { get; set; }
+  //  [DataMember(Name = "already_exist")]
+  //  public string AlreadyExist { get; set; }
 
-    [DataMember(Name = "skipped")]
-    public string Skipped { get; set; }
+  //  [DataMember(Name = "skipped")]
+  //  public string Skipped { get; set; }
 
-    [DataMember(Name = "skipped_movies")]
-    public List<TraktMovieSync.Movie> SkippedMovies { get; set; }
+  //  [DataMember(Name = "skipped_movies")]
+  //  public List<TraktMovieSync.Movie> SkippedMovies { get; set; }
 
-    [DataMember(Name = "already_exist_movies")]
-    public List<TraktMovieSync.Movie> AlreadyExistMovies { get; set; }
-  }
-}
+  //  [DataMember(Name = "already_exist_movies")]
+  //  public List<TraktMovieSync.Movie> AlreadyExistMovies { get; set; }
+  //}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUser.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUser.cs
index fe7ad45..d143eb3 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUser.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUser.cs
@@ -8,34 +8,16 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
     [DataMember(Name = "username")]
     public string Username { get; set; }
 
-    [DataMember(Name = "protected")]
-    public bool Protected { get; set; }
-
-    [DataMember(Name = "full_name")]
+    [DataMember(Name = "name")]
     public string FullName { get; set; }
 
-    [DataMember(Name = "gender")]
-    public string Gender { get; set; }
-
-    [DataMember(Name = "age")]
-    public string Age { get; set; }
-
-    [DataMember(Name = "location")]
-    public string Location { get; set; }
-
-    [DataMember(Name = "about")]
-    public string About { get; set; }
-
-    [DataMember(Name = "joined")]
-    public long JoinDate { get; set; }
-
-    [DataMember(Name = "avatar")]
-    public string Avatar { get; set; }
+    [DataMember(Name = "vip")]
+    public bool IsVip { get; set; }
 
-    [DataMember(Name = "url")]
-    public string Url { get; set; }
+    [DataMember(Name = "vip_ep")]
+    public bool IsVipEP { get; set; }
 
-    [DataMember(Name = "vip")]
-    public bool VIP { get; set; }
+    [DataMember(Name = "private")]
+    public bool IsPrivate { get; set; }
   }
 }
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUserList.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUserList.cs
index 2b18a61..f9a61eb 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUserList.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUserList.cs
@@ -1,35 +1,32 @@
-﻿using System.Collections.Generic;
-using System.Runtime.Serialization;
-
-namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
+﻿namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
 {
-  [DataContract]
-  public class TraktUserList
-  {
-    [DataMember(Name = "name")]
-    public string Name { get; set; }
+  //[DataContract]
+  //public class TraktUserList
+  //{
+  //  [DataMember(Name = "name")]
+  //  public string Name { get; set; }
 
-    [DataMember(Name = "slug")]
-    public string Slug { get; set; }
+  //  [DataMember(Name = "slug")]
+  //  public string Slug { get; set; }
 
-    [DataMember(Name = "url")]
-    public string Url { get; set; }
+  //  [DataMember(Name = "url")]
+  //  public string Url { get; set; }
 
-    [DataMember(Name = "description")]
-    public string Description { get; set; }
+  //  [DataMember(Name = "description")]
+  //  public string Description { get; set; }
 
-    [DataMember(Name = "privacy")]
-    public string Privacy { get; set; }
+  //  [DataMember(Name = "privacy")]
+  //  public string Privacy { get; set; }
 
-    [DataMember(Name = "show_numbers")]
-    public bool ShowNumbers { get; set; }
+  //  [DataMember(Name = "show_numbers")]
+  //  public bool ShowNumbers { get; set; }
 
-    [DataMember(Name = "allow_shouts")]
-    public bool AllowShouts { get; set; }
+  //  [DataMember(Name = "allow_shouts")]
+  //  public bool AllowShouts { get; set; }
 
-    [DataMember(Name = "items")]
-    public List<TraktUserListItem> Items { get; set; }
+  //  [DataMember(Name = "items")]
+  //  public List<TraktUserListItem> Items { get; set; }
 
-    public int SortOrder { get; set; }
-  }
+  //  public int SortOrder { get; set; }
+  //}
 }
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUserListItem.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUserListItem.cs
index 9313b3c..08bf6c0 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUserListItem.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/DataStructures/TraktUserListItem.cs
@@ -1,441 +1,438 @@
-﻿using System;
-using System.Runtime.Serialization;
-
-namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
+﻿namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures
 {
-  [DataContract]
-  public class TraktUserListItem
-  {
-    [DataMember(Name = "type")]
-    public string Type { get; set; }
-
-    [DataMember(Name = "movie")]
-    public TraktMovie Movie { get; set; }
-
-    [DataMember(Name = "show")]
-    public TraktShow Show { get; set; }
-
-    [DataMember(Name = "episode")]
-    public TraktEpisode Episode { get; set; }
-
-    /// <summary>
-    /// all the authentication properties (plays, watched etc) are not correctly set 
-    /// for each corresponding type (movie,show,episode)...this has been reported
-    /// we can workaround this for now. They are currently only set on the root item
-    /// </summary>
-
-    #region Helpers
-
-    public TraktRatings Ratings
-    {
-      get
-      {
-        TraktRatings retValue = null;
-
-        switch (Type)
-        {
-          case "movie":
-            retValue = Movie.Ratings;
-            break;
-
-          case "show":
-          case "season":
-            retValue = Show.Ratings;
-            break;
-          case "episode":
-            retValue = Episode.Ratings;
-            break;
-        }
-        return retValue;
-      }
-      set
-      {
-        switch (Type)
-        {
-          case "movie":
-            Movie.Ratings = value;
-            break;
-
-          case "show":
-          case "season":
-            Show.Ratings = value;
-            break;
-          case "episode":
-            Episode.Ratings = value;
-            break;
-        }
-      }
-    }
-
-    [DataMember(Name = "rating")]
-    public string Rating
-    {
-      get
-      {
-        string retValue = "false";
-
-        switch (Type)
-        {
-          case "movie":
-            retValue = Movie.Rating;
-            break;
-
-          case "show":
-          case "season":
-            retValue = Show.Rating;
-            break;
-          case "episode":
-            retValue = Episode.Rating;
-            break;
-        }
-        return retValue;
-      }
-      set
-      {
-        switch (Type)
-        {
-          case "movie":
-            Movie.Rating = value;
-            break;
-
-          case "show":
-          case "season":
-            Show.Rating = value;
-            break;
-          case "episode":
-            Episode.Rating = value;
-            break;
-        }
-      }
-    }
-
-    [DataMember(Name = "rating_advanced")]
-    public int RatingAdvanced
-    {
-      get
-      {
-        int retValue = 0;
-
-        switch (Type)
-        {
-          case "movie":
-            retValue = Movie.RatingAdvanced;
-            break;
-
-          case "show":
-          case "season":
-            retValue = Show.RatingAdvanced;
-            break;
-          case "episode":
-            retValue = Episode.RatingAdvanced;
-            break;
-        }
-        return retValue;
-      }
-      set
-      {
-        switch (Type)
-        {
-          case "movie":
-            Movie.RatingAdvanced = value;
-            break;
-
-          case "show":
-          case "season":
-            Show.RatingAdvanced = value;
-            break;
-          case "episode":
-            Episode.RatingAdvanced = value;
-            break;
-        }
-      }
-    }
-
-    [DataMember(Name = "plays")]
-    public int Plays
-    {
-      get
-      {
-        int retValue = 0;
-
-        switch (Type)
-        {
-          case "movie":
-            retValue = Movie.Plays;
-            break;
-
-          case "show":
-            retValue = Show.Plays;
-            break;
-
-          case "season":
-            retValue = _plays;
-            break;
-          case "episode":
-            retValue = Episode.Plays;
-            break;
-        }
-        return retValue;
-      }
-      set
-      {
-        switch (Type)
-        {
-          case "movie":
-            Movie.Plays = value;
-            break;
-
-          case "show":
-            Show.Plays = value;
-            break;
-
-          case "season":
-            _plays = value;
-            break;
-
-          case "episode":
-            Episode.Plays = value;
-            break;
-        }
-      }
-    } int _plays;
-
-    [DataMember(Name = "watched")]
-    public bool Watched
-    {
-      get
-      {
-        bool retValue = false;
-
-        switch (Type)
-        {
-          case "movie":
-            retValue = Movie.Watched;
-            break;
-
-          case "show":
-            retValue = Show.Watched;
-            break;
-
-          case "season":
-            retValue = _watched;
-            break;
-
-          case "episode":
-            retValue = Episode.Watched;
-            break;
-        }
-        return retValue;
-      }
-      set
-      {
-        switch (Type)
-        {
-          case "movie":
-            Movie.Watched = value;
-            break;
-
-          case "show":
-            Show.Watched = value;
-            break;
-
-          case "season":
-            _watched = value;
-            break;
-
-          case "episode":
-            Episode.Watched = value;
-            break;
-        }
-      }
-    } bool _watched;
-
-    [DataMember(Name = "in_collection")]
-    public bool InCollection
-    {
-      get
-      {
-        bool retValue = false;
-
-        switch (Type)
-        {
-          case "movie":
-            retValue = Movie.InCollection;
-            break;
-
-          case "show":
-          case "season":
-            retValue = _incollection;
-            break;
-          case "episode":
-            retValue = Episode.InCollection;
-            break;
-        }
-        return retValue;
-      }
-      set
-      {
-        switch (Type)
-        {
-          case "movie":
-            Movie.InCollection = value;
-            break;
-
-          case "show":
-          case "season":
-            _incollection = value;
-            break;
-          case "episode":
-            Episode.InCollection = value;
-            break;
-        }
-      }
-    } bool _incollection;
-
-    [DataMember(Name = "in_watchlist")]
-    public bool InWatchList
-    {
-      get
-      {
-        bool retValue = false;
-
-        switch (Type)
-        {
-          case "movie":
-            retValue = Movie.InWatchList;
-            break;
-
-          case "show":
-          case "season":
-            retValue = _inwatchlist;
-            break;
-          case "episode":
-            retValue = Episode.InWatchList;
-            break;
-        }
-        return retValue;
-      }
-      set
-      {
-        switch (Type)
-        {
-          case "movie":
-            Movie.InWatchList = value;
-            break;
-
-          case "show":
-          case "season":
-            _inwatchlist = value;
-            break;
-          case "episode":
-            Episode.InWatchList = value;
-            break;
-        }
-      }
-    } bool _inwatchlist;
-
-    [DataMember(Name = "episode_num")]
-    public string EpisodeNumber
-    {
-      get
-      {
-        return _episodeNumber;
-      }
-      set
-      {
-        if (Type == "episode")
-        {
-          Episode = Episode ?? new TraktEpisode();
-          Episode.Number = Convert.ToInt32(value);
-        }
-        _episodeNumber = value;
-      }
-    } string _episodeNumber = null;
-
-    [DataMember(Name = "season")]
-    public string SeasonNumber
-    {
-      get
-      {
-        return _season;
-      }
-      set
-      {
-        if (Type == "episode")
-        {
-          Episode = Episode ?? new TraktEpisode();
-          Episode.Season = Convert.ToInt32(value);
-        }
-        _season = value;
-      }
-    } string _season = null;
-
-    public string Year
-    {
-      get
-      {
-        string retValue = string.Empty;
-
-        switch (Type)
-        {
-          case "movie":
-            retValue = Movie.Year;
-            break;
-
-          case "show":
-          case "season":
-          case "episode":
-            retValue = Show.Year.ToString();
-            break;
-        }
-        return retValue;
-      }
-    }
-
-    public string Title
-    {
-      get
-      {
-        string retValue = string.Empty;
-
-        switch (Type)
-        {
-          case "movie":
-            retValue = Movie.Title;
-            break;
-
-          case "show":
-          case "season":
-          case "episode":
-            retValue = Show.Title;
-            break;
-        }
-        return retValue;
-      }
-    }
-
-    public string ImdbId
-    {
-      get
-      {
-        string retValue = string.Empty;
-
-        switch (Type)
-        {
-          case "movie":
-            retValue = Movie.IMDBID;
-            break;
-
-          case "show":
-          case "season":
-          case "episode":
-            retValue = Show.Imdb;
-            break;
-        }
-        return retValue;
-      }
-    }
-
-    #endregion
-  }
+  //[DataContract]
+  //public class TraktUserListItem
+  //{
+  //  [DataMember(Name = "type")]
+  //  public string Type { get; set; }
+
+  //  [DataMember(Name = "movie")]
+  //  public TraktMovie Movie { get; set; }
+
+  //  [DataMember(Name = "show")]
+  //  public TraktShow Show { get; set; }
+
+  //  [DataMember(Name = "episode")]
+  //  public TraktEpisode Episode { get; set; }
+
+  //  /// <summary>
+  //  /// all the authentication properties (plays, watched etc) are not correctly set 
+  //  /// for each corresponding type (movie,show,episode)...this has been reported
+  //  /// we can workaround this for now. They are currently only set on the root item
+  //  /// </summary>
+
+  //  #region Helpers
+
+  //  public TraktRatings Ratings
+  //  {
+  //    get
+  //    {
+  //      TraktRatings retValue = null;
+
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          retValue = Movie.Ratings;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //          retValue = Show.Ratings;
+  //          break;
+  //        case "episode":
+  //          retValue = Episode.Ratings;
+  //          break;
+  //      }
+  //      return retValue;
+  //    }
+  //    set
+  //    {
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          Movie.Ratings = value;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //          Show.Ratings = value;
+  //          break;
+  //        case "episode":
+  //          Episode.Ratings = value;
+  //          break;
+  //      }
+  //    }
+  //  }
+
+  //  [DataMember(Name = "rating")]
+  //  public string Rating
+  //  {
+  //    get
+  //    {
+  //      string retValue = "false";
+
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          retValue = Movie.Rating;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //          retValue = Show.Rating;
+  //          break;
+  //        case "episode":
+  //          retValue = Episode.Rating;
+  //          break;
+  //      }
+  //      return retValue;
+  //    }
+  //    set
+  //    {
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          Movie.Rating = value;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //          Show.Rating = value;
+  //          break;
+  //        case "episode":
+  //          Episode.Rating = value;
+  //          break;
+  //      }
+  //    }
+  //  }
+
+  //  [DataMember(Name = "rating_advanced")]
+  //  public int RatingAdvanced
+  //  {
+  //    get
+  //    {
+  //      int retValue = 0;
+
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          retValue = Movie.RatingAdvanced;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //          retValue = Show.RatingAdvanced;
+  //          break;
+  //        case "episode":
+  //          retValue = Episode.RatingAdvanced;
+  //          break;
+  //      }
+  //      return retValue;
+  //    }
+  //    set
+  //    {
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          Movie.RatingAdvanced = value;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //          Show.RatingAdvanced = value;
+  //          break;
+  //        case "episode":
+  //          Episode.RatingAdvanced = value;
+  //          break;
+  //      }
+  //    }
+  //  }
+
+  //  [DataMember(Name = "plays")]
+  //  public int Plays
+  //  {
+  //    get
+  //    {
+  //      int retValue = 0;
+
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          retValue = Movie.Plays;
+  //          break;
+
+  //        case "show":
+  //          retValue = Show.Plays;
+  //          break;
+
+  //        case "season":
+  //          retValue = _plays;
+  //          break;
+  //        case "episode":
+  //          retValue = Episode.Plays;
+  //          break;
+  //      }
+  //      return retValue;
+  //    }
+  //    set
+  //    {
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          Movie.Plays = value;
+  //          break;
+
+  //        case "show":
+  //          Show.Plays = value;
+  //          break;
+
+  //        case "season":
+  //          _plays = value;
+  //          break;
+
+  //        case "episode":
+  //          Episode.Plays = value;
+  //          break;
+  //      }
+  //    }
+  //  } int _plays;
+
+  //  [DataMember(Name = "watched")]
+  //  public bool Watched
+  //  {
+  //    get
+  //    {
+  //      bool retValue = false;
+
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          retValue = Movie.Watched;
+  //          break;
+
+  //        case "show":
+  //          retValue = Show.Watched;
+  //          break;
+
+  //        case "season":
+  //          retValue = _watched;
+  //          break;
+
+  //        case "episode":
+  //          retValue = Episode.Watched;
+  //          break;
+  //      }
+  //      return retValue;
+  //    }
+  //    set
+  //    {
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          Movie.Watched = value;
+  //          break;
+
+  //        case "show":
+  //          Show.Watched = value;
+  //          break;
+
+  //        case "season":
+  //          _watched = value;
+  //          break;
+
+  //        case "episode":
+  //          Episode.Watched = value;
+  //          break;
+  //      }
+  //    }
+  //  } bool _watched;
+
+  //  [DataMember(Name = "in_collection")]
+  //  public bool InCollection
+  //  {
+  //    get
+  //    {
+  //      bool retValue = false;
+
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          retValue = Movie.InCollection;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //          retValue = _incollection;
+  //          break;
+  //        case "episode":
+  //          retValue = Episode.InCollection;
+  //          break;
+  //      }
+  //      return retValue;
+  //    }
+  //    set
+  //    {
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          Movie.InCollection = value;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //          _incollection = value;
+  //          break;
+  //        case "episode":
+  //          Episode.InCollection = value;
+  //          break;
+  //      }
+  //    }
+  //  } bool _incollection;
+
+  //  [DataMember(Name = "in_watchlist")]
+  //  public bool InWatchList
+  //  {
+  //    get
+  //    {
+  //      bool retValue = false;
+
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          retValue = Movie.InWatchList;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //          retValue = _inwatchlist;
+  //          break;
+  //        case "episode":
+  //          retValue = Episode.InWatchList;
+  //          break;
+  //      }
+  //      return retValue;
+  //    }
+  //    set
+  //    {
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          Movie.InWatchList = value;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //          _inwatchlist = value;
+  //          break;
+  //        case "episode":
+  //          Episode.InWatchList = value;
+  //          break;
+  //      }
+  //    }
+  //  } bool _inwatchlist;
+
+  //  [DataMember(Name = "episode_num")]
+  //  public string EpisodeNumber
+  //  {
+  //    get
+  //    {
+  //      return _episodeNumber;
+  //    }
+  //    set
+  //    {
+  //      if (Type == "episode")
+  //      {
+  //        Episode = Episode ?? new TraktEpisode();
+  //        Episode.Number = Convert.ToInt32(value);
+  //      }
+  //      _episodeNumber = value;
+  //    }
+  //  } string _episodeNumber = null;
+
+  //  [DataMember(Name = "season")]
+  //  public string SeasonNumber
+  //  {
+  //    get
+  //    {
+  //      return _season;
+  //    }
+  //    set
+  //    {
+  //      if (Type == "episode")
+  //      {
+  //        Episode = Episode ?? new TraktEpisode();
+  //        Episode.Season = Convert.ToInt32(value);
+  //      }
+  //      _season = value;
+  //    }
+  //  } string _season = null;
+
+  //  public string Year
+  //  {
+  //    get
+  //    {
+  //      string retValue = string.Empty;
+
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          retValue = Movie.Year;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //        case "episode":
+  //          retValue = Show.Year.ToString();
+  //          break;
+  //      }
+  //      return retValue;
+  //    }
+  //  }
+
+  //  public string Title
+  //  {
+  //    get
+  //    {
+  //      string retValue = string.Empty;
+
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          retValue = Movie.Title;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //        case "episode":
+  //          retValue = Show.Title;
+  //          break;
+  //      }
+  //      return retValue;
+  //    }
+  //  }
+
+  //  public string ImdbId
+  //  {
+  //    get
+  //    {
+  //      string retValue = string.Empty;
+
+  //      switch (Type)
+  //      {
+  //        case "movie":
+  //          retValue = Movie.IMDBID;
+  //          break;
+
+  //        case "show":
+  //        case "season":
+  //        case "episode":
+  //          retValue = Show.Imdb;
+  //          break;
+  //      }
+  //      return retValue;
+  //    }
+  //  }
+
+  //  #endregion
+  //}
 }
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/Extension/DateTimeExtensions.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/Extension/DateTimeExtensions.cs
index 8cd4a91..84ecd60 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/Extension/DateTimeExtensions.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/Extension/DateTimeExtensions.cs
@@ -1,4 +1,6 @@
 ﻿using System;
+using System.Collections.Generic;
+using System.Globalization;
 
 namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.Extension
 {
@@ -25,5 +27,72 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.Extension
     {
       return new DateTime(1970, 1, 1).AddSeconds(unixTime);
     }
+
+    /// <summary>
+    /// Converts string DateTime to ISO8601 format
+    /// 2014-09-01T09:10:11.000Z
+    /// </summary>
+    /// <param name="dt">DateTime as string</param>
+    /// <param name="hourShift">Number of hours to shift original time</param>
+    /// <returns>ISO8601 Timestamp</returns>
+    public static string ToISO8601(this string dt, double hourShift = 0, bool isLocal = false)
+    {
+      DateTime date;
+      if (DateTime.TryParse(dt, out date))
+      {
+        if (isLocal)
+          return date.AddHours(hourShift).ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ");
+        else
+          return date.AddHours(hourShift).ToString("yyyy-MM-ddTHH:mm:ssZ");
+      }
+
+      return DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
+    }
+
+    public static string ToISO8601(this DateTime dt, double hourShift = 0)
+    {
+      string retValue = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ");
+
+      if (dt == null)
+        return retValue;
+
+      return dt.AddHours(hourShift).ToString("yyyy-MM-ddTHH:mm:ssZ");
+    }
+
+    public static DateTime FromISO8601(this string dt)
+    {
+      DateTime date;
+      if (DateTime.TryParse(dt, out date))
+      {
+        return date;
+      }
+
+      return DateTime.UtcNow;
+    }
+
+    /// <summary>
+    /// Returns the corresponding Olsen timezone e.g. 'Atlantic/Canary' into a Windows timezone e.g. 'GMT Standard Time'
+    /// </summary>
+    //public static string OlsenToWindowsTimezone(this string olsenTimezone)
+    //{
+    //  if (olsenTimezone == null)
+    //    return null;
+
+    //  if (_timezoneMappings == null)
+    //  {
+    //    _timezoneMappings = Resources.OlsenToWindows.FromJSONDictionary<Dictionary<string, string>>();
+    //  }
+
+    //  string windowsTimezone;
+    //  _timezoneMappings.TryGetValue(olsenTimezone, out windowsTimezone);
+
+    //  return windowsTimezone;
+    //}
+    private static Dictionary<string, string> _timezoneMappings = null;
+
+    public static string ToLocalisedDayOfWeek(this DateTime date)
+    {
+      return DateTimeFormatInfo.CurrentInfo.GetDayName(date.DayOfWeek);
+    }
   }
 }
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/Extension/JsonExtensions.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/Extension/JsonExtensions.cs
index d2581e9..e4fdc0d 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/Extension/JsonExtensions.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/Extension/JsonExtensions.cs
@@ -3,6 +3,7 @@ using System.Collections.Generic;
 using System.IO;
 using System.Runtime.Serialization.Json;
 using System.Text;
+using Newtonsoft.Json;
 
 namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.Extension
 {
@@ -69,6 +70,23 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.Extension
     }
 
     /// <summary>
+    /// Creates a Dictionary based on the JSON string
+    /// </summary>
+    public static T FromJSONDictionary<T>(this string json)
+    {
+      if (string.IsNullOrEmpty(json)) return default(T);
+
+      try
+      {
+        return JsonConvert.DeserializeObject<T>(json);
+      }
+      catch
+      {
+        return default(T);
+      }
+    }
+
+    /// <summary>
     /// Turns an object into JSON
     /// </summary>
     /// <param name="obj"></param>
@@ -84,4 +102,4 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.Extension
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktAPI.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktAPI.cs
index 542fcce..be4cd5d 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktAPI.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktAPI.cs
@@ -1,67 +1,24 @@
 ﻿using System;
 using System.Collections.Generic;
+using System.Diagnostics;
 using System.IO;
-using System.Linq;
 using System.Net;
 using System.Text;
 using System.Threading;
 using System.Web;
-using MediaPortal.Extensions.OnlineLibraries.Libraries.Common;
 using MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures;
+using MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.Enums;
 using MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.Extension;
+using MediaPortal.Extensions.OnlineLibraries.Libraries.TraktAPI;
 
 namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
 {
-  #region Enumerables
+  // Enumerables
 
   // ReSharper disable InconsistentNaming
-  
-  /// <summary>
-  /// List of Scrobble States
-  /// </summary>
-  public enum TraktScrobbleStates
-  {
-    watching,
-    scrobble,
-    cancelwatching
-  }
-
-  /// <summary>
-  /// List of Sync Modes
-  /// </summary>
-  public enum TraktSyncModes
-  {
-    library,
-    seen,
-    unlibrary,
-    unseen,
-    watchlist,
-    unwatchlist
-  }
-
-  /// <summary>
-  /// List of Clearing Modes
-  /// </summary>
-  public enum TraktClearingModes
-  {
-    all,
-    movies,
-    episodes
-  }
-
-  /// <summary>
-  /// List of Item Types
-  /// </summary>
-  public enum TraktItemType
-  {
-    episode,
-    season,
-    show,
-    movie
-  }
 
   /// <summary>
-  /// List of Rate Values
+  /// List of Rate Values - here for backwards compatability with WIFIREMOTE
   /// </summary>
   public enum TraktRateValue
   {
@@ -75,1007 +32,899 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
     seven,
     eight,
     nine,
-    ten,
-    love, //deprecated - ten
-    hate  //deprecated - one
-  }
-
-  /// <summary>
-  /// Trakt Connection States
-  /// </summary>
-  public enum ConnectionState
-  {
-    Connected,
-    Connecting,
-    Disconnected,
-    Invalid,
-    Pending
+    ten
   }
 
-  /// <summary>
-  /// Privacy Level for Lists
-  /// </summary>
-  public enum ListPrivacyLevel
+  public static class TraktAPI
   {
-    Public,
-    Private,
-    Friends
-  }
+    #region Web Events
 
-  /// <summary>
-  /// Defaults to all, but you can instead send a comma delimited list of actions. 
-  /// For example, /all or /watching,scrobble,seen or /rating.
-  /// </summary>
-  public enum ActivityAction
-  {
-    all,
-    watching,
-    scrobble,
-    checkin,
-    seen,
-    collection,
-    rating,
-    watchlist,
-    review,
-    shout,
-    created,
-    item_added
-  }
+    // these events can be used to log data sent / received from trakt
+    public delegate void OnDataSendDelegate(string url, string postData);
 
-  /// <summary>
-  /// Defaults to all, but you can instead send a comma delimited list of types.
-  /// For example, /all or /movie,show or /list.
-  /// </summary>
-  public enum ActivityType
-  {
-    all,
-    episode,
-    show,
-    movie,
-    list
-  }
+    public delegate void OnDataReceivedDelegate(string response, HttpWebResponse webResponse);
 
-  [Flags]
-  public enum SearchType
-  {
-    none = 0,
-    movies = 1,
-    shows = 2,
-    episodes = 4,
-    people = 8,
-    users = 16
-  }
-  // ReSharper restore InconsistentNaming
+    public delegate void OnDataErrorDelegate(string error);
 
-  #endregion
+    public delegate void OnLatencyDelegate(double totalElapsedTime, HttpWebResponse webResponse, int dataSent, int dataReceived);
 
-  /// <summary>
-  /// Object that communicates with the Trakt API
-  /// </summary>
-  public class TraktAPI
-  {
-    #region Transmit Events
-    // these events can be used to log data sent / received from trakt
-    internal delegate void OnDataSendDelegate(string url, string postData);
-    internal delegate void OnDataReceivedDelegate(string response);
-    internal delegate void OnDataErrorDelegate(string error);
+    public static event OnDataSendDelegate OnDataSend;
+    public static event OnDataReceivedDelegate OnDataReceived;
+    public static event OnDataErrorDelegate OnDataError;
+    public static event OnLatencyDelegate OnLatency;
 
-    internal static event OnDataSendDelegate OnDataSend;
-    internal static event OnDataReceivedDelegate OnDataReceived;
-    internal static event OnDataErrorDelegate OnDataError;
     #endregion
 
     #region Settings
 
+    // these settings should be set before sending data to trakt
+    // exception being the UserToken which is set after logon
+
+    public static string ApplicationId { get; set; }
     public static string Username { get; set; }
     public static string Password { get; set; }
+    public static string UserToken { get; set; }
     public static string UserAgent { get; set; }
+    public static bool UseSSL { get; set; }
 
     #endregion
 
-    #region Scrobbling
+    #region Trakt Methods
+
+    #region Authentication
 
     /// <summary>
-    /// Sends Scrobble data to Trakt
+    /// Login to trakt and to request a user token for all subsequent requests
     /// </summary>
-    /// <param name="scrobbleData">The Data to send</param>
-    /// <param name="status">The mode to send it as</param>
-    /// <returns>The response from Trakt</returns>
-    public static TraktResponse ScrobbleMovieState(TraktMovieScrobble scrobbleData, TraktScrobbleStates status)
+    /// <returns></returns>
+    public static TraktUserToken Login(string loginData = null)
     {
-      //If we are cancelling a scrobble we don't need data
-      if (status != TraktScrobbleStates.cancelwatching)
-      {
-        // check that we have everything we need
-        // server can accept title if movie id is not supplied
-        if (scrobbleData == null)
-        {
-          TraktResponse error = new TraktResponse
-          {
-            Error = "Not enough information to send to server",
-            Status = "failure"
-          };
-          return error;
-        }
-      }
+      // clear User Token if set
+      UserToken = null;
 
-      // serialize Scrobble object to JSON and send to server
-      string response = Transmit(string.Format(TraktURIs.ScrobbleMovie, status), scrobbleData.ToJSON());
-
-      // return success or failure
-      return response.FromJSON<TraktResponse>();
+      var response = PostToTrakt(TraktURIs.Login, loginData ?? GetUserLogin(), false);
+      return response.FromJSON<TraktUserToken>();
     }
 
     /// <summary>
-    /// Sends Scrobble data to Trakt
-    /// </summary>
-    /// <param name="scrobbleData">The Data to send</param>
-    /// <param name="status">The mode to send it as</param>
-    /// <returns>The response from Trakt</returns>
-    public static TraktResponse ScrobbleEpisodeState(TraktEpisodeScrobble scrobbleData, TraktScrobbleStates status)
+    /// Gets a User Login object
+    /// </summary>       
+    /// <returns>The User Login json string</returns>
+    private static string GetUserLogin()
     {
-      // check that we have everything we need
-      // server can accept title if movie id is not supplied
-      if (status != TraktScrobbleStates.cancelwatching)
-      {
-        if (scrobbleData == null)
-        {
-          TraktResponse error = new TraktResponse
-          {
-            Error = "Not enough information to send to server",
-            Status = "failure"
-          };
-          return error;
-        }
-      }
-
-      // serialize Scrobble object to JSON and send to server
-      string response = Transmit(string.Format(TraktURIs.ScrobbleShow, status), scrobbleData.ToJSON());
-
-      // return success or failure
-      return response.FromJSON<TraktResponse>();
+      return new TraktAuthentication { Username = Username, Password = Password }.ToJSON();
     }
 
     #endregion
 
-    #region Syncing
+    #region Sync
 
-    /// <summary>
-    /// Sends movie sync data to Trakt
-    /// </summary>
-    /// <param name="syncData">The sync data to send</param>
-    /// <param name="mode">The sync mode to use</param>
-    /// <returns>The response from trakt</returns>
-    public static TraktSyncResponse SyncMovieLibrary(TraktMovieSync syncData, TraktSyncModes mode)
+    public static TraktLastSyncActivities GetLastSyncActivities()
     {
-      // check that we have everything we need
-      // server can accept title/year if imdb id is not supplied
-      if (syncData == null || syncData.MovieList.Count == 0)
-      {
-        TraktSyncResponse error = new TraktSyncResponse
-        {
-          Error = "Not enough information to send to server",
-          Status = "failure"
-        };
-        return error;
-      }
+      var response = GetFromTrakt(TraktURIs.SyncLastActivities);
+      return response.FromJSON<TraktLastSyncActivities>();
+    }
 
-      // serialize Scrobble object to JSON and send to server
-      string response = Transmit(string.Format(TraktURIs.SyncMovieLibrary, mode), syncData.ToJSON());
+    #endregion
 
-      // return success or failure
-      return response.FromJSON<TraktSyncResponse>();
+    #region Playback
+
+    public static IEnumerable<TraktSyncPausedMovie> GetPausedMovies()
+    {
+      var response = GetFromTrakt(TraktURIs.SyncPausedMovies);
+      return response.FromJSONArray<TraktSyncPausedMovie>();
     }
 
-    /// <summary>
-    /// Add/Remove show to/from watchlist
-    /// </summary>
-    /// <param name="syncData">The sync data to send</param>
-    /// <param name="mode">The sync mode to use</param>
-    /// <returns>The response from trakt</returns>
-    public static TraktResponse SyncShowWatchList(TraktShowSync syncData, TraktSyncModes mode)
+    public static IEnumerable<TraktSyncPausedEpisode> GetPausedEpisodes()
     {
-      // check that we have everything we need            
-      if (syncData == null || syncData.Shows.Count == 0)
-      {
-        TraktResponse error = new TraktResponse
-        {
-          Error = "Not enough information to send to server",
-          Status = "failure"
-        };
-        return error;
-      }
+      var response = GetFromTrakt(TraktURIs.SyncPausedEpisodes);
+      return response.FromJSONArray<TraktSyncPausedEpisode>();
+    }
+
+    #endregion
 
-      // serialize Scrobble object to JSON and send to server
-      string response = Transmit(string.Format(TraktURIs.SyncShowWatchList, mode), syncData.ToJSON());
+    #region Collection
 
-      // return success or failure
-      return response.FromJSON<TraktResponse>();
+    public static IEnumerable<TraktMovieCollected> GetCollectedMovies()
+    {
+      var response = GetFromTrakt(TraktURIs.SyncCollectionMovies);
+      return response.FromJSONArray<TraktMovieCollected>();
     }
 
-    /// <summary>
-    /// Add/Remove episode to/from watchlist
-    /// </summary>
-    /// <param name="syncData">The sync data to send</param>
-    /// <param name="mode">The sync mode to use</param>
-    /// <returns>The response from trakt</returns>
-    public static TraktResponse SyncEpisodeWatchList(TraktEpisodeSync syncData, TraktSyncModes mode)
+    public static IEnumerable<TraktEpisodeCollected> GetCollectedEpisodes()
     {
-      // check that we have everything we need
-      if (syncData == null || syncData.EpisodeList.Count == 0)
-      {
-        TraktResponse error = new TraktResponse
-        {
-          Error = "Not enough information to send to server",
-          Status = "failure"
-        };
-        return error;
-      }
+      var response = GetFromTrakt(TraktURIs.SyncCollectionEpisodes);
+      return response.FromJSONArray<TraktEpisodeCollected>();
+    }
+
+    #endregion
 
-      // serialize Scrobble object to JSON and send to server
-      string response = Transmit(string.Format(TraktURIs.SyncEpisodeWatchList, mode), syncData.ToJSON());
+    #region Watched History
 
-      // return success or failure
-      return response.FromJSON<TraktResponse>();
+    public static IEnumerable<TraktMovieWatched> GetWatchedMovies()
+    {
+      var response = GetFromTrakt(TraktURIs.SyncWatchedMovies);
+      return response.FromJSONArray<TraktMovieWatched>();
     }
 
-    /// <summary>
-    /// Sends episode sync data to Trakt
-    /// </summary>
-    /// <param name="syncData">The sync data to send</param>
-    /// <param name="mode">The sync mode to use</param>
-    public static TraktResponse SyncEpisodeLibrary(TraktEpisodeSync syncData, TraktSyncModes mode)
+    public static IEnumerable<TraktEpisodeWatched> GetWatchedEpisodes()
     {
-      // check that we have everything we need
-      // server can accept title/year if imdb id is not supplied
-      if (syncData == null || string.IsNullOrEmpty(syncData.SeriesID) && string.IsNullOrEmpty(syncData.Title) && string.IsNullOrEmpty(syncData.Year))
-      {
-        TraktResponse error = new TraktResponse
-        {
-          Error = "Not enough information to send to server",
-          Status = "failure"
-        };
-        return error;
-      }
+      var response = GetFromTrakt(TraktURIs.SyncWatchedEpisodes);
+      return response.FromJSONArray<TraktEpisodeWatched>();
+    }
 
-      // serialize Scrobble object to JSON and send to server
-      string response = Transmit(string.Format(TraktURIs.SyncEpisodeLibrary, mode), syncData.ToJSON());
+    #endregion
 
-      // return success or failure
-      return response.FromJSON<TraktResponse>();
-    }
+    #region Ratings
 
-    public static TraktResponse SyncShowAsSeen(TraktShowSeen show)
+    public static IEnumerable<TraktMovieRated> GetRatedMovies()
     {
-      string response = Transmit(TraktURIs.ShowSeen, show.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      var response = GetFromTrakt(TraktURIs.SyncRatedMovies);
+      return response.FromJSONArray<TraktMovieRated>();
     }
 
-    public static TraktResponse SyncSeasonAsSeen(TraktSeasonSeen showSeason)
+    public static IEnumerable<TraktEpisodeRated> GetRatedEpisodes()
     {
-      string response = Transmit(TraktURIs.SeasonSeen, showSeason.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      var response = GetFromTrakt(TraktURIs.SyncRatedEpisodes);
+      return response.FromJSONArray<TraktEpisodeRated>();
     }
 
-    public static TraktResponse SyncShowAsLibrary(TraktShowLibrary show)
+    public static IEnumerable<TraktShowRated> GetRatedShows()
     {
-      string response = Transmit(TraktURIs.ShowLibrary, show.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      var response = GetFromTrakt(TraktURIs.SyncRatedShows);
+      return response.FromJSONArray<TraktShowRated>();
     }
 
-    public static TraktResponse SyncSeasonAsLibrary(TraktSeasonLibrary showSeason)
+    public static IEnumerable<TraktSeasonRated> GetRatedSeasons()
     {
-      string response = Transmit(TraktURIs.SeasonLibrary, showSeason.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      var response = GetFromTrakt(TraktURIs.SyncRatedSeasons);
+      return response.FromJSONArray<TraktSeasonRated>();
     }
 
     #endregion
 
-    #region Trakt Library Calls
+    #region User
 
-    /// <summary>
-    /// Gets the trakt movie library for a user
-    /// </summary>
-    /// <param name="user">The user to get</param>
-    /// <returns>The trakt movie library</returns>
-    public static IEnumerable<TraktLibraryMovies> GetMovieCollectionForUser(string user)
+    public static TraktUserStatistics GetUserStatistics(string user)
     {
-      // get the library
-      string moviesForUser = Transmit(string.Format(TraktURIs.UserMoviesCollection, user), GetUserAuthentication());
-
-      // if we timeout we will return an error response
-      TraktResponse response = moviesForUser.FromJSON<TraktResponse>();
-      if (response == null || response.Error != null) return null;
-
-      return moviesForUser.FromJSONArray<TraktLibraryMovies>();
+      var response = GetFromTrakt(string.Format(TraktURIs.UserStats, user));
+      return response.FromJSON<TraktUserStatistics>();
     }
 
-    public static IEnumerable<TraktLibraryMovies> GetAllMoviesForUser(string user)
+    public static TraktUserSummary GetUserProfile(string user)
     {
-      return GetAllMoviesForUser(user, true);
+      var response = GetFromTrakt(string.Format(TraktURIs.UserProfile, user));
+      return response.FromJSON<TraktUserSummary>();
     }
 
     /// <summary>
-    /// Gets all movies for a user from trakt, including movies not in collection
+    /// Gets a list of follower requests for the current user
     /// </summary>
-    /// <param name="user">The user to get</param>
-    /// <param name="syncDataOnly">set this to true (default) if you want the absolute minimum data returned nessacary for syncing</param>
-    /// <returns>The trakt movie library</returns>
-    public static IEnumerable<TraktLibraryMovies> GetAllMoviesForUser(string user, bool syncDataOnly)
+    /// <returns></returns>
+    public static IEnumerable<TraktFollowerRequest> GetFollowerRequests()
     {
-      // Get the library
-      string moviesForUser = Transmit(string.Format(TraktURIs.UserMoviesAll, user, syncDataOnly ? @"/min" : string.Empty), GetUserAuthentication());
-
-      // if we timeout we will return an error response
-      TraktResponse response = moviesForUser.FromJSON<TraktResponse>();
-      if (response == null || response.Error != null) return null;
+      var response = GetFromTrakt(TraktURIs.UserFollowerRequests);
+      return response.FromJSONArray<TraktFollowerRequest>();
+    }
 
-      return moviesForUser.FromJSONArray<TraktLibraryMovies>();
+    /// <summary>
+    /// Returns a list of Friends for current user
+    /// Friends are a two-way relationship ie. both following each other
+    /// </summary>
+    public static IEnumerable<TraktNetworkFriend> GetNetworkFriends()
+    {
+      return GetNetworkFriends(TraktSettings.Username);
     }
 
-    public static IEnumerable<TraktLibraryShow> GetLibraryEpisodesForUser(string user)
+    public static IEnumerable<TraktNetworkFriend> GetNetworkFriends(string user)
     {
-      return GetLibraryEpisodesForUser(user, true);
+      string response = GetFromTrakt(string.Format(TraktURIs.NetworkFriends, user));
+      return response.FromJSONArray<TraktNetworkFriend>();
     }
 
     /// <summary>
-    /// Gets the trakt episode library for a user
+    /// Returns a list of people the current user follows
     /// </summary>
-    /// <param name="user">The user to get</param>
-    /// <param name="syncDataOnly">set this to true (default) if you want the absolute minimum data returned nessacary for syncing</param>
-    /// <returns>The trakt episode library</returns>
-    public static IEnumerable<TraktLibraryShow> GetLibraryEpisodesForUser(string user, bool syncDataOnly)
+    public static IEnumerable<TraktNetworkUser> GetNetworkFollowing()
     {
-      string showsForUser = Transmit(string.Format(TraktURIs.UserEpisodesCollection, user, syncDataOnly ? @"/min" : string.Empty), GetUserAuthentication());
-
-      // if we timeout we will return an error response
-      TraktResponse response = showsForUser.FromJSON<TraktResponse>();
-      if (response == null || response.Error != null) return null;
-
-      return showsForUser.FromJSONArray<TraktLibraryShow>();
+      return GetNetworkFollowing(TraktSettings.Username);
     }
 
-    public static IEnumerable<TraktLibraryShow> GetWatchedEpisodesForUser(string user)
+    public static IEnumerable<TraktNetworkUser> GetNetworkFollowing(string user)
     {
-      return GetWatchedEpisodesForUser(user, true);
+      string response = GetFromTrakt(string.Format(TraktURIs.NetworkFollowing, user));
+      return response.FromJSONArray<TraktNetworkUser>();
     }
 
     /// <summary>
-    /// Gets the trakt watched/seen episodes for a user
+    /// Returns a list of people that follow the current user
     /// </summary>
-    /// <param name="user">The user to get</param>
-    /// <param name="syncDataOnly">set this to true (default) if you want the absolute minimum data returned nessacary for syncing</param>
-    /// <returns>The trakt episode library</returns>
-    public static IEnumerable<TraktLibraryShow> GetWatchedEpisodesForUser(string user, bool syncDataOnly)
+    public static IEnumerable<TraktNetworkUser> GetNetworkFollowers()
     {
-      string showsForUser = Transmit(string.Format(TraktURIs.UserWatchedEpisodes, user, syncDataOnly ? @"/min" : string.Empty), GetUserAuthentication());
-
-      // if we timeout we will return an error response
-      TraktResponse response = showsForUser.FromJSON<TraktResponse>();
-      if (response == null || response.Error != null) return null;
-
-      return showsForUser.FromJSONArray<TraktLibraryShow>();
+      return GetNetworkFollowers(TraktSettings.Username);
     }
 
-    public static IEnumerable<TraktLibraryShow> GetUnSeenEpisodesForUser(string user)
+    public static IEnumerable<TraktNetworkUser> GetNetworkFollowers(string user)
     {
-      return GetUnSeenEpisodesForUser(user, true);
+      string response = GetFromTrakt(string.Format(TraktURIs.NetworkFollowers, user));
+      return response.FromJSONArray<TraktNetworkUser>();
     }
 
-    public static IEnumerable<TraktLibraryShow> GetUnSeenEpisodesForUser(string user, bool syncDataOnly)
+    public static TraktNetworkUser NetworkApproveFollower(int id)
     {
-      string showsForUser = Transmit(string.Format(TraktURIs.UserEpisodesUnSeen, user, syncDataOnly ? @"/min" : string.Empty), GetUserAuthentication());
-
-      // if we timeout we will return an error response
-      TraktResponse response = showsForUser.FromJSON<TraktResponse>();
-      if (response == null || response.Error != null) return null;
-
-      return showsForUser.FromJSONArray<TraktLibraryShow>();
+      string response = PostToTrakt(string.Format(TraktURIs.NetworkFollowRequest, id), string.Empty);
+      return response.FromJSON<TraktNetworkUser>();
     }
 
-    #endregion
-
-    #region Rating
-
-    /// <summary>
-    /// Sends episode rate data to Trakt
-    /// </summary>
-    /// <param name="episode">The Trakt rate data to send</param>
-    /// <returns>The response from Trakt</returns>
-    public static TraktRateResponse RateEpisode(TraktRateEpisode episode)
+    public static bool NetworkDenyFollower(int id)
     {
-      if (episode == null) return null;
-      string response = Transmit(string.Format(TraktURIs.RateItem, TraktItemType.episode), episode.ToJSON());
-      return response.FromJSON<TraktRateResponse>();
+      return DeleteFromTrakt(string.Format(TraktURIs.NetworkFollowRequest, id));
     }
 
-    /// <summary>
-    /// Sends episodes rate data to Trakt
-    /// </summary>
-    /// <param name="episodes">The Trakt rate data to send</param>
-    /// <returns>The response from Trakt</returns>
-    public static TraktRateResponse RateEpisodes(TraktRateEpisodes episodes)
+    public static TraktNetworkApproval NetworkFollowUser(string username)
     {
-      if (episodes == null) return null;
-      string response = Transmit(TraktURIs.RateEpisodes, episodes.ToJSON());
-      return response.FromJSON<TraktRateResponse>();
+      string response = PostToTrakt(string.Format(TraktURIs.NetworkFollowUser, username), string.Empty);
+      return response.FromJSON<TraktNetworkApproval>();
     }
 
-    /// <summary>
-    /// Sends series rate data to Trakt
-    /// </summary>
-    /// <param name="series">The Trakt rate data to send</param>
-    /// <returns>The response from Trakt</returns>
-    public static TraktRateResponse RateSeries(TraktRateSeries series)
+    public static bool NetworkUnFollowUser(string username)
     {
-      if (series == null) return null;
-      string response = Transmit(string.Format(TraktURIs.RateItem, TraktItemType.show.ToString()), series.ToJSON());
-      return response.FromJSON<TraktRateResponse>();
+      return DeleteFromTrakt(string.Format(TraktURIs.NetworkFollowUser, username));
     }
 
-    /// <summary>
-    /// Sends multiple series rate data to Trakt
-    /// </summary>
-    /// <param name="shows">The Trakt rate data to send</param>
-    /// <returns>The response from Trakt</returns>
-    public static TraktRateResponse RateSeries(TraktRateShows shows)
+    public static IEnumerable<TraktMovieHistory> GetUsersMovieWatchedHistory(string username, int page = 1, int maxItems = 100)
     {
-      if (shows == null) return null;
-      string response = Transmit(TraktURIs.RateShows, shows.ToJSON());
-      return response.FromJSON<TraktRateResponse>();
+      var response = GetFromTrakt(string.Format(TraktURIs.UserWatchedHistoryMovies, username, page, maxItems));
+      return response.FromJSONArray<TraktMovieHistory>();
     }
 
-    /// <summary>
-    /// Sends movie rate data to Trakt
-    /// </summary>
-    /// <param name="movie">The Trakt rate data to send</param>
-    /// <returns>The response from Trakt</returns>
-    public static TraktRateResponse RateMovie(TraktRateMovie movie)
+    public static IEnumerable<TraktEpisodeHistory> GetUsersEpisodeWatchedHistory(string username, int page = 1, int maxItems = 100)
     {
-      if (movie == null) return null;
-      string response = Transmit(string.Format(TraktURIs.RateItem, TraktItemType.movie), movie.ToJSON());
-      return response.FromJSON<TraktRateResponse>();
+      var response = GetFromTrakt(string.Format(TraktURIs.UserWatchedHistoryEpisodes, username, page, maxItems));
+      return response.FromJSONArray<TraktEpisodeHistory>();
     }
 
     /// <summary>
-    /// Sends movies rate data to Trakt
+    /// Get comments for user sorted by most recent
     /// </summary>
-    /// <param name="movies">The Trakt rate data to send</param>
-    /// <returns>The response from Trakt</returns>
-    public static TraktRateResponse RateMovies(TraktRateMovies movies)
+    /// <param name="username">Username of person that made comment</param>
+    /// <param name="commentType">all, reviews, shouts</param>
+    /// <param name="type"> all, movies, shows, seasons, episodes, lists</param>
+    public static TraktComments GetUsersComments(string username, string commentType = "all", string type = "all", string extendedInfoParams = "min", int page = 1, int maxItems = 10)
     {
-      if (movies == null) return null;
-      string response = Transmit(TraktURIs.RateMovies, movies.ToJSON());
-      return response.FromJSON<TraktRateResponse>();
+      var headers = new WebHeaderCollection();
+
+      var response = GetFromTrakt(string.Format(TraktURIs.UserComments, username, commentType, type, extendedInfoParams, page, maxItems), out headers);
+      if (response == null)
+        return null;
+
+      try
+      {
+        return new TraktComments
+        {
+          CurrentPage = page,
+          TotalItemsPerPage = maxItems,
+          TotalPages = int.Parse(headers["X-Pagination-Page-Count"]),
+          TotalItems = int.Parse(headers["X-Pagination-Item-Count"]),
+          Comments = response.FromJSONArray<TraktCommentItem>()
+        };
+      }
+      catch
+      {
+        // most likely bad header response
+        return null;
+      }
     }
 
     #endregion
 
-    #region User
+    #region Lists
 
-    public static TraktUserProfile GetUserProfile(string user)
+    public static IEnumerable<TraktListDetail> GetUserLists(string username)
     {
-      string response = Transmit(string.Format(TraktURIs.UserProfile, user), GetUserAuthentication());
-      return response.FromJSON<TraktUserProfile>();
+      var response = GetFromTrakt(string.Format(TraktURIs.UserLists, username));
+      return response.FromJSONArray<TraktListDetail>();
     }
 
-    /// <summary>
-    /// Returns a list of Friends and their user profiles
-    /// </summary>
-    /// <param name="user">username of person to retrieve friend s list</param>
-    public static IEnumerable<TraktUserProfile> GetUserFriends(string user)
+    public static IEnumerable<TraktListItem> GetUserListItems(string username, string listId, string extendedInfoParams = "min")
     {
-      string response = Transmit(string.Format(TraktURIs.UserFriends, user), GetUserAuthentication());
-      return response.FromJSONArray<TraktUserProfile>();
+      var response = GetFromTrakt(string.Format(TraktURIs.UserListItems, username, listId, extendedInfoParams));
+      return response.FromJSONArray<TraktListItem>();
     }
 
-    /// <summary>
-    /// Returns list of episodes in Users Calendar
-    /// </summary>
-    /// <param name="user">username of person to get Calendar</param>
-    public static IEnumerable<TraktCalendar> GetCalendarForUser(string user)
+    public static TraktListDetail CreateCustomList(TraktList list, string username)
     {
-      // 7-Days from Today
-      // All Dates should be in PST (GMT-8)
-      DateTime dateNow = DateTime.UtcNow.Subtract(new TimeSpan(8, 0, 0));
-      return GetCalendarForUser(user, dateNow.ToString("yyyyMMdd"), "7");
+      var response = PostToTrakt(string.Format(TraktURIs.UserListAdd, username), list.ToJSON());
+      return response.FromJSON<TraktListDetail>();
     }
 
-    /// <summary>
-    /// Returns list of episodes in Users Calendar
-    /// </summary>
-    /// <param name="user">username of person to get Calendar</param>
-    /// <param name="startDate">Start Date of calendar in form yyyyMMdd (GMT-8hrs)</param>
-    /// <param name="days">Number of days to return in calendar</param>
-    public static IEnumerable<TraktCalendar> GetCalendarForUser(string user, string startDate, string days)
+    public static TraktListDetail UpdateCustomList(TraktListDetail list, string username)
     {
-      string userCalendar = Transmit(string.Format(TraktURIs.UserCalendarShows, user, startDate, days), GetUserAuthentication());
-      return userCalendar.FromJSONArray<TraktCalendar>();
+      var response = ReplaceOnTrakt(string.Format(TraktURIs.UserListEdit, username), list.ToJSON());
+      return response.FromJSON<TraktListDetail>();
     }
 
-    public static IEnumerable<TraktCalendar> GetCalendarPremieres()
+    public static TraktSyncResponse AddItemsToList(string username, string id, TraktSyncAll items)
     {
-      // 7-Days from Today
-      // All Dates should be in PST (GMT-8)
-      DateTime dateNow = DateTime.UtcNow.Subtract(new TimeSpan(8, 0, 0));
-      return GetCalendarPremieres(dateNow.ToString("yyyyMMdd"), "7");
+      var response = PostToTrakt(string.Format(TraktURIs.UserListItemsAdd, username, id), items.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
     }
 
-    /// <summary>
-    /// Returns list of episodes in the Premieres Calendar
-    /// </summary>        
-    /// <param name="startDate">Start Date of calendar in form yyyyMMdd (GMT-8hrs)</param>
-    /// <param name="days">Number of days to return in calendar</param>
-    public static IEnumerable<TraktCalendar> GetCalendarPremieres(string startDate, string days)
+    public static TraktSyncResponse RemoveItemsFromList(string username, string id, TraktSyncAll items)
     {
-      string premieres = Transmit(string.Format(TraktURIs.CalendarPremieres, startDate, days), GetUserAuthentication());
-      return premieres.FromJSONArray<TraktCalendar>();
+      var response = PostToTrakt(string.Format(TraktURIs.UserListItemsRemove, username, id), items.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
     }
 
-    public static IEnumerable<TraktCalendar> GetCalendarShows()
+    public static bool DeleteUserList(string username, string listId)
     {
-      DateTime dateNow = DateTime.UtcNow.Subtract(new TimeSpan(8, 0, 0));
-      return GetCalendarShows(dateNow.ToString("yyyyMMdd"), "7");
+      return DeleteFromTrakt(string.Format(TraktURIs.DeleteList, username, listId));
     }
 
-    public static IEnumerable<TraktCalendar> GetCalendarShows(string startDate, string days)
+    public static bool LikeList(string username, int id)
     {
-      string premieres = Transmit(string.Format(TraktURIs.CalendarAllShows, startDate, days), GetUserAuthentication());
-      return premieres.FromJSONArray<TraktCalendar>();
+      var response = PostToTrakt(string.Format(TraktURIs.UserListLike, username, id), null);
+      return response != null;
     }
 
-    /// <summary>
-    /// Returns list of the 100 last watched episodes by a user
-    /// </summary>
-    /// <param name="user">username of person to get watched history</param>
-    [Obsolete("This method is deprecated and has been replaced by GetUserActivity", false)]
-    public static IEnumerable<TraktWatchedEpisode> GetUserEpisodeWatchedHistory(string user)
+    public static bool UnLikeList(string username, int id)
     {
-      string watchedEpisodes = Transmit(string.Format(TraktURIs.UserEpisodeWatchedHistory, user), GetUserAuthentication());
-      return watchedEpisodes.FromJSONArray<TraktWatchedEpisode>();
+      return DeleteFromTrakt(string.Format(TraktURIs.UserListLike, username, id));
     }
 
-    /// <summary>
-    /// Returns list of the 100 last watched movies by a user
-    /// </summary>
-    /// <param name="user">username of person to get watched history</param>
-    [Obsolete("This method is deprecated and has been replaced by GetUserActivity", false)]
-    public static IEnumerable<TraktWatchedMovie> GetUserMovieWatchedHistory(string user)
+    #endregion
+
+    #region Watchlists
+
+    public static IEnumerable<TraktMovieWatchList> GetWatchListMovies(string username, string extendedInfoParams = "min")
     {
-      string watchedMovies = Transmit(string.Format(TraktURIs.UserMovieWatchedHistory, user), GetUserAuthentication());
-      return watchedMovies.FromJSONArray<TraktWatchedMovie>();
+      var response = GetFromTrakt(string.Format(TraktURIs.UserWatchlistMovies, username, extendedInfoParams));
+      return response.FromJSONArray<TraktMovieWatchList>();
     }
 
-    /// <summary>
-    /// Returns a list of lists created by user
-    /// </summary>
-    /// <param name="user">username of person to get lists</param>
-    public static IEnumerable<TraktUserList> GetUserLists(string user)
+    public static IEnumerable<TraktShowWatchList> GetWatchListShows(string username, string extendedInfoParams = "min")
     {
-      string userLists = Transmit(string.Format(TraktURIs.UserLists, user), GetUserAuthentication());
-      return userLists.FromJSONArray<TraktUserList>();
+      var response = GetFromTrakt(string.Format(TraktURIs.UserWatchlistShows, username, extendedInfoParams));
+      return response.FromJSONArray<TraktShowWatchList>();
     }
 
-    /// <summary>
-    /// Returns the contents of a lists for a user
-    /// </summary>
-    /// <param name="user">username of person</param>
-    /// <param name="slug">slug (id) of list item e.g. "star-wars-collection"</param>
-    public static TraktUserList GetUserList(string user, string slug)
+    public static IEnumerable<TraktSeasonWatchList> GetWatchListSeasons(string username, string extendedInfoParams = "min")
     {
-      string userList = Transmit(string.Format(TraktURIs.UserList, user, slug), GetUserAuthentication());
-      return userList.FromJSON<TraktUserList>();
+      var response = GetFromTrakt(string.Format(TraktURIs.UserWatchlistSeasons, username, extendedInfoParams));
+      return response.FromJSONArray<TraktSeasonWatchList>();
     }
 
-    /// <summary>
-    /// Returns the users Rated Movies
-    /// </summary>
-    /// <param name="user">username of person</param>
-    public static IEnumerable<TraktUserMovieRating> GetUserRatedMovies(string user)
+    public static IEnumerable<TraktEpisodeWatchList> GetWatchListEpisodes(string username, string extendedInfoParams = "min")
     {
-      string ratedMovies = Transmit(string.Format(TraktURIs.UserRatedMoviesList, user), GetUserAuthentication());
+      var response = GetFromTrakt(string.Format(TraktURIs.UserWatchlistEpisodes, username, extendedInfoParams));
+      return response.FromJSONArray<TraktEpisodeWatchList>();
+    }
 
-      // if we timeout we will return an error response
-      TraktResponse response = ratedMovies.FromJSON<TraktResponse>();
-      if (response == null || response.Error != null) return null;
+    #endregion
 
-      return ratedMovies.FromJSONArray<TraktUserMovieRating>();
-    }
+    #region Likes
 
     /// <summary>
-    /// Returns the users Rated Shows
+    /// Gets the current users liked items (comments and/or lists)
     /// </summary>
-    /// <param name="user">username of person</param>
-    public static IEnumerable<TraktUserShowRating> GetUserRatedShows(string user)
+    /// <param name="type">The type of liked item: all (default), lists or comments</param>
+    /// <param name="extendedInfoParams">Extended Info: min, full, images (comma separated)</param>
+    /// <param name="page">Page Number</param>
+    /// <param name="maxItems">Maximum number of items to request per page (this should be consistent per page request)</param>
+    public static TraktLikes GetLikedItems(string type = "all", string extendedInfoParams = "min", int page = 1, int maxItems = 10)
     {
-      string ratedShows = Transmit(string.Format(TraktURIs.UserRatedShowsList, user), GetUserAuthentication());
+      var headers = new WebHeaderCollection();
 
-      // if we timeout we will return an error response
-      TraktResponse response = ratedShows.FromJSON<TraktResponse>();
-      if (response == null || response.Error != null) return null;
+      var response = GetFromTrakt(string.Format(TraktURIs.UserLikedItems, type, extendedInfoParams, page, maxItems), out headers);
+      if (response == null)
+        return null;
 
-      return ratedShows.FromJSONArray<TraktUserShowRating>();
+      try
+      {
+        return new TraktLikes
+        {
+          CurrentPage = page,
+          TotalItemsPerPage = maxItems,
+          TotalPages = int.Parse(headers["X-Pagination-Page-Count"]),
+          TotalItems = int.Parse(headers["X-Pagination-Item-Count"]),
+          Likes = response.FromJSONArray<TraktLike>()
+        };
+      }
+      catch
+      {
+        // most likely bad header response
+        return null;
+      }
     }
 
-    /// <summary>
-    /// Returns the users Rated Episodes
-    /// </summary>
-    /// <param name="user">username of person</param>
-    public static IEnumerable<TraktUserEpisodeRating> GetUserRatedEpisodes(string user)
-    {
-      string ratedEpisodes = Transmit(string.Format(TraktURIs.UserRatedEpisodesList, user), GetUserAuthentication());
+    #endregion
 
-      // if we timeout we will return an error response
-      TraktResponse response = ratedEpisodes.FromJSON<TraktResponse>();
-      if (response == null || response.Error != null) return null;
+    #region Movies
 
-      return ratedEpisodes.FromJSONArray<TraktUserEpisodeRating>();
+    #region Related
+
+    public static IEnumerable<TraktMovieSummary> GetRelatedMovies(string id, int limit = 10)
+    {
+      var response = GetFromTrakt(string.Format(TraktURIs.RelatedMovies, id, limit));
+      return response.FromJSONArray<TraktMovieSummary>();
     }
 
     #endregion
 
-    #region Activity
+    #region Comments
 
-    public static TraktActivity GetFriendActivity()
+    public static IEnumerable<TraktComment> GetMovieComments(string id, int page = 1, int maxItems = 1000)
     {
-      return GetFriendActivity(null, null, false);
+      var response = GetFromTrakt(string.Format(TraktURIs.MovieComments, id, page, maxItems));
+      return response.FromJSONArray<TraktComment>();
     }
 
-    public static TraktActivity GetFriendActivity(bool includeMe)
-    {
-      return GetFriendActivity(null, null, includeMe);
-    }
+    #endregion
 
-    public static TraktActivity GetFriendActivity(List<ActivityType> types, List<ActivityAction> actions, bool includeMe)
-    {
-      return GetFriendActivity(types, actions, 0, 0, includeMe);
-    }
+    #region Popular
 
-    public static TraktActivity GetFriendActivity(List<ActivityType> types, List<ActivityAction> actions, long start, long end, bool includeMe)
+    public static TraktMoviesPopular GetPopularMovies(int page = 1, int maxItems = 100)
     {
-      // get comma seperated list of types and actions (if more than one)
-      string activityTypes = types == null ? "all" : string.Join(",", types.Select(t => t.ToString()).ToArray());
-      string activityActions = actions == null ? "all" : string.Join(",", actions.Select(a => a.ToString()).ToArray());
+      var headers = new WebHeaderCollection();
 
-      string startEnd = (start == 0 || end == 0) ? string.Empty : string.Format("/{0}/{1}", start, end);
-      string apiUrl = includeMe ? TraktURIs.ActivityFriendsMe : TraktURIs.ActivityFriends;
+      var response = GetFromTrakt(string.Format(TraktURIs.PopularMovies, page, maxItems), out headers);
+      if (response == null)
+        return null;
 
-      string activity = Transmit(string.Format(apiUrl, activityTypes, activityActions, startEnd), GetUserAuthentication());
-      return activity.FromJSON<TraktActivity>();
+      try
+      {
+        return new TraktMoviesPopular
+        {
+          CurrentPage = page,
+          TotalItemsPerPage = maxItems,
+          Movies = response.FromJSONArray<TraktMovieSummary>()
+        };
+      }
+      catch
+      {
+        // most likely bad header response
+        return null;
+      }
     }
 
-    public static TraktActivity GetCommunityActivity()
+    #endregion
+
+    #region Trending
+
+    public static TraktMoviesTrending GetTrendingMovies(int page = 1, int maxItems = 100)
     {
-      return GetCommunityActivity(null, null);
+      var headers = new WebHeaderCollection();
+
+      var response = GetFromTrakt(string.Format(TraktURIs.TrendingMovies, page, maxItems), out headers);
+      if (response == null)
+        return null;
+
+      try
+      {
+        return new TraktMoviesTrending
+        {
+          CurrentPage = page,
+          TotalItemsPerPage = maxItems,
+          TotalPages = int.Parse(headers["X-Pagination-Page-Count"]),
+          TotalItems = int.Parse(headers["X-Pagination-Item-Count"]),
+          TotalWatchers = int.Parse(headers["X-Trending-User-Count"]),
+          Movies = response.FromJSONArray<TraktMovieTrending>()
+        };
+      }
+      catch
+      {
+        // most likely bad header response
+        return null;
+      }
     }
 
-    public static TraktActivity GetCommunityActivity(List<ActivityType> types, List<ActivityAction> actions)
+    #endregion
+
+    #region Recommendations
+
+    public static IEnumerable<TraktMovieSummary> GetRecommendedMovies(string extendedInfoParams = "min")
     {
-      return GetCommunityActivity(types, actions, 0, 0);
+      var response = GetFromTrakt(string.Format(TraktURIs.RecommendedMovies, extendedInfoParams));
+      return response.FromJSONArray<TraktMovieSummary>();
     }
 
-    public static TraktActivity GetCommunityActivity(List<ActivityType> types, List<ActivityAction> actions, long start, long end)
+    public static bool DismissRecommendedMovie(string movieId)
     {
-      // get comma seperated list of types and actions (if more than one)
-      string activityTypes = types == null ? "all" : string.Join(",", types.Select(t => t.ToString()).ToArray());
-      string activityActions = actions == null ? "all" : string.Join(",", actions.Select(a => a.ToString()).ToArray());
+      return DeleteFromTrakt(string.Format(TraktURIs.DismissRecommendedMovie, movieId));
+    }
 
-      string startEnd = (start == 0 || end == 0) ? string.Empty : string.Format("/{0}/{1}", start, end);
+    #endregion
 
-      string activity = Transmit(string.Format(TraktURIs.ActivityCommunity, activityTypes, activityActions, startEnd), GetUserAuthentication());
-      return activity.FromJSON<TraktActivity>();
-    }
+    #region Updates
 
-    public static TraktActivity GetUserActivity(string username, List<ActivityType> types, List<ActivityAction> actions)
+    public static TraktMoviesUpdated GetRecentlyUpdatedMovies(string sincedate, int page = 1, int maxItems = 100)
     {
-      // get comma seperated list of types and actions (if more than one)
-      string activityTypes = string.Join(",", types.Select(t => t.ToString()).ToArray());
-      string activityActions = string.Join(",", actions.Select(a => a.ToString()).ToArray());
+      var headers = new WebHeaderCollection();
+
+      var response = GetFromTrakt(string.Format(TraktURIs.MovieUpdates, sincedate, page, maxItems), out headers);
+      if (response == null)
+        return null;
 
-      string activity = Transmit(string.Format(TraktURIs.ActivityUser, username, activityTypes, activityActions), GetUserAuthentication());
-      return activity.FromJSON<TraktActivity>();
+      try
+      {
+        return new TraktMoviesUpdated
+        {
+          CurrentPage = page,
+          TotalItemsPerPage = maxItems,
+          TotalPages = int.Parse(headers["X-Pagination-Page-Count"]),
+          TotalItems = int.Parse(headers["X-Pagination-Item-Count"]),
+          Movies = response.FromJSONArray<TraktMovieUpdate>()
+        };
+      }
+      catch
+      {
+        // most likely bad header response
+        return null;
+      }
     }
 
     #endregion
 
-    #region Friends / Network
+    #endregion
 
-    /// <summary>
-    /// Returns a list of Friends for current user
-    /// Friends are a two-way relationship ie. both following each other
-    /// </summary>
-    public static IEnumerable<TraktNetworkUser> GetNetworkFriends()
-    {
-      return GetNetworkFriends(TraktSettings.Username);
-    }
-    public static IEnumerable<TraktNetworkUser> GetNetworkFriends(string person)
-    {
-      string response = Transmit(string.Format(TraktURIs.NetworkFriends, person), GetUserAuthentication());
-      return response.FromJSONArray<TraktNetworkUser>();
-    }
+    #region Shows
 
-    /// <summary>
-    /// Returns a list of people the current user follows
-    /// </summary>
-    public static IEnumerable<TraktNetworkUser> GetNetworkFollowing()
-    {
-      return GetNetworkFollowing(TraktSettings.Username);
-    }
-    public static IEnumerable<TraktNetworkUser> GetNetworkFollowing(string person)
+    #region Related
+
+    public static IEnumerable<TraktShowSummary> GetRelatedShows(string id, int limit = 10)
     {
-      string response = Transmit(string.Format(TraktURIs.NetworkFollowing, person), GetUserAuthentication());
-      return response.FromJSONArray<TraktNetworkUser>();
+      var response = GetFromTrakt(string.Format(TraktURIs.RelatedShows, id, limit));
+      return response.FromJSONArray<TraktShowSummary>();
     }
 
-    /// <summary>
-    /// Returns a list of people that follow the current user
-    /// </summary>
-    public static IEnumerable<TraktNetworkUser> GetNetworkFollowers()
+    #endregion
+
+    #region Summary
+
+    public static TraktShowSummary GetShowSummary(string id)
     {
-      return GetNetworkFollowers(TraktSettings.Username);
+      var response = GetFromTrakt(string.Format(TraktURIs.ShowSummary, id));
+      return response.FromJSON<TraktShowSummary>();
     }
-    public static IEnumerable<TraktNetworkUser> GetNetworkFollowers(string person)
+
+    #endregion
+
+    #region Updates
+
+    public static TraktShowsUpdated GetRecentlyUpdatedShows(string sincedate, int page = 1, int maxItems = 100)
     {
-      string response = Transmit(string.Format(TraktURIs.NetworkFollowers, person), GetUserAuthentication());
-      return response.FromJSONArray<TraktNetworkUser>();
+      var headers = new WebHeaderCollection();
+
+      var response = GetFromTrakt(string.Format(TraktURIs.ShowUpdates, sincedate, page, maxItems), out headers);
+      if (response == null)
+        return null;
+
+      try
+      {
+        return new TraktShowsUpdated
+        {
+          CurrentPage = page,
+          TotalItemsPerPage = maxItems,
+          TotalPages = int.Parse(headers["X-Pagination-Page-Count"]),
+          TotalItems = int.Parse(headers["X-Pagination-Item-Count"]),
+          Shows = response.FromJSONArray<TraktShowUpdate>()
+        };
+      }
+      catch
+      {
+        // most likely bad header response
+        return null;
+      }
     }
 
+    #endregion
+
+    #region Seasons
+
     /// <summary>
-    /// Returns a list of people awaiting 'following' approval
+    /// Gets the seasons for a show
     /// </summary>
-    /// <returns></returns>
-    public static IEnumerable<TraktNetworkReqUser> GetNetworkRequests()
+    /// <param name="id">the id of the tv show</param>
+    /// <param name="extendedParameter">request parameters, "episodes,full,images"</param>
+    public static IEnumerable<TraktSeasonSummary> GetShowSeasons(string id, string extendedParameter = "full,images")
     {
-      string response = Transmit(TraktURIs.NetworkRequests, GetUserAuthentication());
-      return response.FromJSONArray<TraktNetworkReqUser>();
+      var response = GetFromTrakt(string.Format(TraktURIs.ShowSeasons, id, extendedParameter));
+      return response.FromJSONArray<TraktSeasonSummary>();
     }
 
-    public static TraktNetworkFollowResponse NetworkFollow(TraktNetwork person)
+    public static IEnumerable<TraktComment> GetSeasonComments(string id, int season, int page = 1, int maxItems = 1000)
     {
-      string response = Transmit(TraktURIs.NetworkFollow, person.ToJSON());
-      return response.FromJSON<TraktNetworkFollowResponse>();
+      var response = GetFromTrakt(string.Format(TraktURIs.SeasonComments, id, season, page, maxItems));
+      return response.FromJSONArray<TraktComment>();
     }
 
-    public static TraktResponse NetworkUnFollow(TraktNetwork person)
+    #endregion
+
+    #region Comments
+
+    public static IEnumerable<TraktComment> GetShowComments(string id, int page = 1, int maxItems = 1000)
     {
-      string response = Transmit(TraktURIs.NetworkUnFollow, person.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      var response = GetFromTrakt(string.Format(TraktURIs.ShowComments, id, page, maxItems));
+      return response.FromJSONArray<TraktComment>();
     }
 
-    public static TraktResponse NetworkApprove(TraktNetworkApprove person)
+    #endregion
+
+    #region Popular
+
+    public static TraktShowsPopular GetPopularShows(int page = 1, int maxItems = 100)
     {
-      string response = Transmit(TraktURIs.NetworkApprove, person.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      var headers = new WebHeaderCollection();
+
+      var response = GetFromTrakt(string.Format(TraktURIs.PopularShows, page, maxItems), out headers);
+      if (response == null)
+        return null;
+
+      try
+      {
+        return new TraktShowsPopular
+        {
+          CurrentPage = page,
+          TotalItemsPerPage = maxItems,
+          Shows = response.FromJSONArray<TraktShowSummary>()
+        };
+      }
+      catch
+      {
+        // most likely bad header response
+        return null;
+      }
     }
 
-    public static TraktResponse NetworkDeny(TraktNetwork person)
+    #endregion
+
+    #region Trending
+
+    public static TraktShowsTrending GetTrendingShows(int page = 1, int maxItems = 100)
     {
-      string response = Transmit(TraktURIs.NetworkDeny, person.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      var headers = new WebHeaderCollection();
+
+      var response = GetFromTrakt(string.Format(TraktURIs.TrendingShows, page, maxItems), out headers);
+      if (response == null)
+        return null;
+
+      try
+      {
+        return new TraktShowsTrending
+        {
+          CurrentPage = page,
+          TotalItemsPerPage = maxItems,
+          TotalPages = int.Parse(headers["X-Pagination-Page-Count"]),
+          TotalItems = int.Parse(headers["X-Pagination-Item-Count"]),
+          TotalWatchers = int.Parse(headers["X-Trending-User-Count"]),
+          Shows = response.FromJSONArray<TraktShowTrending>()
+        };
+      }
+      catch
+      {
+        // most likely bad header response
+        return null;
+      }
     }
 
-    #region Obselete Methods
+    #endregion
+
+    #region Recommendations
 
-    [Obsolete("This method is now obsolete, use GetNetworkFriends()", false)]
-    public static IEnumerable<TraktUserProfile> GetFriends()
+    public static IEnumerable<TraktShowSummary> GetRecommendedShows()
     {
-      string response = Transmit(string.Format(TraktURIs.Friends, TraktSettings.Username), GetUserAuthentication());
-      return response.FromJSONArray<TraktUserProfile>();
+      var response = GetFromTrakt(TraktURIs.RecommendedShows);
+      return response.FromJSONArray<TraktShowSummary>();
     }
 
-    [Obsolete("This method is now obsolete, use GetNetworkRequests()", false)]
-    public static IEnumerable<TraktUserProfile> GetFriendRequests()
+    public static bool DismissRecommendedShow(string showId)
     {
-      string response = Transmit(TraktURIs.FriendRequests, GetUserAuthentication());
-      return response.FromJSONArray<TraktUserProfile>();
+      return DeleteFromTrakt(string.Format(TraktURIs.DismissRecommendedShow, showId));
     }
 
-    [Obsolete("This method is now obsolete, use NetworkApprove()", false)]
-    public static TraktResponse FriendApprove(TraktFriend friend)
+    #endregion
+
+    #region Calendar
+
+    /// <summary>
+    /// Returns list of episodes in the Calendar
+    /// </summary>
+    public static Dictionary<string, IEnumerable<TraktCalendar>> GetCalendarShows()
     {
-      string response = Transmit(TraktURIs.FriendApprove, friend.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      // 7-Days from Today
+      DateTime dateNow = DateTime.UtcNow;
+      return GetCalendarShows(dateNow.ToString("yyyyMMdd"), "7", false);
     }
 
-    [Obsolete("This method is now obsolete, use NetworkFollow()", false)]
-    public static TraktResponse FriendAdd(TraktFriend friend)
+    /// <summary>
+    /// Returns list of episodes in the Calendar
+    /// </summary>
+    /// <param name="startDate">Start Date of calendar in form yyyyMMdd</param>
+    /// <param name="days">Number of days to return in calendar</param>
+    /// <param name="userCalendar">Set to true to get the calendar filtered by users shows in library</param>
+    public static Dictionary<string, IEnumerable<TraktCalendar>> GetCalendarShows(string startDate, string days, bool userCalendar)
     {
-      string response = Transmit(TraktURIs.FriendAdd, friend.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      string calendar = GetFromTrakt(string.Format(TraktURIs.CalendarShows, startDate, days), "GET", userCalendar);
+      return calendar.FromJSONDictionary<Dictionary<string, IEnumerable<TraktCalendar>>>();
     }
 
-    [Obsolete("This method is now obsolete, use NetworkDeny()", false)]
-    public static TraktResponse FriendDeny(TraktFriend friend)
+    /// <summary>
+    /// Returns list of episodes in the Premieres Calendar
+    /// </summary>
+    public static Dictionary<string, IEnumerable<TraktCalendar>> GetCalendarPremieres()
     {
-      string response = Transmit(TraktURIs.FriendDeny, friend.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      // 7-Days from Today
+      DateTime dateNow = DateTime.UtcNow;
+      return GetCalendarPremieres(dateNow.ToString("yyyyMMdd"), "7");
     }
 
-    [Obsolete("This method is now obsolete, use NetworkUnfollow()", false)]
-    public static TraktResponse FriendDelete(TraktFriend friend)
+    /// <summary>
+    /// Returns list of episodes in the Premieres Calendar
+    /// </summary>        
+    /// <param name="startDate">Start Date of calendar in form yyyyMMdd</param>
+    /// <param name="days">Number of days to return in calendar</param>
+    public static Dictionary<string, IEnumerable<TraktCalendar>> GetCalendarPremieres(string startDate, string days)
     {
-      string response = Transmit(TraktURIs.FriendDelete, friend.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      string premieres = GetFromTrakt(string.Format(TraktURIs.CalendarPremieres, startDate, days));
+      return premieres.FromJSONDictionary<Dictionary<string, IEnumerable<TraktCalendar>>>();
     }
+
     #endregion
 
     #endregion
 
-    #region Trending
+    #region Episodes
 
-    public static IEnumerable<TraktTrendingMovie> GetTrendingMovies()
-    {
-      string response = Transmit(TraktURIs.TrendingMovies, GetUserAuthentication());
-      return response.FromJSONArray<TraktTrendingMovie>();
-    }
+    #region Comments
 
-    public static IEnumerable<TraktTrendingShow> GetTrendingShows()
+    public static IEnumerable<TraktComment> GetEpisodeComments(string id, int season, int episode, int page = 1, int maxItems = 1000)
     {
-      string response = Transmit(TraktURIs.TrendingShows, GetUserAuthentication());
-      return response.FromJSONArray<TraktTrendingShow>();
+      var response = GetFromTrakt(string.Format(TraktURIs.EpisodeComments, id, season, episode, page, maxItems));
+      return response.FromJSONArray<TraktComment>();
     }
 
     #endregion
 
-    #region Recommendations
+    #region Season Episodes
 
-    public static TraktResponse DismissMovieRecommendation(TraktMovieSlug movie)
+    public static IEnumerable<TraktEpisodeSummary> GetSeasonEpisodes(string showId, string seasonId)
     {
-      string response = Transmit(TraktURIs.DismissMovieRecommendation, movie.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      var response = GetFromTrakt(string.Format(TraktURIs.SeasonEpisodes, showId, seasonId));
+      return response.FromJSONArray<TraktEpisodeSummary>();
     }
 
-    public static TraktResponse DismissShowRecommendation(TraktShowSlug show)
-    {
-      string response = Transmit(TraktURIs.DismissShowRecommendation, show.ToJSON());
-      return response.FromJSON<TraktResponse>();
-    }
+    #endregion
 
-    /// <summary>
-    /// Get Recommendations with out any filtering
-    /// </summary>
-    public static IEnumerable<TraktMovie> GetRecommendedMovies()
+    #endregion
+
+    #region Activity TODO
+
+    public static TraktActivity GetFriendActivity()
     {
-      string response = Transmit(TraktURIs.UserMovieRecommendations, GetUserAuthentication());
-      return response.FromJSONArray<TraktMovie>();
+      return GetFriendActivity(null, null, false);
     }
 
-    public static IEnumerable<TraktMovie> GetRecommendedMovies(string genre, bool hidecollected, bool hidewatchlisted, int startyear, int endyear)
+    public static TraktActivity GetFriendActivity(bool includeMe)
     {
-      var traktRecommendationPost = new TraktRecommendations
-      {
-        Username = TraktSettings.Username,
-        Password = TraktSettings.Password,
-        Genre = genre,
-        HideCollected = hidecollected,
-        HideWatchlisted = hidewatchlisted,
-        StartYear = startyear,
-        EndYear = endyear
-      };
-
-      string response = Transmit(TraktURIs.UserMovieRecommendations, traktRecommendationPost.ToJSON());
-      return response.FromJSONArray<TraktMovie>();
+      return GetFriendActivity(null, null, includeMe);
     }
 
-    /// <summary>
-    /// Get Recommendations with out any filtering
-    /// </summary>        
-    public static IEnumerable<TraktShow> GetRecommendedShows()
+    public static TraktActivity GetFriendActivity(List<ActivityType> types, List<ActivityAction> actions, bool includeMe)
     {
-      string response = Transmit(TraktURIs.UserShowsRecommendations, GetUserAuthentication());
-      return response.FromJSONArray<TraktShow>();
+      return GetFriendActivity(types, actions, 0, 0, includeMe);
     }
 
-    public static IEnumerable<TraktShow> GetRecommendedShows(string genre, bool hidecollected, bool hidewatchlisted, int startyear, int endyear)
+    public static TraktActivity GetFriendActivity(List<ActivityType> types, List<ActivityAction> actions, long start, long end, bool includeMe)
     {
-      var traktRecommendationPost = new TraktRecommendations
-      {
-        Username = TraktSettings.Username,
-        Password = TraktSettings.Password,
-        Genre = genre,
-        HideCollected = hidecollected,
-        HideWatchlisted = hidewatchlisted,
-        StartYear = startyear,
-        EndYear = endyear
-      };
-
-      string response = Transmit(TraktURIs.UserShowsRecommendations, traktRecommendationPost.ToJSON());
-      return response.FromJSONArray<TraktShow>();
-    }
+      //// get comma seperated list of types and actions (if more than one)
+      //string activityTypes = types == null ? "all" : string.Join(",", types.Select(t => t.ToString()).ToArray());
+      //string activityActions = actions == null ? "all" : string.Join(",", actions.Select(a => a.ToString()).ToArray());
 
-    #endregion
+      //string startEnd = (start == 0 || end == 0) ? string.Empty : string.Format("/{0}/{1}", start, end);
+      //string apiUrl = includeMe ? TraktURIs.ActivityFriendsMe : TraktURIs.ActivityFriends;
 
-    #region Watch List
+      //string activity = Transmit(string.Format(apiUrl, activityTypes, activityActions, startEnd), GetUserAuthentication());
+      //return activity.FromJSON<TraktActivity>();
+      return null;
+    }
 
-    public static IEnumerable<TraktWatchListMovie> GetWatchListMovies(string user)
+    public static TraktActivity GetFollowingActivity()
     {
-      string response = Transmit(string.Format(TraktURIs.UserMovieWatchList, user), GetUserAuthentication());
-      return response.FromJSONArray<TraktWatchListMovie>();
+      return GetFollowingActivity(null, null);
     }
 
-    public static IEnumerable<TraktWatchListShow> GetWatchListShows(string user)
+    public static TraktActivity GetFollowingActivity(List<ActivityType> types, List<ActivityAction> actions)
     {
-      string response = Transmit(string.Format(TraktURIs.UserShowsWatchList, user), GetUserAuthentication());
-      return response.FromJSONArray<TraktWatchListShow>();
+      return GetFollowingActivity(types, actions, 0, 0);
     }
 
-    public static IEnumerable<TraktWatchListEpisode> GetWatchListEpisodes(string user)
+    public static TraktActivity GetFollowingActivity(List<ActivityType> types, List<ActivityAction> actions, long start, long end)
     {
-      string response = Transmit(string.Format(TraktURIs.UserEpisodesWatchList, user), GetUserAuthentication());
-      return response.FromJSONArray<TraktWatchListEpisode>();
-    }
+      //// get comma seperated list of types and actions (if more than one)
+      //string activityTypes = types == null ? "all" : string.Join(",", types.Select(t => t.ToString()).ToArray());
+      //string activityActions = actions == null ? "all" : string.Join(",", actions.Select(a => a.ToString()).ToArray());
 
-    #endregion
+      //string startEnd = (start == 0 || end == 0) ? string.Empty : string.Format("/{0}/{1}", start, end);
 
-    #region Lists
+      //string activity = Transmit(string.Format(TraktURIs.ActivityFollowing, activityTypes, activityActions, startEnd), GetUserAuthentication());
+      //return activity.FromJSON<TraktActivity>();
+      return null;
+    }
 
-    public static TraktAddListResponse ListAdd(TraktList list)
+    public static TraktActivity GetFollowersActivity()
     {
-      string response = Transmit(TraktURIs.ListAdd, list.ToJSON());
-      return response.FromJSON<TraktAddListResponse>();
+      return GetFollowersActivity(null, null);
     }
 
-    public static TraktResponse ListDelete(TraktList list)
+    public static TraktActivity GetFollowersActivity(List<ActivityType> types, List<ActivityAction> actions)
     {
-      string response = Transmit(TraktURIs.ListDelete, list.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      return GetFollowersActivity(types, actions, 0, 0);
     }
 
-    public static TraktResponse ListUpdate(TraktList list)
+    public static TraktActivity GetFollowersActivity(List<ActivityType> types, List<ActivityAction> actions, long start, long end)
     {
-      string response = Transmit(TraktURIs.ListUpdate, list.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      //// get comma seperated list of types and actions (if more than one)
+      //string activityTypes = types == null ? "all" : string.Join(",", types.Select(t => t.ToString()).ToArray());
+      //string activityActions = actions == null ? "all" : string.Join(",", actions.Select(a => a.ToString()).ToArray());
+
+      //string startEnd = (start == 0 || end == 0) ? string.Empty : string.Format("/{0}/{1}", start, end);
+
+      //string activity = Transmit(string.Format(TraktURIs.ActivityFollowers, activityTypes, activityActions, startEnd), GetUserAuthentication());
+      //return activity.FromJSON<TraktActivity>();
+      return null;
     }
 
-    public static TraktSyncResponse ListAddItems(TraktList list)
+    public static TraktActivity GetCommunityActivity()
     {
-      string response = Transmit(TraktURIs.ListItemsAdd, list.ToJSON());
-      return response.FromJSON<TraktSyncResponse>();
+      return GetCommunityActivity(null, null);
     }
 
-    public static TraktSyncResponse ListDeleteItems(TraktList list)
+    public static TraktActivity GetCommunityActivity(List<ActivityType> types, List<ActivityAction> actions)
     {
-      string response = Transmit(TraktURIs.ListItemsDelete, list.ToJSON());
-      return response.FromJSON<TraktSyncResponse>();
+      return GetCommunityActivity(types, actions, 0, 0);
     }
 
-    #endregion
+    public static TraktActivity GetCommunityActivity(List<ActivityType> types, List<ActivityAction> actions, long start, long end)
+    {
+      //// get comma seperated list of types and actions (if more than one)
+      //string activityTypes = types == null ? "all" : string.Join(",", types.Select(t => t.ToString()).ToArray());
+      //string activityActions = actions == null ? "all" : string.Join(",", actions.Select(a => a.ToString()).ToArray());
 
-    #region Account
+      //string startEnd = (start == 0 || end == 0) ? string.Empty : string.Format("/{0}/{1}", start, end);
 
-    public static TraktResponse CreateAccount(TraktAccount account)
-    {
-      string response = Transmit(TraktURIs.CreateAccount, account.ToJSON());
-      return response.FromJSON<TraktResponse>();
+      //string activity = Transmit(string.Format(TraktURIs.ActivityCommunity, activityTypes, activityActions, startEnd), GetUserAuthentication());
+      //return activity.FromJSON<TraktActivity>();
+      return null;
     }
 
-    public static TraktResponse TestAccount(TraktAccount account)
+    public static TraktActivity GetUserActivity(string username, List<ActivityType> types, List<ActivityAction> actions)
     {
-      string response = Transmit(TraktURIs.TestAccount, account.ToJSON());
-      return response.FromJSON<TraktResponse>();
-    }
+      //// get comma seperated list of types and actions (if more than one)
+      //string activityTypes = string.Join(",", types.Select(t => t.ToString()).ToArray());
+      //string activityActions = string.Join(",", actions.Select(a => a.ToString()).ToArray());
 
-    public static TraktAccountSettings GetAccountSettings()
-    {
-      string response = Transmit(TraktURIs.AccountSettings, GetUserAuthentication());
-      return response.FromJSON<TraktAccountSettings>();
+      //string activity = Transmit(string.Format(TraktURIs.ActivityUser, username, activityTypes, activityActions), GetUserAuthentication());
+      //return activity.FromJSON<TraktActivity>();
+      return null;
     }
 
     #endregion
 
     #region Search
 
+    private static readonly Object searchLock = new Object();
+
     /// <summary>
+    /// //TODO switch over to comma-seperate types in a single search
     /// Search from one or more types, movies, episodes, shows etc...
     /// </summary>
     /// <param name="searchTerm">string to search for</param>
     /// <param name="types">a list of search types</param>
-    /// <param name="maxResults"></param>
     /// <returns>returns results from multiple search types</returns>
-    public static TraktSearchResult Search(string searchTerm, HashSet<SearchType> types, int maxResults)
+    public static IEnumerable<TraktSearchResult> Search(string searchTerm, HashSet<SearchType> types, int maxResults)
     {
       // collect all the results from each type in this list
-      TraktSearchResult results = new TraktSearchResult();
+      List<TraktSearchResult> results = new List<TraktSearchResult>();
 
       // run all search types in parallel
       List<Thread> threads = new List<Thread>();
@@ -1085,39 +934,106 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
         switch (type)
         {
           case SearchType.movies:
-            Thread tMovieSearch = new Thread(delegate(object obj) { results.Movies = SearchMovies(obj as string, maxResults); });
+            var tMovieSearch = new Thread(obj =>
+            {
+              var response = SearchMovies(obj as string, maxResults);
+              if (response != null)
+              {
+                lock (searchLock)
+                {
+                  results.AddRange(response);
+                }
+              }
+            });
             tMovieSearch.Start(searchTerm);
             tMovieSearch.Name = "Search";
             threads.Add(tMovieSearch);
             break;
 
           case SearchType.shows:
-            Thread tShowSearch = new Thread(delegate(object obj) { results.Shows = SearchShows(obj as string, maxResults); });
+            var tShowSearch = new Thread(obj =>
+            {
+              var response = SearchShows(obj as string, maxResults);
+              if (response != null)
+              {
+                lock (searchLock)
+                {
+                  results.AddRange(response);
+                }
+              }
+            });
             tShowSearch.Start(searchTerm);
             tShowSearch.Name = "Search";
             threads.Add(tShowSearch);
             break;
 
           case SearchType.episodes:
-            Thread tEpisodeSearch = new Thread(delegate(object obj) { results.Episodes = SearchEpisodes(obj as string, maxResults); });
+            var tEpisodeSearch = new Thread(obj =>
+            {
+              var response = SearchEpisodes(obj as string, maxResults);
+              if (response != null)
+              {
+                lock (searchLock)
+                {
+                  results.AddRange(response);
+                }
+              }
+            });
             tEpisodeSearch.Start(searchTerm);
             tEpisodeSearch.Name = "Search";
             threads.Add(tEpisodeSearch);
             break;
 
           case SearchType.people:
-            Thread tPeopleSearch = new Thread(delegate(object obj) { results.People = SearchPeople(obj as string, maxResults); });
+            var tPeopleSearch = new Thread(obj =>
+            {
+              var response = SearchPeople(obj as string, maxResults);
+              if (response != null)
+              {
+                lock (searchLock)
+                {
+                  results.AddRange(response);
+                }
+              }
+            });
             tPeopleSearch.Start(searchTerm);
             tPeopleSearch.Name = "Search";
             threads.Add(tPeopleSearch);
             break;
 
           case SearchType.users:
-            Thread tUserSearch = new Thread(delegate(object obj) { results.Users = SearchForUsers(obj as string, maxResults); });
+            var tUserSearch = new Thread(obj =>
+            {
+              var response = SearchUsers(obj as string, maxResults);
+              if (response != null)
+              {
+                lock (searchLock)
+                {
+                  results.AddRange(response);
+                }
+              }
+            });
             tUserSearch.Start(searchTerm);
             tUserSearch.Name = "Search";
             threads.Add(tUserSearch);
             break;
+
+          case SearchType.lists:
+            var tListSearch = new Thread(obj =>
+            {
+              var response = SearchLists(obj as string, maxResults);
+              if (response != null)
+              {
+                lock (searchLock)
+                {
+                  results.AddRange(response);
+                }
+              }
+            });
+            tListSearch.Start(searchTerm);
+            tListSearch.Name = "Search";
+            threads.Add(tListSearch);
+            break;
         }
       }
 
@@ -1131,264 +1047,1109 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
     /// <summary>
     /// Returns a list of users found using search term
     /// </summary>
-    public static IEnumerable<TraktUser> SearchForUsers(string searchTerm)
+    public static IEnumerable<TraktSearchResult> SearchForUsers(string searchTerm)
     {
-      return SearchForUsers(searchTerm, 30);
+      return SearchUsers(searchTerm, 30);
     }
-    public static IEnumerable<TraktUser> SearchForUsers(string searchTerm, int maxResults)
+
+    public static IEnumerable<TraktSearchResult> SearchUsers(string searchTerm, int maxResults)
     {
-      string response = Transmit(string.Format(TraktURIs.SearchUsers, HttpUtility.UrlEncode(searchTerm), maxResults), GetUserAuthentication());
-      return response.FromJSONArray<TraktUser>();
+      string response = GetFromTrakt(string.Format(TraktURIs.SearchUsers, HttpUtility.UrlEncode(searchTerm), 1, maxResults));
+      return response.FromJSONArray<TraktSearchResult>();
     }
 
     /// <summary>
     /// Returns a list of movies found using search term
     /// </summary>
-    public static IEnumerable<TraktMovie> SearchMovies(string searchTerm)
+    public static IEnumerable<TraktSearchResult> SearchMovies(string searchTerm)
     {
       return SearchMovies(searchTerm, 30);
     }
-    public static IEnumerable<TraktMovie> SearchMovies(string searchTerm, int maxResults)
+
+    public static IEnumerable<TraktSearchResult> SearchMovies(string searchTerm, int maxResults)
     {
-      string response = Transmit(string.Format(TraktURIs.SearchMovies, HttpUtility.UrlEncode(searchTerm), maxResults), GetUserAuthentication());
-      return response.FromJSONArray<TraktMovie>();
+      string response = GetFromTrakt(string.Format(TraktURIs.SearchMovies, HttpUtility.UrlEncode(searchTerm), 1, maxResults));
+      return response.FromJSONArray<TraktSearchResult>();
     }
 
     /// <summary>
     /// Returns a list of shows found using search term
     /// </summary>
-    public static IEnumerable<TraktShow> SearchShows(string searchTerm)
+    public static IEnumerable<TraktSearchResult> SearchShows(string searchTerm)
     {
       return SearchShows(searchTerm, 30);
     }
-    public static IEnumerable<TraktShow> SearchShows(string searchTerm, int maxResults)
+
+    public static IEnumerable<TraktSearchResult> SearchShows(string searchTerm, int maxResults)
     {
-      string response = Transmit(string.Format(TraktURIs.SearchShows, HttpUtility.UrlEncode(searchTerm), maxResults), GetUserAuthentication());
-      return response.FromJSONArray<TraktShow>();
+      string response = GetFromTrakt(string.Format(TraktURIs.SearchShows, HttpUtility.UrlEncode(searchTerm), 1, maxResults));
+      return response.FromJSONArray<TraktSearchResult>();
     }
 
     /// <summary>
     /// Returns a list of episodes found using search term
     /// </summary>
-    public static IEnumerable<TraktEpisodeSummary> SearchEpisodes(string searchTerm)
+    public static IEnumerable<TraktSearchResult> SearchEpisodes(string searchTerm)
     {
       return SearchEpisodes(searchTerm, 30);
     }
-    public static IEnumerable<TraktEpisodeSummary> SearchEpisodes(string searchTerm, int maxResults)
+
+    public static IEnumerable<TraktSearchResult> SearchEpisodes(string searchTerm, int maxResults)
     {
-      string response = Transmit(string.Format(TraktURIs.SearchEpisodes, HttpUtility.UrlEncode(searchTerm), maxResults), GetUserAuthentication());
-      return response.FromJSONArray<TraktEpisodeSummary>();
+      string response = GetFromTrakt(string.Format(TraktURIs.SearchEpisodes, HttpUtility.UrlEncode(searchTerm), 1, maxResults));
+      return response.FromJSONArray<TraktSearchResult>();
     }
 
     /// <summary>
     /// Returns a list of people found using search term
     /// </summary>
-    public static IEnumerable<TraktPersonSummary> SearchPeople(string searchTerm)
+    public static IEnumerable<TraktSearchResult> SearchPeople(string searchTerm)
     {
       return SearchPeople(searchTerm, 30);
     }
-    public static IEnumerable<TraktPersonSummary> SearchPeople(string searchTerm, int maxResults)
+
+    public static IEnumerable<TraktSearchResult> SearchPeople(string searchTerm, int maxResults)
     {
-      string response = Transmit(string.Format(TraktURIs.SearchPeople, HttpUtility.UrlEncode(searchTerm), maxResults), string.Empty);
-      return response.FromJSONArray<TraktPersonSummary>();
+      string response = GetFromTrakt(string.Format(TraktURIs.SearchPeople, HttpUtility.UrlEncode(searchTerm), 1, maxResults));
+      return response.FromJSONArray<TraktSearchResult>();
     }
 
-    #endregion
-
-    #region Summary
-
     /// <summary>
-    /// Returns full movie details
+    /// Returns a list of lists found using search term
     /// </summary>
-    /// <param name="id">TMDB ID, IMDB ID or slug</param>
-    /// <returns></returns>
-    public static TraktMovieSummary MovieOverview(string id)
+    public static IEnumerable<TraktSearchResult> SearchLists(string searchTerm)
+    {
+      return SearchLists(searchTerm, 30);
+    }
+
+    public static IEnumerable<TraktSearchResult> SearchLists(string searchTerm, int maxResults)
     {
-      string response = Transmit(string.Format(TraktURIs.MovieOverview, HttpUtility.UrlEncode(id)), GetUserAuthentication());
-      return response.FromJSON<TraktMovieSummary>();
+      string response = GetFromTrakt(string.Format(TraktURIs.SearchLists, HttpUtility.UrlEncode(searchTerm), 1, maxResults));
+      return response.FromJSONArray<TraktSearchResult>();
     }
 
     /// <summary>
-    /// Returns tv series details
+    /// Returns a list of items found when searching by id
     /// </summary>
-    /// <param name="id">TVDB ID or slug</param>
-    /// <param name="extended"></param>
-    /// <returns></returns>
-    public static TraktShowSummary SeriesOverview(string id, bool extended = false)
+    /// <param name="idType">trakt-movie, trakt-show, trakt-episode, imdb, tmdb, tvdb, tvrage</param>
+    /// <param name="id">the id to search by e.g. tt0848228</param>
+    public static IEnumerable<TraktSearchResult> SearchById(string idType, string id)
     {
-      string url = extended ? TraktURIs.SeriesOverviewExtended : TraktURIs.SeriesOverview;
-
-      string response = Transmit(string.Format(url, HttpUtility.UrlEncode(id)), GetUserAuthentication());
-      return response.FromJSON<TraktShowSummary>();
+      string response = GetFromTrakt(string.Format(TraktURIs.SearchById, idType, id));
+      return response.FromJSONArray<TraktSearchResult>();
     }
 
     #endregion
 
-    #region Comments
+    #region Collection
 
-    /// <summary>
-    /// Return a list of shouts for a movie
-    /// </summary>
-    /// <param name="title">The movie search term, either (title-year seperate spaces with '-'), imdbid, tmdbid</param>    
-    public static IEnumerable<TraktShout> GetMovieShouts(string title)
+    public static TraktSyncResponse AddMoviesToCollecton(TraktSyncMoviesCollected movies)
     {
-      string response = Transmit(string.Format(TraktURIs.MovieShouts, title), GetUserAuthentication());
-      return response.FromJSONArray<TraktShout>();
+      var response = PostToTrakt(TraktURIs.SyncCollectionAdd, movies.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
     }
 
-    /// <summary>
-    /// Return a list of shouts for a show
-    /// </summary>
-    /// <param name="title">The show search term, either (title seperate spaces with '-'), imdbid, tvdbid</param>    
-    public static IEnumerable<TraktShout> GetShowShouts(string title)
+    public static TraktSyncResponse RemoveMoviesFromCollecton(TraktSyncMovies movies)
     {
-      string response = Transmit(string.Format(TraktURIs.ShowShouts, title), GetUserAuthentication());
-      return response.FromJSONArray<TraktShout>();
+      var response = PostToTrakt(TraktURIs.SyncCollectionRemove, movies.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
     }
 
-    /// <summary>
-    /// Return a list of shouts for a episode
-    /// </summary>
-    /// <param name="title">The episode search term, either (title seperate spaces with '-'), imdbid, tmdbid</param>
-    /// <param name="episode">The episode index</param>
-    /// <param name="season">The season index</param>
-    public static IEnumerable<TraktShout> GetEpisodeShouts(string title, string season, string episode)
+    public static TraktSyncResponse AddShowsToCollectonEx(TraktSyncShowsEx shows)
     {
-      string response = Transmit(string.Format(TraktURIs.EpisodeShouts, title, season, episode), GetUserAuthentication());
-      return response.FromJSONArray<TraktShout>();
+      var response = PostToTrakt(TraktURIs.SyncCollectionAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
     }
 
-    #endregion
+    public static TraktSyncResponse AddShowsToCollecton(TraktSyncShows shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncCollectionAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
 
-    #region Related
+    public static TraktSyncResponse RemoveShowsFromCollecton(TraktSyncShows shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncCollectionAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
 
-    public static IEnumerable<TraktMovie> GetRelatedMovies(string title)
+    public static TraktSyncResponse AddEpisodesToCollecton(TraktSyncEpisodesCollected episodes)
     {
-      return GetRelatedMovies(title, false);
+      var response = PostToTrakt(TraktURIs.SyncCollectionAdd, episodes.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
     }
 
-    /// <summary>
-    /// Return a list of related movies for a movie
-    /// </summary>
-    /// <param name="title">The movie search term, either (title-year seperate spaces with '-'), imdbid, tmdbid</param>
-    /// <param name="hidewatched">Hide watched movies</param>
-    public static IEnumerable<TraktMovie> GetRelatedMovies(string title, bool hidewatched)
+    public static TraktSyncResponse RemoveEpisodesFromCollecton(TraktSyncEpisodes episodes)
     {
-      string response = Transmit(string.Format(TraktURIs.RelatedMovies, title, hidewatched ? "/hidewatched" : string.Empty), GetUserAuthentication());
-      return response.FromJSONArray<TraktMovie>();
+      var response = PostToTrakt(TraktURIs.SyncCollectionRemove, episodes.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
     }
 
-    public static IEnumerable<TraktShow> GetRelatedShows(string title)
+    public static TraktSyncResponse AddShowsToCollectonEx(TraktSyncShowsCollectedEx shows)
     {
-      return GetRelatedShows(title, false);
+      var response = PostToTrakt(TraktURIs.SyncCollectionAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
     }
 
-    /// <summary>
-    /// Return a list of related shows for a show
-    /// </summary>
-    /// <param name="title">The show search term, either (title-year seperate spaces with '-'), imdbid, tvdbid</param>
-    /// <param name="hidewatched">Hide watched movies</param>
-    public static IEnumerable<TraktShow> GetRelatedShows(string title, bool hidewatched)
+    public static TraktSyncResponse RemoveShowsFromCollectonEx(TraktSyncShowsEx shows)
     {
-      string response = Transmit(string.Format(TraktURIs.RelatedShows, title, hidewatched ? "/hidewatched" : string.Empty), GetUserAuthentication());
-      return response.FromJSONArray<TraktShow>();
+      var response = PostToTrakt(TraktURIs.SyncCollectionRemove, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
     }
 
     #endregion
 
-    #region Show Seasons
+    #region Collection (Single)
 
-    /// <summary>
-    /// Return a list of seasons for a tv show
-    /// </summary>
-    /// <param name="title">The show search term, either (title-year seperate spaces with '-'), imdbid, tvdbid</param>
-    public static IEnumerable<TraktShowSeason> GetShowSeasons(string title)
+    public static TraktSyncResponse AddMovieToCollection(TraktSyncMovieCollected movie)
     {
-      string response = Transmit(string.Format(TraktURIs.ShowSeasons, title), string.Empty);
-      return response.FromJSONArray<TraktShowSeason>();
+      var movies = new TraktSyncMoviesCollected
+      {
+        Movies = new List<TraktSyncMovieCollected>() { movie }
+      };
+
+      return AddMoviesToCollecton(movies);
     }
 
-    #endregion
+    public static TraktSyncResponse RemoveMovieFromCollection(TraktMovie movie)
+    {
+      var movies = new TraktSyncMovies
+      {
+        Movies = new List<TraktMovie>() { movie }
+      };
 
-    #region Season Episodes
+      return RemoveMoviesFromCollecton(movies);
+    }
 
-    /// <summary>
-    /// Return a list of episodes for a tv show season
-    /// </summary>
-    /// <param name="title">The show search term, either (title-year seperate spaces with '-'), imdbid, tvdbid</param>
-    /// <param name="season">The season, 0 for specials</param>
-    public static IEnumerable<TraktEpisode> GetSeasonEpisodes(string title, string season)
+    public static TraktSyncResponse AddShowToCollection(TraktShow show)
     {
-      string response = Transmit(string.Format(TraktURIs.SeasonEpisodes, title, season), GetUserAuthentication());
-      return response.FromJSONArray<TraktEpisode>();
+      var shows = new TraktSyncShows
+      {
+        Shows = new List<TraktShow>() { show }
+      };
+
+      return AddShowsToCollecton(shows);
     }
 
-    #endregion
+    public static TraktSyncResponse RemoveShowFromCollection(TraktShow show)
+    {
+      var shows = new TraktSyncShows
+      {
+        Shows = new List<TraktShow>() { show }
+      };
 
-    #region Helpers
+      return RemoveShowsFromCollecton(shows);
+    }
 
-    /// <summary>
-    /// Gets a User Authentication object
-    /// </summary>       
-    /// <returns>The User Authentication json string</returns>
-    private static string GetUserAuthentication()
+    public static TraktSyncResponse AddShowToCollectionEx(TraktSyncShowEx show)
     {
-      return new TraktAuthentication { Username = Username, Password = Password }.ToJSON();
+      var shows = new TraktSyncShowsEx
+      {
+        Shows = new List<TraktSyncShowEx>() { show }
+      };
+
+      return AddShowsToCollectonEx(shows);
     }
 
-    /// <summary>
-    /// Communicates to and from Trakt
-    /// </summary>
-    /// <param name="address">The URI to use</param>
-    /// <param name="data">The Data to send</param>
-    /// <returns>The response from Trakt</returns>
-    private static string Transmit(string address, string data)
+    public static TraktSyncResponse RemoveShowFromCollectionEx(TraktSyncShowEx show)
     {
-      if (OnDataSend != null) OnDataSend(address, data);
+      var shows = new TraktSyncShowsEx
+      {
+        Shows = new List<TraktSyncShowEx>() { show }
+      };
 
-      try
+      return RemoveShowsFromCollectonEx(shows);
+    }
+
+    public static TraktSyncResponse AddEpisodeToCollection(TraktSyncEpisodeCollected episode)
+    {
+      var episodes = new TraktSyncEpisodesCollected
       {
-        ServicePointManager.Expect100Continue = false;
-        WebClient client = new CompressionWebClient(true) { Encoding = Encoding.UTF8 };
-        client.Headers.Add("user-agent", UserAgent);
+        Episodes = new List<TraktSyncEpisodeCollected>() { episode }
+      };
 
-        // wait for a response from the server
-        string response = client.UploadString(address, data);
+      return AddEpisodesToCollecton(episodes);
+    }
 
-        // received data, pass it back
-        if (OnDataReceived != null) OnDataReceived(response);
-        return response;
-      }
-      catch (WebException e)
+    public static TraktSyncResponse RemoveEpisodeFromCollection(TraktEpisode episode)
+    {
+      var episodes = new TraktSyncEpisodes
       {
-        if (OnDataError != null) OnDataError(e.Message);
+        Episodes = new List<TraktEpisode>() { episode }
+      };
 
-        if (e.Status == WebExceptionStatus.ProtocolError)
-        {
-          var response = ((HttpWebResponse)e.Response);
-          try
-          {
-            using (var stream = response.GetResponseStream())
-            {
-              using (var reader = new StreamReader(stream))
-              {
-                return reader.ReadToEnd();
-              }
-            }
+      return RemoveEpisodesFromCollecton(episodes);
+    }
+
+    #endregion
+
+    #region Watched History
+
+    public static TraktSyncResponse AddMoviesToWatchedHistory(TraktSyncMoviesWatched movies)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchedHistoryAdd, movies.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveMoviesFromWatchedHistory(TraktSyncMovies movies)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchedHistoryRemove, movies.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddShowsToWatchedHistory(TraktSyncShows shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchedHistoryAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveShowsFromWatchedHistory(TraktSyncShows shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchedHistoryRemove, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddEpisodesToWatchedHistory(TraktSyncEpisodesWatched episodes)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchedHistoryAdd, episodes.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveEpisodesFromWatchedHistory(TraktSyncEpisodes episodes)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchedHistoryRemove, episodes.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddShowsToWatchedHistoryEx(TraktSyncShowsEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchedHistoryAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddShowsToWatchedHistoryEx(TraktSyncShowsWatchedEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchedHistoryAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveShowsFromWatchedHistoryEx(TraktSyncShowsEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchedHistoryRemove, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    #endregion
+
+    #region Watched History (Single)
+
+    public static TraktSyncResponse AddMovieToWatchedHistory(TraktSyncMovieWatched movie)
+    {
+      var movies = new TraktSyncMoviesWatched
+      {
+        Movies = new List<TraktSyncMovieWatched>() { movie }
+      };
+
+      return AddMoviesToWatchedHistory(movies);
+    }
+
+    public static TraktSyncResponse RemoveMovieFromWatchedHistory(TraktMovie movie)
+    {
+      var movies = new TraktSyncMovies
+      {
+        Movies = new List<TraktMovie>() { movie }
+      };
+
+      return RemoveMoviesFromWatchedHistory(movies);
+    }
+
+    public static TraktSyncResponse AddShowToWatchedHistory(TraktShow show)
+    {
+      var shows = new TraktSyncShows
+      {
+        Shows = new List<TraktShow>() { show }
+      };
+
+      return AddShowsToWatchedHistory(shows);
+    }
+
+    public static TraktSyncResponse RemoveShowFromWatchedHistory(TraktShow show)
+    {
+      var shows = new TraktSyncShows
+      {
+        Shows = new List<TraktShow>() { show }
+      };
+
+      return RemoveShowsFromWatchedHistory(shows);
+    }
+
+    public static TraktSyncResponse AddShowToWatchedHistoryEx(TraktSyncShowEx show)
+    {
+      var shows = new TraktSyncShowsEx
+      {
+        Shows = new List<TraktSyncShowEx>() { show }
+      };
+
+      return AddShowsToWatchedHistoryEx(shows);
+    }
+
+    public static TraktSyncResponse RemoveShowFromWatchedHistoryEx(TraktSyncShowEx show)
+    {
+      var shows = new TraktSyncShowsEx
+      {
+        Shows = new List<TraktSyncShowEx>() { show }
+      };
+
+      return RemoveShowsFromWatchedHistoryEx(shows);
+    }
+
+    public static TraktSyncResponse AddEpisodeToWatchedHistory(TraktSyncEpisodeWatched episode)
+    {
+      var episodes = new TraktSyncEpisodesWatched
+      {
+        Episodes = new List<TraktSyncEpisodeWatched>() { episode }
+      };
+
+      return AddEpisodesToWatchedHistory(episodes);
+    }
+
+    public static TraktSyncResponse RemoveEpisodeFromWatchedHistory(TraktEpisode episode)
+    {
+      var episodes = new TraktSyncEpisodes
+      {
+        Episodes = new List<TraktEpisode>() { episode }
+      };
+
+      return RemoveEpisodesFromWatchedHistory(episodes);
+    }
+
+    #endregion
+
+    #region Ratings
+
+    public static TraktSyncResponse AddMoviesToRatings(TraktSyncMoviesRated movies)
+    {
+      var response = PostToTrakt(TraktURIs.SyncRatingsAdd, movies.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveMoviesFromRatings(TraktSyncMovies movies)
+    {
+      var response = PostToTrakt(TraktURIs.SyncRatingsRemove, movies.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddShowsToRatings(TraktSyncShowsRated shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncRatingsAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveShowsFromRatings(TraktSyncShows shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncRatingsRemove, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddEpisodesToRatings(TraktSyncEpisodesRated episodes)
+    {
+      var response = PostToTrakt(TraktURIs.SyncRatingsAdd, episodes.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddShowsToRatingsEx(TraktSyncShowsRatedEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncRatingsAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddSeasonsToRatingsEx(TraktSyncSeasonsRatedEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncRatingsAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveEpisodesFromRatings(TraktSyncEpisodes episodes)
+    {
+      var response = PostToTrakt(TraktURIs.SyncRatingsRemove, episodes.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveShowsFromRatingsEx(TraktSyncShowsRatedEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncRatingsRemove, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveSeasonsFromRatingsEx(TraktSyncSeasonsRatedEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncRatingsRemove, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    #endregion
+
+    #region Ratings (Single)
+
+    /// <summary>
+    /// Rate a single episode on trakt.tv
+    /// </summary>
+    public static TraktSyncResponse AddEpisodeToRatings(TraktSyncEpisodeRated episode)
+    {
+      var episodes = new TraktSyncEpisodesRated
+      {
+        Episodes = new List<TraktSyncEpisodeRated>() { episode }
+      };
+
+      return AddEpisodesToRatings(episodes);
+    }
+
+    /// <summary>
+    /// UnRate a single episode on trakt.tv
+    /// </summary>
+    public static TraktSyncResponse RemoveEpisodeFromRatings(TraktEpisode episode)
+    {
+      var episodes = new TraktSyncEpisodes
+      {
+        Episodes = new List<TraktEpisode>() { new TraktEpisode { Ids = episode.Ids } }
+      };
+
+      return RemoveEpisodesFromRatings(episodes);
+    }
+
+    /// <summary>
+    /// Rate a single episode on trakt.tv (with show info)
+    /// </summary>
+    public static TraktSyncResponse AddEpisodeToRatingsEx(TraktSyncShowRatedEx item)
+    {
+      var episodes = new TraktSyncShowsRatedEx
+      {
+        Shows = new List<TraktSyncShowRatedEx>() { item }
+      };
+
+      return AddShowsToRatingsEx(episodes);
+    }
+
+    /// <summary>
+    /// UnRate a single episode on trakt.tv (with show info)
+    /// </summary>
+    public static TraktSyncResponse RemoveEpisodeFromRatingsEx(TraktSyncShowRatedEx item)
+    {
+      var episodes = new TraktSyncShowsRatedEx
+      {
+        Shows = new List<TraktSyncShowRatedEx>() { item }
+      };
+
+      return RemoveShowsFromRatingsEx(episodes);
+    }
+
+    /// <summary>
+    /// Rate a single season on trakt.tv (with show info)
+    /// </summary>
+    public static TraktSyncResponse AddSeasonToRatingsEx(TraktSyncSeasonRatedEx item)
+    {
+      var seasons = new TraktSyncSeasonsRatedEx
+      {
+        Shows = new List<TraktSyncSeasonRatedEx>() { item }
+      };
+
+      return AddSeasonsToRatingsEx(seasons);
+    }
+
+    /// <summary>
+    /// UnRate a single season on trakt.tv (with show info)
+    /// </summary>
+    public static TraktSyncResponse RemoveSeasonFromRatingsEx(TraktSyncSeasonRatedEx item)
+    {
+      var seasons = new TraktSyncSeasonsRatedEx
+      {
+        Shows = new List<TraktSyncSeasonRatedEx>() { item }
+      };
+
+      return RemoveSeasonsFromRatingsEx(seasons);
+    }
+
+    /// <summary>
+    /// Rate a single show on trakt.tv
+    /// </summary>
+    public static TraktSyncResponse AddShowToRatings(TraktSyncShowRated show)
+    {
+      var shows = new TraktSyncShowsRated
+      {
+        Shows = new List<TraktSyncShowRated>() { show }
+      };
+
+      return AddShowsToRatings(shows);
+    }
+
+    /// <summary>
+    /// UnRate a single show on trakt.tv
+    /// </summary>
+    public static TraktSyncResponse RemoveShowFromRatings(TraktShow show)
+    {
+      var shows = new TraktSyncShows
+      {
+        Shows = new List<TraktShow>() { new TraktShow { Ids = show.Ids } }
+      };
+
+      return RemoveShowsFromRatings(shows);
+    }
+
+    /// <summary>
+    /// Rate a single movie on trakt.tv
+    /// </summary>
+    public static TraktSyncResponse AddMovieToRatings(TraktSyncMovieRated movie)
+    {
+      var movies = new TraktSyncMoviesRated
+      {
+        Movies = new List<TraktSyncMovieRated>() { movie }
+      };
+
+      return AddMoviesToRatings(movies);
+    }
+
+    /// <summary>
+    /// UnRate a single movie on trakt.tv
+    /// </summary>
+    public static TraktSyncResponse RemoveMovieFromRatings(TraktMovie movie)
+    {
+      var movies = new TraktSyncMovies
+      {
+        Movies = new List<TraktMovie>() { new TraktMovie { Ids = movie.Ids } }
+      };
+
+      return RemoveMoviesFromRatings(movies);
+    }
+
+    #endregion
+
+    #region Community Ratings
+
+    public static TraktRating GetShowRatings(string id)
+    {
+      var response = GetFromTrakt(string.Format(TraktURIs.ShowRatings, id));
+      return response.FromJSON<TraktRating>();
+    }
+
+    public static TraktRating GetSeasonRatings(string id, int season)
+    {
+      var response = GetFromTrakt(string.Format(TraktURIs.ShowRatings, id, season));
+      return response.FromJSON<TraktRating>();
+    }
+
+    public static TraktRating GetEpisodeRatings(string id, int season, int episode)
+    {
+      var response = GetFromTrakt(string.Format(TraktURIs.EpisodeRatings, id, season, episode));
+      return response.FromJSON<TraktRating>();
+    }
+
+    #endregion
+
+    #region Scrobble
+
+    public static TraktScrobbleResponse StartMovieScrobble(TraktScrobbleMovie movie)
+    {
+      var response = PostToTrakt(TraktURIs.ScrobbleStart, movie.ToJSON());
+      return response.FromJSON<TraktScrobbleResponse>();
+    }
+
+    public static TraktScrobbleResponse StartEpisodeScrobble(TraktScrobbleEpisode episode)
+    {
+      var response = PostToTrakt(TraktURIs.ScrobbleStart, episode.ToJSON());
+      return response.FromJSON<TraktScrobbleResponse>();
+    }
+
+    public static TraktScrobbleResponse PauseMovieScrobble(TraktScrobbleMovie movie)
+    {
+      var response = PostToTrakt(TraktURIs.ScrobblePause, movie.ToJSON());
+      return response.FromJSON<TraktScrobbleResponse>();
+    }
+
+    public static TraktScrobbleResponse PauseEpisodeScrobble(TraktScrobbleEpisode episode)
+    {
+      var response = PostToTrakt(TraktURIs.ScrobblePause, episode.ToJSON());
+      return response.FromJSON<TraktScrobbleResponse>();
+    }
+
+    public static TraktScrobbleResponse StopMovieScrobble(TraktScrobbleMovie movie)
+    {
+      var response = PostToTrakt(TraktURIs.ScrobbleStop, movie.ToJSON());
+      return response.FromJSON<TraktScrobbleResponse>();
+    }
+
+    public static TraktScrobbleResponse StopEpisodeScrobble(TraktScrobbleEpisode episode)
+    {
+      var response = PostToTrakt(TraktURIs.ScrobbleStop, episode.ToJSON());
+      return response.FromJSON<TraktScrobbleResponse>();
+    }
+
+    #endregion
+
+    #region Watchlist
+
+    public static TraktSyncResponse AddMoviesToWatchlist(TraktSyncMovies movies)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchlistAdd, movies.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveMoviesFromWatchlist(TraktSyncMovies movies)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchlistRemove, movies.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddShowsToWatchlist(TraktSyncShows shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchlistAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddShowsToWatchlistEx(TraktSyncShowsEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchlistAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveShowsFromWatchlist(TraktSyncShows shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchlistRemove, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveShowsFromWatchlistEx(TraktSyncShowsEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchlistRemove, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddSeasonsToWatchlist(TraktSyncSeasonsEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchlistAdd, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveSeasonsFromWatchlist(TraktSyncSeasonsEx shows)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchlistRemove, shows.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse AddEpisodesToWatchlist(TraktSyncEpisodes episodes)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchlistAdd, episodes.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    public static TraktSyncResponse RemoveEpisodesFromWatchlist(TraktSyncEpisodes episodes)
+    {
+      var response = PostToTrakt(TraktURIs.SyncWatchlistRemove, episodes.ToJSON());
+      return response.FromJSON<TraktSyncResponse>();
+    }
+
+    #endregion
+
+    #region Watchlist (Single)
+
+    public static TraktSyncResponse AddMovieToWatchlist(TraktMovie movie)
+    {
+      var movies = new TraktSyncMovies
+      {
+        Movies = new List<TraktMovie>() { movie }
+      };
+
+      return AddMoviesToWatchlist(movies);
+    }
+
+    public static TraktSyncResponse RemoveMovieFromWatchlist(TraktMovie movie)
+    {
+      var movies = new TraktSyncMovies
+      {
+        Movies = new List<TraktMovie>() { movie }
+      };
+
+      return RemoveMoviesFromWatchlist(movies);
+    }
+
+    public static TraktSyncResponse AddShowToWatchlist(TraktShow show)
+    {
+      var shows = new TraktSyncShows
+      {
+        Shows = new List<TraktShow>() { show }
+      };
+
+      return AddShowsToWatchlist(shows);
+    }
+
+    public static TraktSyncResponse AddShowToWatchlistEx(TraktSyncShowEx show)
+    {
+      var shows = new TraktSyncShowsEx
+      {
+        Shows = new List<TraktSyncShowEx>() { show }
+      };
+
+      return AddShowsToWatchlistEx(shows);
+    }
+
+    public static TraktSyncResponse AddSeasonToWatchlist(TraktSyncSeasonEx show)
+    {
+      var shows = new TraktSyncSeasonsEx
+      {
+        Shows = new List<TraktSyncSeasonEx>() { show }
+      };
+
+      return AddSeasonsToWatchlist(shows);
+    }
+
+    public static TraktSyncResponse RemoveSeasonFromWatchlist(TraktSyncSeasonEx show)
+    {
+      var shows = new TraktSyncSeasonsEx
+      {
+        Shows = new List<TraktSyncSeasonEx>() { show }
+      };
+
+      return RemoveSeasonsFromWatchlist(shows);
+    }
+
+    public static TraktSyncResponse RemoveShowFromWatchlist(TraktShow show)
+    {
+      var shows = new TraktSyncShows
+      {
+        Shows = new List<TraktShow>() { show }
+      };
+
+      return RemoveShowsFromWatchlist(shows);
+    }
+
+    public static TraktSyncResponse RemoveShowFromWatchlistEx(TraktSyncShowEx show)
+    {
+      var shows = new TraktSyncShowsEx
+      {
+        Shows = new List<TraktSyncShowEx>() { show }
+      };
+
+      return RemoveShowsFromWatchlistEx(shows);
+    }
+
+    public static TraktSyncResponse AddEpisodeToWatchlist(TraktEpisode episode)
+    {
+      var episodes = new TraktSyncEpisodes
+      {
+        Episodes = new List<TraktEpisode>() { episode }
+      };
+
+      return AddEpisodesToWatchlist(episodes);
+    }
+
+    public static TraktSyncResponse RemoveEpisodeFromWatchlist(TraktEpisode episode)
+    {
+      var episodes = new TraktSyncEpisodes
+      {
+        Episodes = new List<TraktEpisode>() { episode }
+      };
+
+      return RemoveEpisodesFromWatchlist(episodes);
+    }
+
+    #endregion
+
+    #region Comments
+
+    public static bool LikeComment(int id)
+    {
+      var response = PostToTrakt(string.Format(TraktURIs.CommentLike, id), null);
+      return response != null;
+    }
+
+    public static bool UnLikeComment(int id)
+    {
+      return DeleteFromTrakt(string.Format(TraktURIs.CommentLike, id));
+    }
+
+    public static IEnumerable<TraktComment> GetCommentReplies(string id)
+    {
+      var response = GetFromTrakt(string.Format(TraktURIs.CommentReplies, id));
+      return response.FromJSONArray<TraktComment>();
+    }
+
+    #endregion
+
+    #region People
+
+    public static TraktPersonSummary GetPersonSummary(string person)
+    {
+      var response = GetFromTrakt(string.Format(TraktURIs.PersonSummary, person));
+      return response.FromJSON<TraktPersonSummary>();
+    }
+
+    public static TraktPersonMovieCredits GetMovieCreditsForPerson(string person)
+    {
+      var response = GetFromTrakt(string.Format(TraktURIs.PersonMovieCredits, person));
+      return response.FromJSON<TraktPersonMovieCredits>();
+    }
+
+    public static TraktPersonShowCredits GetShowCreditsForPerson(string person)
+    {
+      var response = GetFromTrakt(string.Format(TraktURIs.PersonShowCredits, person));
+      return response.FromJSON<TraktPersonShowCredits>();
+    }
+
+    #endregion
+
+    #region Web Helpers
+
+    private static string ReplaceOnTrakt(string address, string postData)
+    {
+      return PostToTrakt(address, postData, true, "PUT");
+    }
+
+    private static bool DeleteFromTrakt(string address)
+    {
+      var response = GetFromTrakt(address, "DELETE");
+      return response != null;
+    }
+
+    private static string GetFromTrakt(string address, string method = "GET", bool sendOAuth = true)
+    {
+      WebHeaderCollection headerCollection;
+      return GetFromTrakt(address, out headerCollection, method, sendOAuth);
+    }
+
+    private static string GetFromTrakt(string address, out WebHeaderCollection headerCollection, string method = "GET", bool sendOAuth = true)
+    {
+      headerCollection = new WebHeaderCollection();
+
+      if (UseSSL)
+      {
+        ServicePointManager.Expect100Continue = true;
+        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
+      }
+      else
+      {
+        address = address.Replace("https://", "http://");
+      }
+
+      if (OnDataSend != null)
+        OnDataSend(address, null);
+
+      Stopwatch watch;
+
+      var request = WebRequest.Create(address) as HttpWebRequest;
+
+      request.KeepAlive = true;
+      request.Method = method;
+      request.ContentLength = 0;
+      request.Timeout = 120000;
+      request.ContentType = "application/json";
+      request.UserAgent = UserAgent;
+
+      // add required headers for authorisation
+      request.Headers.Add("trakt-api-version", "2");
+      request.Headers.Add("trakt-api-key", ApplicationId);
+
+      // some methods we may want to get all data and not filtered by user data
+      // e.g. Calendar - All Shows
+      if (sendOAuth)
+      {
+        request.Headers.Add("trakt-user-login", Username ?? string.Empty);
+        request.Headers.Add("trakt-user-token", UserToken ?? string.Empty);
+      }
+
+      // measure how long it took to get a response
+      watch = Stopwatch.StartNew();
+
+      try
+      {
+        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
+        if (response == null)
+        {
+          watch.Stop();
+          return null;
+        }
+
+        Stream stream = response.GetResponseStream();
+        watch.Stop();
+
+        StreamReader reader = new StreamReader(stream);
+        string strResponse = reader.ReadToEnd();
+
+        headerCollection = response.Headers;
+
+        if (method == "DELETE")
+        {
+          strResponse = response.StatusCode == HttpStatusCode.NoContent ? "Item Deleted" : "Failed to delete item";
+        }
+
+        if (OnDataReceived != null)
+          OnDataReceived(strResponse, response);
+
+        if (OnLatency != null)
+          OnLatency(watch.Elapsed.TotalMilliseconds, response, 0, strResponse.Length * sizeof (Char));
+
+        stream.Close();
+        reader.Close();
+        response.Close();
+
+        return strResponse;
+      }
+      catch (WebException wex)
+      {
+        watch.Stop();
+
+        string errorMessage = wex.Message;
+        if (wex.Status == WebExceptionStatus.ProtocolError)
+        {
+          var response = wex.Response as HttpWebResponse;
+
+          string headers = string.Empty;
+          foreach (string key in response.Headers.AllKeys)
+          {
+            headers += string.Format("{0}: {1}, ", key, response.Headers[key]);
           }
-          catch { }
+          errorMessage = string.Format("Protocol Error, Code = '{0}', Description = '{1}', Url = '{2}', Headers = '{3}'", (int)response.StatusCode, response.StatusDescription, address, headers.TrimEnd(new char[] { ',', ' ' }));
+
+          if (OnLatency != null)
+            OnLatency(watch.Elapsed.TotalMilliseconds, response, 0, 0);
         }
 
-        // create a proper response object
-        TraktResponse error = new TraktResponse
+        if (OnDataError != null)
+          OnDataError(errorMessage);
+
+        return null;
+      }
+      catch (IOException ioe)
+      {
+        string errorMessage = string.Format("Request failed due to an IO error, Description = '{0}', Url = '{1}', Method = '{2}'", ioe.Message, address, method);
+
+        if (OnDataError != null)
+          OnDataError(ioe.Message);
+
+        return null;
+      }
+    }
+
+    private static string PostToTrakt(string address, string postData, bool logRequest = true, string method = "POST")
+    {
+      if (UseSSL)
+      {
+        ServicePointManager.Expect100Continue = true;
+        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;
+      }
+      else
+      {
+        address = address.Replace("https://", "http://");
+      }
+
+      if (OnDataSend != null && logRequest)
+        OnDataSend(address, postData);
+
+      Stopwatch watch;
+
+      if (postData == null)
+        postData = string.Empty;
+
+      byte[] data = new UTF8Encoding().GetBytes(postData);
+
+      var request = WebRequest.Create(address) as HttpWebRequest;
+      request.KeepAlive = true;
+
+      request.Method = method;
+      request.ContentLength = data.Length;
+      request.Timeout = 120000;
+      request.ContentType = "application/json";
+      request.UserAgent = UserAgent;
+
+      // add required headers for authorisation
+      request.Headers.Add("trakt-api-version", "2");
+      request.Headers.Add("trakt-api-key", ApplicationId);
+
+      // if we're logging in, we don't need to add these headers
+      if (!string.IsNullOrEmpty(UserToken))
+      {
+        request.Headers.Add("trakt-user-login", Username);
+        request.Headers.Add("trakt-user-token", UserToken);
+      }
+
+      // measure how long it took to get a response
+      watch = Stopwatch.StartNew();
+
+      try
+      {
+        // post to trakt
+        Stream postStream = request.GetRequestStream();
+        postStream.Write(data, 0, data.Length);
+
+        // get the response
+        var response = (HttpWebResponse)request.GetResponse();
+        watch.Stop();
+
+        if (response == null)
+          return null;
+
+        Stream responseStream = response.GetResponseStream();
+        var reader = new StreamReader(responseStream);
+        string strResponse = reader.ReadToEnd();
+
+        if (string.IsNullOrEmpty(strResponse))
         {
-          Status = "failure",
-          Error = e.Message
-        };
-        return error.ToJSON();
+          strResponse = response.StatusCode.ToString();
+        }
+
+        if (OnDataReceived != null)
+          OnDataReceived(strResponse, response);
+
+        if (OnLatency != null)
+          OnLatency(watch.Elapsed.TotalMilliseconds, response, postData.Length * sizeof (Char), strResponse.Length * sizeof (Char));
+
+        // cleanup
+        postStream.Close();
+        responseStream.Close();
+        reader.Close();
+        response.Close();
+
+        return strResponse;
+      }
+      catch (WebException ex)
+      {
+        watch.Stop();
+
+        string result = null;
+        string errorMessage = ex.Message;
+        if (ex.Status == WebExceptionStatus.ProtocolError)
+        {
+          var response = ex.Response as HttpWebResponse;
+
+          string headers = string.Empty;
+          foreach (string key in response.Headers.AllKeys)
+          {
+            headers += string.Format("{0}: {1}, ", key, response.Headers[key]);
+          }
+          errorMessage = string.Format("Protocol Error, Code = '{0}', Description = '{1}', Url = '{2}', Headers = '{3}'", (int)response.StatusCode, response.StatusDescription, address, headers.TrimEnd(new char[] { ',', ' ' }));
+
+          result = new TraktStatus { Code = (int)response.StatusCode, Description = response.StatusDescription }.ToJSON();
+
+          if (OnLatency != null)
+            OnLatency(watch.Elapsed.TotalMilliseconds, response, postData.Length * sizeof (Char), 0);
+        }
+
+        if (OnDataError != null)
+          OnDataError(errorMessage);
+
+        return result;
+      }
+      catch (IOException ioe)
+      {
+        string errorMessage = string.Format("Request failed due to an IO error, Description = '{0}', Url = '{1}', Method = '{2}'", ioe.Message, address, method);
+
+        if (OnDataError != null)
+          OnDataError(ioe.Message);
+
+        return null;
       }
     }
 
     #endregion
+
+    #endregion
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktLogger.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktLogger.cs
index fb5cb3e..282ef6a 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktLogger.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktLogger.cs
@@ -1,24 +1,79 @@
 ﻿using System;
-using MediaPortal.Common;
-using MediaPortal.Common.Logging;
+using System.IO;
+using System.Linq;
+using System.Net;
+using System.Threading;
 using MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures;
+using MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.Extension;
 
 namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
 {
-  static class TraktLogger
+  public static class TraktLogger
   {
+    private static Object lockObject = new object();
+    //private static string latencyFilename = Config.GetFile(Config.Dir.Log, "TraktPlugin-Latencies.csv");
+    //private static string logFilename = Config.GetFile(Config.Dir.Log, "TraktPlugin.log");
+    //private static string logFilePattern = Config.GetFile(Config.Dir.Log, "TraktPlugin.{0}.log");
+
+    internal delegate void OnLogReceivedDelegate(string message, bool error);
+
+    internal static event OnLogReceivedDelegate OnLogReceived;
+
     static TraktLogger()
     {
+      // default logging before we load settings
+      TraktSettings.LogLevel = 2;
+
+      #region Log Rollover
+
+      // get max number of log files to create
+      int maxLogFiles = 5;
+
+      // delete legacy backup
+      //DeleteFile(Config.GetFile(Config.Dir.Log, "TraktPlugin.bak"));
+
+      //// delete oldest log file if it exists
+      //string newLogFile = string.Empty;
+      //string oldLogFile = string.Format(logFilePattern, maxLogFiles);
+      //DeleteFile(oldLogFile);
+
+      //// move the other older log files up one slot
+      //for (int i = maxLogFiles - 1; i > 0; i--)
+      //{
+      //    oldLogFile = string.Format(logFilePattern, i);
+      //    newLogFile = string.Format(logFilePattern, i + 1);
+      //    MoveFile(oldLogFile, newLogFile);
+      //}
+
+      //// move the most recent log file up into the backup slots
+      //newLogFile = string.Format(logFilePattern, 1);
+      //MoveFile(logFilename, newLogFile);
+
+      #endregion
+
+      #region Latency Rollover
+
+      #endregion
+
+      // write latency header
+      //if (!File.Exists(latencyFilename))
+      //    CreateLatencyHeader();
+
       // listen to webclient events from the TraktAPI so we can provide useful logging            
-      TraktAPI.OnDataSend += TraktAPI_OnDataSend;
-      TraktAPI.OnDataError += TraktAPI_OnDataError;
-      TraktAPI.OnDataReceived += TraktAPI_OnDataReceived;
+      TraktAPI.OnDataSend += new TraktAPI.OnDataSendDelegate(TraktAPI_OnDataSend);
+      TraktAPI.OnDataError += new TraktAPI.OnDataErrorDelegate(TraktAPI_OnDataError);
+      TraktAPI.OnDataReceived += new TraktAPI.OnDataReceivedDelegate(TraktAPI_OnDataReceived);
+      TraktAPI.OnLatency += new TraktAPI.OnLatencyDelegate(TraktAPI_OnLatency);
     }
 
     internal static void Info(String log)
     {
+      // log to configuration window
+      if (TraktSettings.IsConfiguration == true)
+        OnLogReceived(log, false);
+
       if (TraktSettings.LogLevel >= 2)
-        ServiceRegistration.Get<ILogger>().Info(log);
+        WriteToFile(String.Format(CreatePrefix(), "INFO", log));
     }
 
     internal static void Info(String format, params Object[] args)
@@ -29,7 +84,7 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
     internal static void Debug(String log)
     {
       if (TraktSettings.LogLevel >= 3)
-        ServiceRegistration.Get<ILogger>().Debug(log);
+        WriteToFile(String.Format(CreatePrefix(), "DEBG", log));
     }
 
     internal static void Debug(String format, params Object[] args)
@@ -39,8 +94,12 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
 
     internal static void Error(String log)
     {
+      // log to configuration window
+      if (TraktSettings.IsConfiguration == true)
+        OnLogReceived(log, true);
+
       if (TraktSettings.LogLevel >= 0)
-        ServiceRegistration.Get<ILogger>().Error(log);
+        WriteToFile(String.Format(CreatePrefix(), "ERR ", log));
     }
 
     internal static void Error(String format, params Object[] args)
@@ -51,7 +110,7 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
     internal static void Warning(String log)
     {
       if (TraktSettings.LogLevel >= 1)
-        ServiceRegistration.Get<ILogger>().Warn(log);
+        WriteToFile(String.Format(CreatePrefix(), "WARN", log));
     }
 
     internal static void Warning(String format, params Object[] args)
@@ -59,6 +118,78 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
       Warning(String.Format(format, args));
     }
 
+    private static String CreatePrefix()
+    {
+      return DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss.fff") + " [{0}] " + String.Format("[{0}][{1}]", Thread.CurrentThread.Name, Thread.CurrentThread.ManagedThreadId.ToString().PadLeft(2, '0')) + ": {1}";
+    }
+
+    private static void CreateLatencyHeader()
+    {
+      string header = "TimeStamp (UTC),Absolute Path,Query,Method,Status Code,Status Description,Data Sent (Bytes),Data Received (Bytes),Server Execution Time (ms),Total Time Taken (ms)";
+      WriteLatency(header);
+    }
+
+    private static void DeleteFile(String log)
+    {
+      if (File.Exists(log))
+      {
+        try
+        {
+          File.Delete(log);
+        }
+        catch
+        {
+        }
+      }
+    }
+
+    private static void MoveFile(String oldlog, String newLog)
+    {
+      if (File.Exists(oldlog))
+      {
+        // Move to next backup slot
+        try
+        {
+          File.Move(oldlog, newLog);
+        }
+        catch
+        {
+        }
+      }
+    }
+
+    private static void WriteToFile(String log)
+    {
+      try
+      {
+        lock (lockObject)
+        {
+          //StreamWriter sw = File.AppendText(logFilename);
+          //sw.WriteLine(log);
+          //sw.Close();
+        }
+      }
+      catch
+      {
+      }
+    }
+
+    private static void WriteLatency(String latency)
+    {
+      try
+      {
+        //lock (lockObject)
+        //{
+        //    StreamWriter sw = File.AppendText(latencyFilename);
+        //    sw.WriteLine(latency);
+        //    sw.Close();
+        //}
+      }
+      catch
+      {
+      }
+    }
+
     private static void TraktAPI_OnDataSend(string address, string data)
     {
       if (!string.IsNullOrEmpty(data))
@@ -71,14 +202,45 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
       }
     }
 
-    private static void TraktAPI_OnDataReceived(string response)
+    private static void TraktAPI_OnDataReceived(string response, HttpWebResponse webResponse)
     {
-      Debug("Response: {0}", response ?? "null");
+      if (TraktSettings.LogLevel >= 3)
+      {
+        string headers = string.Empty;
+        foreach (string key in webResponse.Headers.AllKeys)
+        {
+          headers += string.Format("{0}: {1}, ", key, webResponse.Headers[key]);
+        }
+
+        Debug("Response: {0}, Headers: {{{1}}}", response ?? "null", headers.TrimEnd(new char[] { ',', ' ' }));
+      }
     }
 
     private static void TraktAPI_OnDataError(string error)
     {
-      Error("WebException: {0}", error);
+      Error(error);
+    }
+
+    private static void TraktAPI_OnLatency(double totalTimeTaken, HttpWebResponse webResponse, int dataSent, int dataReceived)
+    {
+      double serverRuntime = 0.0;
+      string[] headers = webResponse.Headers.AllKeys;
+      if (headers.Contains("X-Runtime"))
+      {
+        double.TryParse(webResponse.Headers["X-Runtime"], out serverRuntime);
+
+        // convert to milliseconds from seconds
+        serverRuntime *= 1000.0;
+      }
+
+      // escape query string as it contains comma's
+      string query = webResponse.ResponseUri.Query;
+      if (!string.IsNullOrEmpty(query) && query.Contains(','))
+      {
+        query = "\"" + query + "\"";
+      }
+
+      //WriteLatency(string.Format("{0},{1},{2},{3},{4},{5},{6},{7},{8},{9}", DateTime.UtcNow.ToISO8601(), webResponse.ResponseUri.AbsolutePath, query, webResponse.Method, (int)webResponse.StatusCode, webResponse.StatusDescription, dataSent, dataReceived, serverRuntime, totalTimeTaken));
     }
 
     /// <summary>
@@ -86,49 +248,44 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
     /// </summary>
     /// <typeparam name="T">Response Type of message</typeparam>
     /// <param name="response">The response object holding the message to log</param>
-    internal static bool LogTraktResponse<T>(T response)
+    public static bool LogTraktResponse<T>(T response)
     {
-      try
+      if (response == null)
       {
-        TraktResponse traktResponse = (response as TraktResponse);
-        if (traktResponse == null || traktResponse.Status == null)
-        {
-          // server is probably temporarily unavailable
-          // return true even though it failed, so we can try again
-          // currently the return value is only being used in livetv/recordings
-          Error("Response from server was unexpected.");
-          return true;
-        }
-
-        // check response error status
-        if (traktResponse.Status != "success")
-        {
-          Error(traktResponse.Error == "The remote server returned an error: (401) Unauthorized." ? "401 Unauthorized, Please check your Username and Password" : traktResponse.Error);
-          return false;
-        }
+        // we already log errors which would normally not be able to be deserialised
+        // currently the return value is only being used in livetv/recordings
+        return true;
+      }
 
-        // success
-        if (!string.IsNullOrEmpty(traktResponse.Message))
-        {
-          Info("Response: {0}", traktResponse.Message);
-        }
-        else
+      try
+      {
+        // only log the response if we don't have debug logging enabled
+        // we already log all responses in debug level
+        if (TraktSettings.LogLevel < 3)
         {
-          // no message returned on movie sync success
-          TraktSyncResponse traktSyncResponse = (response as TraktSyncResponse);
-          if (traktSyncResponse != null)
+          if ((response is TraktSyncResponse))
           {
-            string message = "Response: Items Inserted: {0}, Items Already Exist: {1}, Items Skipped: {2}";
-            Info(message, traktSyncResponse.Inserted, traktSyncResponse.AlreadyExist, traktSyncResponse.Skipped);
+            Info("Sync Response: {0}", (response as TraktSyncResponse).ToJSON());
+          }
+          else if ((response is TraktScrobbleResponse))
+          {
+            // status code will be greater than 0 if we caught an error
+            // we already log errors so we can supress the scrobble log result
+            var scrobbleResponse = response as TraktScrobbleResponse;
+            if (scrobbleResponse != null && scrobbleResponse.Code == 0)
+            {
+              Info("Scrobble Response: {0}", scrobbleResponse.ToJSON());
+            }
           }
         }
+
         return true;
       }
       catch (Exception)
       {
-        Info("Response: {0}", "Failed to interpret response from server");
+        Info("Response: Failed to interpret response from server");
         return false;
       }
     }
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktSettings.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktSettings.cs
index 4678941..2f94289 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktSettings.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktSettings.cs
@@ -1,19 +1,21 @@
 ﻿using System;
 using System.Collections.Generic;
+using System.IO;
 using System.Reflection;
-using System.Threading;
 using MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.DataStructures;
+using MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt.Enums;
 
 namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
 {
   public class TraktSettings
   {
-    private readonly Object _lockObject = new object();
+    private static Object lockObject = new object();
 
     #region Settings
-    int SettingsVersion = 1;
 
-    public List<TraktAuthentication> UserLogins { get; set; }
+    private int SettingsVersion = 1;
+
+    public static List<TraktAuthentication> UserLogins { get; set; }
     public bool KeepTraktLibraryClean { get; set; }
     public List<String> BlockedFilenames { get; set; }
     public List<String> BlockedFolders { get; set; }
@@ -32,6 +34,11 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
     public int WatchListShowsDefaultLayout { get; set; }
     public int WatchListEpisodesDefaultLayout { get; set; }
     public int ListsDefaultLayout { get; set; }
+    public static TraktLastSyncActivities LastSyncActivities { get; set; }
+    public static IEnumerable<TraktCache.ListActivity> LastListActivities { get; set; }
+    public static bool SkipMoviesWithNoIdsOnSync { get; set; }
+    public static int SyncBatchSize { get; set; }
+    public static int SyncPlaybackCacheExpiry { get; set; }
     public int ListItemsDefaultLayout { get; set; }
     public int RelatedMoviesDefaultLayout { get; set; }
     public int RelatedShowsDefaultLayout { get; set; }
@@ -44,7 +51,7 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
     public int DefaultCalendarStartDate { get; set; }
     public bool DownloadFullSizeFanart { get; set; }
     public bool DownloadFanart { get; set; }
-    public int WebRequestCacheMinutes { get; set; }
+    public static int WebRequestCacheMinutes { get; set; }
     public bool GetFollowerRequestsOnStartup { get; set; }
     public int MovingPicturesCategoryId { get; set; }
     public bool MovingPicturesCategories { get; set; }
@@ -112,6 +119,7 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
     public bool FilterTrendingOnDashboard { get; set; }
     public bool UseTrailersPlugin { get; set; }
     public bool IgnoreWatchedPercentOnDVD { get; set; }
+
     #endregion
 
     #region Constants
@@ -127,10 +135,7 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
 
     public static string Username
     {
-      get
-      {
-        return _username;
-      }
+      get { return _username; }
       set
       {
         _username = value;
@@ -138,14 +143,11 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
       }
     }
 
-    static string _username = null;
+    private static string _username = null;
 
     public static string Password
     {
-      get
-      {
-        return _password;
-      }
+      get { return _password; }
       set
       {
         _password = value;
@@ -153,60 +155,56 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
       }
     }
 
-    static string _password = null;
+    private static string _password = null;
 
     /// <summary>
     /// Show Advanced or Simple Ratings Dialog
     /// Settings is Synced from Server
     /// </summary>
-    public bool ShowAdvancedRatingsDialog
-    {
-      get
-      {
-        return _showAdvancedRatingsDialogs;
-      }
-      set
-      {
-        // allow last saved setting to be available immediately
-        _showAdvancedRatingsDialogs = value;
-
-        // sync setting - delay on startup
-        Thread syncSetting = new Thread(o =>
-        {
-          if (string.IsNullOrEmpty(Username) || string.IsNullOrEmpty(Password))
-            return;
-
-          Thread.Sleep(5000);
-          TraktLogger.Info("Loading Online Settings");
-
-          TraktAccountSettings settings = TraktAPI.GetAccountSettings();
-          if (settings != null && settings.Status == "success")
-          {
-            _showAdvancedRatingsDialogs = settings.ViewingSettings.RatingSettings.Mode == "advanced";
-          }
-          else
-          {
-            TraktLogger.Error("Failed to retrieve trakt settings online.");
-          }
-        })
-        {
-          IsBackground = true,
-          Name = "Settings"
-        };
-        syncSetting.Start();
-      }
-    }
-    bool _showAdvancedRatingsDialogs;
-
+    //public bool ShowAdvancedRatingsDialog
+    //{
+    //  get
+    //  {
+    //    return _showAdvancedRatingsDialogs;
+    //  }
+    //  set
+    //  {
+    //    // allow last saved setting to be available immediately
+    //    _showAdvancedRatingsDialogs = value;
+
+    //    // sync setting - delay on startup
+    //    Thread syncSetting = new Thread(o =>
+    //    {
+    //      if (string.IsNullOrEmpty(Username) || string.IsNullOrEmpty(Password))
+    //        return;
+
+    //      Thread.Sleep(5000);
+    //      TraktLogger.Info("Loading Online Settings");
+
+    //      TraktAccountSettings settings = TraktAPI.GetAccountSettings();
+    //      if (settings != null && settings.Status == "success")
+    //      {
+    //        _showAdvancedRatingsDialogs = settings.ViewingSettings.RatingSettings.Mode == "advanced";
+    //      }
+    //      else
+    //      {
+    //        TraktLogger.Error("Failed to retrieve trakt settings online.");
+    //      }
+    //    })
+    //    {
+    //      IsBackground = true,
+    //      Name = "Settings"
+    //    };
+    //    syncSetting.Start();
+    //  }
+    //}
+    //bool _showAdvancedRatingsDialogs;
     /// <summary>
     /// Version of Plugin
     /// </summary>
     public static string Version
     {
-      get
-      {
-        return Assembly.GetCallingAssembly().GetName().Version.ToString();
-      }
+      get { return Assembly.GetCallingAssembly().GetName().Version.ToString(); }
     }
 
     /// <summary>
@@ -214,46 +212,39 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
     /// </summary>
     public string UserAgent
     {
-      get
-      {
-        return string.Format("TraktForMediaPortal/{0}", Version);
-      }
+      get { return string.Format("TraktForMediaPortal/{0}", Version); }
     }
 
     /// <summary>
     /// The current connection status to trakt.tv
     /// </summary>
-    public ConnectionState AccountStatus
+    public static ConnectionState AccountStatus
     {
       get
       {
-        lock (_lockObject)
+        lock (lockObject)
         {
-          if (_accountStatus == ConnectionState.Pending)
+          if (_AccountStatus == ConnectionState.Pending)
           {
             // update state, to inform we are connecting now
-            _accountStatus = ConnectionState.Connecting;
+            _AccountStatus = ConnectionState.Connecting;
 
-            TraktLogger.Info("Signing into trakt.tv");
+            TraktLogger.Info("Logging into trakt.tv");
 
-            if (string.IsNullOrEmpty(TraktSettings.Username) || string.IsNullOrEmpty(TraktSettings.Password))
+            if (string.IsNullOrEmpty(Username) || string.IsNullOrEmpty(Password))
             {
-              TraktLogger.Info("Username and/or Password is empty in settings!");
+              TraktLogger.Info("Unable to login to trakt.tv, username and/or password is empty");
               return ConnectionState.Disconnected;
             }
 
-            // test connection
-            TraktAccount account = new TraktAccount
+            var response = TraktAPI.Login();
+            if (response != null && !string.IsNullOrEmpty(response.Token))
             {
-              Username = Username,
-              Password = Password
-            };
+              // set the user token for all future requests
+              TraktAPI.UserToken = response.Token;
 
-            TraktResponse response = TraktAPI.TestAccount(account);
-            if (response != null && response.Status == "success")
-            {
-              TraktLogger.Info("User {0} signed into trakt.", Username);
-              _accountStatus = ConnectionState.Connected;
+              TraktLogger.Info("User {0} successfully signed into trakt.tv", Username);
+              _AccountStatus = ConnectionState.Connected;
 
               if (!UserLogins.Exists(u => u.Username == Username))
               {
@@ -262,26 +253,99 @@ namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
             }
             else
             {
-              TraktLogger.Info("Username and/or Password is Invalid!");
-              _accountStatus = ConnectionState.Invalid;
+              // check the error code for the type of error retured
+              if (response != null && response.Description != null)
+              {
+                TraktLogger.Error("Login to trakt.tv failed, Code = '{0}', Reason = '{1}'", response.Code, response.Description);
+
+                switch (response.Code)
+                {
+                  case 401:
+                    _AccountStatus = ConnectionState.UnAuthorised;
+                    break;
+
+                  default:
+                    _AccountStatus = ConnectionState.Invalid;
+                    break;
+                }
+              }
+              else
+              {
+                // very unlikely to ever hit this condition since we should get some sort of protocol error
+                // if a problem with login or server error
+                _AccountStatus = ConnectionState.Invalid;
+              }
             }
           }
         }
-        return _accountStatus;
+        return _AccountStatus;
       }
       set
       {
-        lock (_lockObject)
+        lock (lockObject)
         {
-          _accountStatus = value;
+          _AccountStatus = value;
+        }
+      }
+    }
+
+    public static ConnectionState _AccountStatus = ConnectionState.Pending;
+
+    /// <summary>
+    /// Build Date of Plugin
+    /// </summary>
+    public static string BuildDate
+    {
+      get
+      {
+        if (_BuildDate == null)
+        {
+          const int PeHeaderOffset = 60;
+          const int LinkerTimestampOffset = 8;
+
+          byte[] buffer = new byte[2047];
+          using (Stream stream = new FileStream(Assembly.GetAssembly(typeof(TraktSettings)).Location, FileMode.Open, FileAccess.Read))
+          {
+            stream.Read(buffer, 0, 2047);
+          }
+
+          int secondsSince1970 = BitConverter.ToInt32(buffer, BitConverter.ToInt32(buffer, PeHeaderOffset) + LinkerTimestampOffset);
+
+          _BuildDate = new DateTime(1970, 1, 1, 0, 0, 0).AddSeconds(secondsSince1970).ToString("yyyy-MM-dd");
         }
+        return _BuildDate;
       }
     }
-    ConnectionState _accountStatus = ConnectionState.Pending;
+
+    private static string _BuildDate;
 
     #endregion
 
+    public static bool? IsConfiguration
+    {
+      get
+      {
+        if (_isConfiguration == null)
+        {
+          try
+          {
+            var entryAssembly = Assembly.GetEntryAssembly();
+
+            _isConfiguration = !Path.GetFileNameWithoutExtension(entryAssembly.Location).Equals("mediaportal", StringComparison.InvariantCultureIgnoreCase);
+          }
+          catch
+          {
+            _isConfiguration = false;
+          }
+        }
+        return _isConfiguration;
+      }
+    }
+
+    private static bool? _isConfiguration;
+
     #region Methods
+
     /// <summary>
     /// Loads the Settings
     /// </summary>
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktURIs.cs b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktURIs.cs
index f3bcff1..293a41b 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktURIs.cs
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/Libraries/Trakt/TraktURIs.cs
@@ -1,94 +1,220 @@
-﻿namespace MediaPortal.Extensions.OnlineLibraries.Libraries.Trakt
+﻿namespace MediaPortal.Extensions.OnlineLibraries.Libraries.TraktAPI
 {
   /// <summary>
   /// List of URIs for the Trakt API
   /// </summary>
   public static class TraktURIs
   {
-    public const string ApiKey = "32414037ddd94db084ca56be1a60095f0d7520db"; // MP2 specific
-    public const string ScrobbleShow = @"http://api.trakt.tv/show/{0}/" + ApiKey;
-    public const string ScrobbleMovie = @"http://api.trakt.tv/movie/{0}/" + ApiKey;
-    public const string UserWatchedEpisodes = @"http://api.trakt.tv/user/library/shows/watched.json/" + ApiKey + @"/{0}{1}";
-    public const string UserWatchedMovies = @"http://api.trakt.tv/user/watched/movies.json/" + ApiKey + @"/{0}";
-    public const string UserProfile = @"http://api.trakt.tv/user/profile.json/" + ApiKey + @"/{0}";
-    public const string SeriesOverview = @"http://api.trakt.tv/show/summary.json/" + ApiKey + @"/{0}";
-    public const string SeriesOverviewExtended = @"http://api.trakt.tv/show/summary.json/" + ApiKey + @"/{0}/extended";
-    public const string UserEpisodesUnSeen = @"http://api.trakt.tv/user/library/shows/unseen.json/" + ApiKey + @"/{0}{1}";
-    public const string UserEpisodesCollection = @"http://api.trakt.tv/user/library/shows/collection.json/" + ApiKey + @"/{0}{1}";
-    public const string UserMoviesCollection = @"http://api.trakt.tv/user/library/movies/collection.json/" + ApiKey + @"/{0}";
-    public const string UserMoviesAll = @"http://api.trakt.tv/user/library/movies/all.json/" + ApiKey + @"/{0}{1}";
-    public const string SyncEpisodeLibrary = @"http://api.trakt.tv/show/episode/{0}/" + ApiKey;
-    public const string SyncShowWatchList = @"http://api.trakt.tv/show/{0}/" + ApiKey;
-    public const string SyncEpisodeWatchList = @"http://api.trakt.tv/show/episode/{0}/" + ApiKey;
-    public const string SyncMovieLibrary = @"http://api.trakt.tv/movie/{0}/" + ApiKey;
-    public const string SyncMovieWatchList = @"http://api.trakt.tv/movie/watchlist/" + ApiKey;
-    public const string MovieOverview = @"http://api.trakt.tv/movie/summary.json/" + ApiKey + @"/{0}";
-    public const string UserCalendarShows = @"http://api.trakt.tv/user/calendar/shows.json/" + ApiKey + @"/{0}/{1}/{2}";
-    public const string CalendarPremieres = @"http://api.trakt.tv/calendar/premieres.json/" + ApiKey + @"/{0}/{1}";
-    public const string CalendarAllShows = @"http://api.trakt.tv/calendar/shows.json/" + ApiKey + @"/{0}/{1}";
-    public const string UserFriends = @"http://api.trakt.tv/user/friends.json/" + ApiKey + @"/{0}";
-    public const string UserFriendsExtended = @"http://api.trakt.tv/user/friends.json/" + ApiKey + @"/{0}/extended";
-    public const string RateItem = @"http://api.trakt.tv/rate/{0}/" + ApiKey;
-    public const string TrendingMovies = @"http://api.trakt.tv/movies/trending.json/" + ApiKey;
-    public const string TrendingShows = @"http://api.trakt.tv/shows/trending.json/" + ApiKey;
-    public const string UserMovieRecommendations = @"http://api.trakt.tv/recommendations/movies/" + ApiKey;
-    public const string UserShowsRecommendations = @"http://api.trakt.tv/recommendations/shows/" + ApiKey;
-    public const string UserMovieWatchList = @"http://api.trakt.tv/user/watchlist/movies.json/" + ApiKey + @"/{0}";
-    public const string UserShowsWatchList = @"http://api.trakt.tv/user/watchlist/shows.json/" + ApiKey + @"/{0}";
-    public const string UserEpisodesWatchList = @"http://api.trakt.tv/user/watchlist/episodes.json/" + ApiKey + @"/{0}";
-    public const string UserRatedMoviesList = @"http://api.trakt.tv/user/ratings/movies.json/" + ApiKey + @"/{0}";
-    public const string UserRatedShowsList = @"http://api.trakt.tv/user/ratings/shows.json/" + ApiKey + @"/{0}";
-    public const string UserRatedEpisodesList = @"http://api.trakt.tv/user/ratings/episodes.json/" + ApiKey + @"/{0}";
-    public const string CreateAccount = @"http://api.trakt.tv/account/create/" + ApiKey;
-    public const string TestAccount = @"http://api.trakt.tv/account/test/" + ApiKey;
-    public const string UserEpisodeWatchedHistory = @"http://api.trakt.tv/user/watched/episodes.json/" + ApiKey + @"/{0}";
-    public const string UserMovieWatchedHistory = @"http://api.trakt.tv/user/watched/movies.json/" + ApiKey + @"/{0}";
-    public const string Friends = @"http://api.trakt.tv/friends/all/" + ApiKey;
-    public const string FriendRequests = @"http://api.trakt.tv/friends/requests/" + ApiKey;
-    public const string FriendAdd = @"http://api.trakt.tv/friends/add/" + ApiKey;
-    public const string FriendApprove = @"http://api.trakt.tv/friends/approve/" + ApiKey;
-    public const string FriendDeny = @"http://api.trakt.tv/friends/deny/" + ApiKey;
-    public const string FriendDelete = @"http://api.trakt.tv/friends/delete/" + ApiKey;
-    public const string SearchUsers = @"http://api.trakt.tv/search/users.json/" + ApiKey + @"?query={0}&limit={1}";
-    public const string SearchMovies = @"http://api.trakt.tv/search/movies.json/" + ApiKey + @"?query={0}&limit={1}";
-    public const string SearchShows = @"http://api.trakt.tv/search/shows.json/" + ApiKey + @"?query={0}&limit={1}";
-    public const string SearchEpisodes = @"http://api.trakt.tv/search/episodes.json/" + ApiKey + @"?query={0}&limit={1}";
-    public const string SearchPeople = @"http://api.trakt.tv/search/people.json/" + ApiKey + @"?query={0}&limit={1}";
-    public const string MovieShouts = @"http://api.trakt.tv/movie/comments.json/" + ApiKey + @"/{0}";
-    public const string ShowShouts = @"http://api.trakt.tv/show/comments.json/" + ApiKey + @"/{0}";
-    public const string EpisodeShouts = @"http://api.trakt.tv/show/episode/comments.json/" + ApiKey + @"/{0}/{1}/{2}";
-    public const string DismissMovieRecommendation = @"http://api.trakt.tv/recommendations/movies/dismiss/" + ApiKey;
-    public const string DismissShowRecommendation = @"http://api.trakt.tv/recommendations/shows/dismiss/" + ApiKey;
-    public const string ListAdd = @"http://api.trakt.tv/lists/add/" + ApiKey;
-    public const string ListDelete = @"http://api.trakt.tv/lists/delete/" + ApiKey;
-    public const string ListItemsAdd = @"http://api.trakt.tv/lists/items/add/" + ApiKey;
-    public const string ListItemsDelete = @"http://api.trakt.tv/lists/items/delete/" + ApiKey;
-    public const string ListUpdate = @"http://api.trakt.tv/lists/update/" + ApiKey;
-    public const string UserList = @"http://api.trakt.tv/user/list.json/" + ApiKey + @"/{0}/{1}";
-    public const string UserLists = @"http://api.trakt.tv/user/lists.json/" + ApiKey + @"/{0}";
-    public const string RelatedMovies = @"http://api.trakt.tv/movie/related.json/" + ApiKey + @"/{0}{1}";
-    public const string RelatedShows = @"http://api.trakt.tv/show/related.json/" + ApiKey + @"/{0}{1}";
-    public const string ActivityUser = @"http://api.trakt.tv/activity/user.json/" + ApiKey + @"/{0}/{1}/{2}";
-    public const string ActivityFriends = @"http://api.trakt.tv/activity/friends.json/" + ApiKey + @"/{0}/{1}{2}";
-    public const string ActivityFriendsMe = @"http://api.trakt.tv/activity/friendsme.json/" + ApiKey + @"/{0}/{1}{2}";
-    public const string ActivityCommunity = @"http://api.trakt.tv/activity/community.json/" + ApiKey + @"/{0}/{1}{2}";
-    public const string AccountSettings = @"http://api.trakt.tv/account/settings/" + ApiKey;
-    public const string RateMovies = @"http://api.trakt.tv/rate/movies/" + ApiKey;
-    public const string RateShows = @"http://api.trakt.tv/rate/shows/" + ApiKey;
-    public const string RateEpisodes = @"http://api.trakt.tv/rate/episodes/" + ApiKey;
-    public const string ShowSeasons = @"http://api.trakt.tv/show/seasons.json/" + ApiKey + @"/{0}";
-    public const string SeasonEpisodes = @"http://api.trakt.tv/show/season.json/" + ApiKey + @"/{0}/{1}";
-    public const string ShowSeen = @"http://api.trakt.tv/show/seen/" + ApiKey;
-    public const string SeasonSeen = @"http://api.trakt.tv/show/season/seen/" + ApiKey;
-    public const string ShowLibrary = @"http://api.trakt.tv/show/library/" + ApiKey;
-    public const string SeasonLibrary = @"http://api.trakt.tv/show/season/library/" + ApiKey;
-    public const string NetworkFriends = @"http://api.trakt.tv/user/network/friends.json/" + ApiKey + "/{0}";
-    public const string NetworkFollowers = @"http://api.trakt.tv/user/network/followers.json/" + ApiKey + "/{0}";
-    public const string NetworkFollowing = @"http://api.trakt.tv/user/network/following.json/" + ApiKey + "/{0}";
-    public const string NetworkRequests = @"http://api.trakt.tv/network/requests/" + ApiKey;
-    public const string NetworkFollow = @"http://api.trakt.tv/network/follow/" + ApiKey;
-    public const string NetworkUnFollow = @"http://api.trakt.tv/network/unfollow/" + ApiKey;
-    public const string NetworkApprove = @"http://api.trakt.tv/network/approve/" + ApiKey;
-    public const string NetworkDeny = @"http://api.trakt.tv/network/deny/" + ApiKey;
+    //public const string ApiKey = "32414037ddd94db084ca56be1a60095f0d7520db"; // MP2 specific
+    //public const string ScrobbleShow = @"http://api.trakt.tv/show/{0}/" + ApiKey;
+    //public const string ScrobbleMovie = @"http://api.trakt.tv/movie/{0}/" + ApiKey;
+    //public const string UserWatchedEpisodes = @"http://api.trakt.tv/user/library/shows/watched.json/" + ApiKey + @"/{0}{1}";
+    //public const string UserWatchedMovies = @"http://api.trakt.tv/user/watched/movies.json/" + ApiKey + @"/{0}";
+    //public const string UserProfile = @"http://api.trakt.tv/user/profile.json/" + ApiKey + @"/{0}";
+    //public const string SeriesOverview = @"http://api.trakt.tv/show/summary.json/" + ApiKey + @"/{0}";
+    //public const string SeriesOverviewExtended = @"http://api.trakt.tv/show/summary.json/" + ApiKey + @"/{0}/extended";
+    //public const string UserEpisodesUnSeen = @"http://api.trakt.tv/user/library/shows/unseen.json/" + ApiKey + @"/{0}{1}";
+    //public const string UserEpisodesCollection = @"http://api.trakt.tv/user/library/shows/collection.json/" + ApiKey + @"/{0}{1}";
+    //public const string UserMoviesCollection = @"http://api.trakt.tv/user/library/movies/collection.json/" + ApiKey + @"/{0}";
+    //public const string UserMoviesAll = @"http://api.trakt.tv/user/library/movies/all.json/" + ApiKey + @"/{0}{1}";
+    //public const string SyncEpisodeLibrary = @"http://api.trakt.tv/show/episode/{0}/" + ApiKey;
+    //public const string SyncShowWatchList = @"http://api.trakt.tv/show/{0}/" + ApiKey;
+    //public const string SyncEpisodeWatchList = @"http://api.trakt.tv/show/episode/{0}/" + ApiKey;
+    //public const string SyncMovieLibrary = @"http://api.trakt.tv/movie/{0}/" + ApiKey;
+    //public const string SyncMovieWatchList = @"http://api.trakt.tv/movie/watchlist/" + ApiKey;
+    //public const string MovieOverview = @"http://api.trakt.tv/movie/summary.json/" + ApiKey + @"/{0}";
+    //public const string UserCalendarShows = @"http://api.trakt.tv/user/calendar/shows.json/" + ApiKey + @"/{0}/{1}/{2}";
+    //public const string CalendarPremieres = @"http://api.trakt.tv/calendar/premieres.json/" + ApiKey + @"/{0}/{1}";
+    //public const string CalendarAllShows = @"http://api.trakt.tv/calendar/shows.json/" + ApiKey + @"/{0}/{1}";
+    //public const string UserFriends = @"http://api.trakt.tv/user/friends.json/" + ApiKey + @"/{0}";
+    //public const string UserFriendsExtended = @"http://api.trakt.tv/user/friends.json/" + ApiKey + @"/{0}/extended";
+    //public const string RateItem = @"http://api.trakt.tv/rate/{0}/" + ApiKey;
+    //public const string TrendingMovies = @"http://api.trakt.tv/movies/trending.json/" + ApiKey;
+    //public const string TrendingShows = @"http://api.trakt.tv/shows/trending.json/" + ApiKey;
+    //public const string UserMovieRecommendations = @"http://api.trakt.tv/recommendations/movies/" + ApiKey;
+    //public const string UserShowsRecommendations = @"http://api.trakt.tv/recommendations/shows/" + ApiKey;
+    //public const string UserMovieWatchList = @"http://api.trakt.tv/user/watchlist/movies.json/" + ApiKey + @"/{0}";
+    //public const string UserShowsWatchList = @"http://api.trakt.tv/user/watchlist/shows.json/" + ApiKey + @"/{0}";
+    //public const string UserEpisodesWatchList = @"http://api.trakt.tv/user/watchlist/episodes.json/" + ApiKey + @"/{0}";
+    //public const string UserRatedMoviesList = @"http://api.trakt.tv/user/ratings/movies.json/" + ApiKey + @"/{0}";
+    //public const string UserRatedShowsList = @"http://api.trakt.tv/user/ratings/shows.json/" + ApiKey + @"/{0}";
+    //public const string UserRatedEpisodesList = @"http://api.trakt.tv/user/ratings/episodes.json/" + ApiKey + @"/{0}";
+    //public const string CreateAccount = @"http://api.trakt.tv/account/create/" + ApiKey;
+    //public const string TestAccount = @"http://api.trakt.tv/account/test/" + ApiKey;
+    //public const string UserEpisodeWatchedHistory = @"http://api.trakt.tv/user/watched/episodes.json/" + ApiKey + @"/{0}";
+    //public const string UserMovieWatchedHistory = @"http://api.trakt.tv/user/watched/movies.json/" + ApiKey + @"/{0}";
+    //public const string Friends = @"http://api.trakt.tv/friends/all/" + ApiKey;
+    //public const string FriendRequests = @"http://api.trakt.tv/friends/requests/" + ApiKey;
+    //public const string FriendAdd = @"http://api.trakt.tv/friends/add/" + ApiKey;
+    //public const string FriendApprove = @"http://api.trakt.tv/friends/approve/" + ApiKey;
+    //public const string FriendDeny = @"http://api.trakt.tv/friends/deny/" + ApiKey;
+    //public const string FriendDelete = @"http://api.trakt.tv/friends/delete/" + ApiKey;
+    //public const string SearchUsers = @"http://api.trakt.tv/search/users.json/" + ApiKey + @"?query={0}&limit={1}";
+    //public const string SearchMovies = @"http://api.trakt.tv/search/movies.json/" + ApiKey + @"?query={0}&limit={1}";
+    //public const string SearchShows = @"http://api.trakt.tv/search/shows.json/" + ApiKey + @"?query={0}&limit={1}";
+    //public const string SearchEpisodes = @"http://api.trakt.tv/search/episodes.json/" + ApiKey + @"?query={0}&limit={1}";
+    //public const string SearchPeople = @"http://api.trakt.tv/search/people.json/" + ApiKey + @"?query={0}&limit={1}";
+    //public const string MovieShouts = @"http://api.trakt.tv/movie/comments.json/" + ApiKey + @"/{0}";
+    //public const string ShowShouts = @"http://api.trakt.tv/show/comments.json/" + ApiKey + @"/{0}";
+    //public const string EpisodeShouts = @"http://api.trakt.tv/show/episode/comments.json/" + ApiKey + @"/{0}/{1}/{2}";
+    //public const string DismissMovieRecommendation = @"http://api.trakt.tv/recommendations/movies/dismiss/" + ApiKey;
+    //public const string DismissShowRecommendation = @"http://api.trakt.tv/recommendations/shows/dismiss/" + ApiKey;
+    //public const string ListAdd = @"http://api.trakt.tv/lists/add/" + ApiKey;
+    //public const string ListDelete = @"http://api.trakt.tv/lists/delete/" + ApiKey;
+    //public const string ListItemsAdd = @"http://api.trakt.tv/lists/items/add/" + ApiKey;
+    //public const string ListItemsDelete = @"http://api.trakt.tv/lists/items/delete/" + ApiKey;
+    //public const string ListUpdate = @"http://api.trakt.tv/lists/update/" + ApiKey;
+    //public const string UserList = @"http://api.trakt.tv/user/list.json/" + ApiKey + @"/{0}/{1}";
+    //public const string UserLists = @"http://api.trakt.tv/user/lists.json/" + ApiKey + @"/{0}";
+    //public const string RelatedMovies = @"http://api.trakt.tv/movie/related.json/" + ApiKey + @"/{0}{1}";
+    //public const string RelatedShows = @"http://api.trakt.tv/show/related.json/" + ApiKey + @"/{0}{1}";
+    //public const string ActivityUser = @"http://api.trakt.tv/activity/user.json/" + ApiKey + @"/{0}/{1}/{2}";
+    //public const string ActivityFriends = @"http://api.trakt.tv/activity/friends.json/" + ApiKey + @"/{0}/{1}{2}";
+    //public const string ActivityFriendsMe = @"http://api.trakt.tv/activity/friendsme.json/" + ApiKey + @"/{0}/{1}{2}";
+    //public const string ActivityCommunity = @"http://api.trakt.tv/activity/community.json/" + ApiKey + @"/{0}/{1}{2}";
+    //public const string AccountSettings = @"http://api.trakt.tv/account/settings/" + ApiKey;
+    //public const string RateMovies = @"http://api.trakt.tv/rate/movies/" + ApiKey;
+    //public const string RateShows = @"http://api.trakt.tv/rate/shows/" + ApiKey;
+    //public const string RateEpisodes = @"http://api.trakt.tv/rate/episodes/" + ApiKey;
+    //public const string ShowSeasons = @"http://api.trakt.tv/show/seasons.json/" + ApiKey + @"/{0}";
+    //public const string SeasonEpisodes = @"http://api.trakt.tv/show/season.json/" + ApiKey + @"/{0}/{1}";
+    //public const string ShowSeen = @"http://api.trakt.tv/show/seen/" + ApiKey;
+    //public const string SeasonSeen = @"http://api.trakt.tv/show/season/seen/" + ApiKey;
+    //public const string ShowLibrary = @"http://api.trakt.tv/show/library/" + ApiKey;
+    //public const string SeasonLibrary = @"http://api.trakt.tv/show/season/library/" + ApiKey;
+    //public const string NetworkFriends = @"http://api.trakt.tv/user/network/friends.json/" + ApiKey + "/{0}";
+    //public const string NetworkFollowers = @"http://api.trakt.tv/user/network/followers.json/" + ApiKey + "/{0}";
+    //public const string NetworkFollowing = @"http://api.trakt.tv/user/network/following.json/" + ApiKey + "/{0}";
+    //public const string NetworkRequests = @"http://api.trakt.tv/network/requests/" + ApiKey;
+    //public const string NetworkFollow = @"http://api.trakt.tv/network/follow/" + ApiKey;
+    //public const string NetworkUnFollow = @"http://api.trakt.tv/network/unfollow/" + ApiKey;
+    //public const string NetworkApprove = @"http://api.trakt.tv/network/approve/" + ApiKey;
+    //public const string NetworkDeny = @"http://api.trakt.tv/network/deny/" + ApiKey;
+
+
+    public const string Login = "https://api-v2launch.trakt.tv/auth/login";
+
+    public const string SyncLastActivities = "https://api-v2launch.trakt.tv/sync/last_activities";
+
+    public const string SyncPausedMovies = "https://api-v2launch.trakt.tv/sync/playback/movies";
+    public const string SyncPausedEpisodes = "https://api-v2launch.trakt.tv/sync/playback/episodes";
+
+    public const string SyncCollectionMovies = "https://api-v2launch.trakt.tv/sync/collection/movies";
+    public const string SyncWatchedMovies = "https://api-v2launch.trakt.tv/sync/watched/movies";
+    public const string SyncRatedMovies = "https://api-v2launch.trakt.tv/sync/ratings/movies";
+
+    public const string SyncCollectionEpisodes = "https://api-v2launch.trakt.tv/sync/collection/shows";
+    public const string SyncWatchedEpisodes = "https://api-v2launch.trakt.tv/sync/watched/shows";
+    public const string SyncRatedEpisodes = "https://api-v2launch.trakt.tv/sync/ratings/episodes";
+    public const string SyncRatedSeasons = "https://api-v2launch.trakt.tv/sync/ratings/seasons";
+    public const string SyncRatedShows = "https://api-v2launch.trakt.tv/sync/ratings/shows";
+
+    public const string SyncCollectionAdd = "https://api-v2launch.trakt.tv/sync/collection";
+    public const string SyncCollectionRemove = "https://api-v2launch.trakt.tv/sync/collection/remove";
+    public const string SyncWatchedHistoryAdd = "https://api-v2launch.trakt.tv/sync/history";
+    public const string SyncWatchedHistoryRemove = "https://api-v2launch.trakt.tv/sync/history/remove";
+    public const string SyncRatingsAdd = "https://api-v2launch.trakt.tv/sync/ratings";
+    public const string SyncRatingsRemove = "https://api-v2launch.trakt.tv/sync/ratings/remove";
+    public const string SyncWatchlistAdd = "https://api-v2launch.trakt.tv/sync/watchlist";
+    public const string SyncWatchlistRemove = "https://api-v2launch.trakt.tv/sync/watchlist/remove";
+
+    public const string UserLists = "https://api-v2launch.trakt.tv/users/{0}/lists";
+    public const string UserListItems = "https://api-v2launch.trakt.tv/users/{0}/lists/{1}/items?extended={2}";
+
+    public const string UserListAdd = "https://api-v2launch.trakt.tv/users/{0}/lists";
+    public const string UserListEdit = "https://api-v2launch.trakt.tv/users/{0}/lists/{1}";
+
+    public const string UserListItemsAdd = "https://api-v2launch.trakt.tv/users/{0}/lists/{1}/items";
+    public const string UserListItemsRemove = "https://api-v2launch.trakt.tv/users/{0}/lists/{1}/items/remove";
+
+    public const string UserListLike = "https://api-v2launch.trakt.tv/users/{0}/lists/{1}/like";
+
+    public const string UserWatchlistMovies = "https://api-v2launch.trakt.tv/users/{0}/watchlist/movies?extended={1}";
+    public const string UserWatchlistShows = "https://api-v2launch.trakt.tv/users/{0}/watchlist/shows?extended={1}";
+    public const string UserWatchlistSeasons = "https://api-v2launch.trakt.tv/users/{0}/watchlist/seasons?extended={1}";
+    public const string UserWatchlistEpisodes = "https://api-v2launch.trakt.tv/users/{0}/watchlist/episodes?extended={1}";
+
+    public const string UserProfile = "https://api-v2launch.trakt.tv/users/{0}?extended=full,images";
+    public const string UserFollowerRequests = "https://api-v2launch.trakt.tv/users/requests?extended=full,images";
+    public const string UserStats = "https://api-v2launch.trakt.tv/users/{0}/stats";
+
+    public const string UserWatchedHistoryMovies = "https://api-v2launch.trakt.tv/users/{0}/history/movies?extended=full,images&page={1}&limit={2}";
+    public const string UserWatchedHistoryEpisodes = "https://api-v2launch.trakt.tv/users/{0}/history/episodes?extended=full,images&page={1}&limit={2}";
+
+    public const string UserCollectedMovies = "https://api-v2launch.trakt.tv/users/{0}/collection/movies?extended=full,images";
+    public const string UserCollectedShows = "https://api-v2launch.trakt.tv/users/{0}/collection/shows?extended=full,images";
+
+    public const string UserComments = "https://api-v2launch.trakt.tv/users/{0}/comments/{1}/{2}?extended={3}&page={4}&limit={5}";
+
+    public const string UserLikedItems = "https://api-v2launch.trakt.tv/users/likes/{0}?extended={1}&page={2}&limit={3}";
+
+    public const string RecommendedMovies = "https://api-v2launch.trakt.tv/recommendations/movies?extended={0}";
+    public const string RecommendedShows = "https://api-v2launch.trakt.tv/recommendations/shows?extended=full,images";
+
+    public const string RelatedMovies = "https://api-v2launch.trakt.tv/movies/{0}/related?extended=full,images&limit={1}";
+    public const string RelatedShows = "https://api-v2launch.trakt.tv/shows/{0}/related?extended=full,images&limit={1}";
+
+    public const string TrendingMovies = "https://api-v2launch.trakt.tv/movies/trending?extended=full,images&page={0}&limit={1}";
+    public const string TrendingShows = "https://api-v2launch.trakt.tv/shows/trending?extended=full,images&page={0}&limit={1}";
+
+    public const string PopularMovies = "https://api-v2launch.trakt.tv/movies/popular?extended=full,images&page={0}&limit={1}";
+    public const string PopularShows = "https://api-v2launch.trakt.tv/shows/popular?extended=full,images&page={0}&limit={1}";
+
+    public const string MovieComments = "https://api-v2launch.trakt.tv/movies/{0}/comments?extended=full,images&page={1}&limit={2}";
+    public const string ShowComments = "https://api-v2launch.trakt.tv/shows/{0}/comments?extended=full,images&page={1}&limit={2}";
+    public const string SeasonComments = "https://api-v2launch.trakt.tv/shows/{0}/seasons/{1}/comments?extended=full,images&page={2}&limit={3}";
+    public const string EpisodeComments = "https://api-v2launch.trakt.tv/shows/{0}/seasons/{1}/episodes/{2}/comments?extended=full,images&page={3}&limit={4}";
+
+    public const string CommentLike = "https://api-v2launch.trakt.tv/comments/{0}/like";
+    public const string CommentReplies = "https://api-v2launch.trakt.tv/comments/{0}/replies";
+
+    public const string SearchMovies = "https://api-v2launch.trakt.tv/search?query={0}&type=movie&page={1}&limit={2}?extended=full,images";
+    public const string SearchShows = "https://api-v2launch.trakt.tv/search?query={0}&type=show&page={1}&limit={2}?extended=full,images";
+    public const string SearchEpisodes = "https://api-v2launch.trakt.tv/search?query={0}&type=episode&page={1}&limit={2}?extended=full,images";
+    public const string SearchPeople = "https://api-v2launch.trakt.tv/search?query={0}&type=person&page={1}&limit={2}?extended=full,images";
+    public const string SearchUsers = "https://api-v2launch.trakt.tv/search?query={0}&type=user&page={1}&limit={2}?extended=full,images";
+    public const string SearchLists = "https://api-v2launch.trakt.tv/search?query={0}&type=list&page={1}&limit={2}?extended=full,images";
+    public const string SearchById = "https://api-v2launch.trakt.tv/search?id_type={0}&id={1}";
+
+    public const string NetworkFriends = "https://api-v2launch.trakt.tv/users/{0}/friends?extended=full,images";
+    public const string NetworkFollowers = "https://api-v2launch.trakt.tv/users/{0}/followers?extended=full,images";
+    public const string NetworkFollowing = "https://api-v2launch.trakt.tv/users/{0}/following?extended=full,images";
+
+    public const string NetworkFollowRequest = "https://api-v2launch.trakt.tv/users/requests/{0}";
+    public const string NetworkFollowUser = "https://api-v2launch.trakt.tv/users/{0}/follow";
+
+    public const string ShowSummary = "https://api-v2launch.trakt.tv/shows/{0}?extended=full,images";
+    public const string MovieSummary = "https://api-v2launch.trakt.tv/movies/{0}?extended=full,images";
+    public const string EpisodeSummary = "https://api-v2launch.trakt.tv/shows/{0}/seasons/{1}/episodes/{2}?extended=full,images";
+
+    public const string ShowSeasons = "https://api-v2launch.trakt.tv/shows/{0}/seasons?extended={1}";
+    public const string SeasonEpisodes = "https://api-v2launch.trakt.tv/shows/{0}/seasons/{1}?extended=full,images";
+
+    public const string CalendarShows = "https://api-v2launch.trakt.tv/calendars/shows/{0}/{1}?extended=full,images";
+    public const string CalendarPremieres = "https://api-v2launch.trakt.tv/calendars/shows/premieres/{0}/{1}?extended=full,images";
+    public const string CalendarNewPremieres = "https://api-v2launch.trakt.tv/calendars/shows/new/{0}/{1}?extended=full,images";
+
+    public const string ScrobbleStart = "https://api-v2launch.trakt.tv/scrobble/start";
+    public const string ScrobblePause = "https://api-v2launch.trakt.tv/scrobble/pause";
+    public const string ScrobbleStop = "https://api-v2launch.trakt.tv/scrobble/stop";
+
+    public const string ShowRatings = "https://api-v2launch.trakt.tv/shows/{0}/ratings";
+    public const string SeasonRatings = "https://api-v2launch.trakt.tv/shows/{0}/seasons/{1}/ratings";
+    public const string EpisodeRatings = "https://api-v2launch.trakt.tv/shows/{0}/seasons/{1}/episodes/{2}/ratings";
+
+    public const string PersonMovieCredits = "https://api-v2launch.trakt.tv/people/{0}/movies?extended=full,images";
+    public const string PersonShowCredits = "https://api-v2launch.trakt.tv/people/{0}/shows?extended=full,images";
+    public const string PersonSummary = "https://api-v2launch.trakt.tv/people/{0}?extended=full,images";
+
+    public const string MoviePeople = "https://api-v2launch.trakt.tv/movie/{0}/people?extended=full,images";
+    public const string ShowPeople = "https://api-v2launch.trakt.tv/show/{0}/people?extended=full,images";
+
+    public const string ShowUpdates = "https://api-v2launch.trakt.tv/shows/updates/{0}?page={1}&limit={2}";
+    public const string MovieUpdates = "https://api-v2launch.trakt.tv/movies/updates/{0}?page={1}&limit={2}";
+
+    public const string DismissRecommendedMovie = "https://api-v2launch.trakt.tv/recommendations/movies/{0}";
+    public const string DismissRecommendedShow = "https://api-v2launch.trakt.tv/recommendations/shows/{0}";
+
+    public const string DeleteList = "https://api-v2launch.trakt.tv/users/{0}/lists/{1}";
   }
-}
+}
\ No newline at end of file
diff --git a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/OnlineLibraries.csproj b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/OnlineLibraries.csproj
index ce935b7..c66d9ae 100644
--- a/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/OnlineLibraries.csproj
+++ b/MediaPortal/Source/Extensions/MetadataExtractors/OnlineLibraries/OnlineLibraries.csproj
@@ -90,40 +90,79 @@
     <Compile Include="Libraries\MovieDbV3\MovieDbDownloader.cs" />
     <Compile Include="Libraries\OpenStreetMap\Data\GeocoderResponse.cs" />
     <Compile Include="Libraries\OpenStreetMap\Geocoder.cs" />
-    <Compile Include="Libraries\Trakt\DataStructures\MovieScrobbleAndMode.cs" />
-    <Compile Include="Libraries\Trakt\DataStructures\MovieSyncAndMode.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\SyncMovieCheck.cs" />
-    <Compile Include="Libraries\Trakt\DataStructures\TraktAccount.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktAccountSettings.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktActivity.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktActor.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktAddListResponse.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktAuthentication.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktCalendar.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktComment.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktCommentItem.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktComments.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktEpisode.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\AbstractScrobble.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeCollected.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeHistory.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeId.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeImages.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeRated.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeScrobble.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeSummary.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeSummaryEx.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeSync.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeWatched.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktEpisodeWatchList.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktFollowerRequest.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktFriend.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktId.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktImage.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktLastSyncActivities.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktLibraryMovie.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktLibraryShow.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktLike.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktLikes.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktList.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktListDetail.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktListItem.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktListSlug.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktMovie.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktMovieBase.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMovieCollected.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMovieHistory.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMovieId.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMovieImages.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMovieRated.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktMovieScrobble.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktMovieSlug.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMoviesPopular.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMoviesTrending.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktMovieSummary.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMoviesUpdated.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktMovieSync.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMovieTrending.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMovieUpdate.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMovieWatched.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktMovieWatchList.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktNetwork.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktNetworkApproval.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktNetworkApprove.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktNetworkFollowResponse.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktNetworkFriend.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktNetworkReqUser.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktNetworkUser.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktPagination.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktPeople.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktPerson.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktPersonId.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktPersonMovieCast.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktPersonMovieCredits.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktPersonMovieCrew.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktPersonMovieJob.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktPersonShowCast.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktPersonShowCredits.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktPersonShowCrew.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktPersonShowJob.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktPersonSummary.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktProducer.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktRateEpisode.cs" />
@@ -133,39 +172,100 @@
     <Compile Include="Libraries\Trakt\DataStructures\TraktRateResponse.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktRateSeries.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktRateShows.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktRating.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktRatingDistribution.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktRatings.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktRecommendations.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktResponse.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktScrobble.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktScrobbleEpisode.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktScrobbleMovie.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktScrobbleResponse.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktSearchResult.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSeasonId.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSeasonImages.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSeasonRated.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktSeasonSeen.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSeasonSummary.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSeasonWatchList.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktShout.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktShow.cs" />
-    <Compile Include="Libraries\Trakt\DataStructures\TraktShowSeason.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktShowId.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktShowImages.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktShowRated.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSeason.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktShowSeen.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktShowSlug.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktShowsPopular.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktShowsTrending.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktShowSummary.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktShowsUpdated.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktShowSync.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktShowTrending.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktShowUpdate.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktShowWatchList.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktStatistics.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktStatus.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncAll.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncEpisodeCollected.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncEpisodeRated.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncEpisodes.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncEpisodesCollected.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncEpisodesRated.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncEpisodesWatched.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncEpisodeWatched.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncMovieCollected.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncMovieRated.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktSyncMovieResponse.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncMovies.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncMoviesCollected.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncMoviesRated.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncMoviesWatched.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncMovieWatched.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncPaused.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncResponse.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncSeasonEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncSeasonRatedEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncSeasonsEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncSeasonsRatedEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShowCollectedEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShowEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShowRated.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShowRatedEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShows.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShowsCollectedEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShowsEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShowsRated.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShowsRatedEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShowsWatchedEx.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktSyncShowWatchedEx.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktTopEpisode.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktTopWatcher.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktTrendingMovie.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktTrendingShow.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktUser.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktUserEpisodeRating.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktUserImages.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktUserList.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktUserListItem.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktUserMovieRating.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktUserProfile.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktUserShowRating.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktUserStatistics.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktUserSummary.cs" />
+    <Compile Include="Libraries\Trakt\DataStructures\TraktUserToken.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktWatchedHistoryItem.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktWatchListEpisode.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktWatchListMovie.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktWatchListShow.cs" />
     <Compile Include="Libraries\Trakt\DataStructures\TraktWriter.cs" />
+    <Compile Include="Libraries\Trakt\Enums\TraktEnums.cs" />
     <Compile Include="Libraries\Trakt\Extension\DateTimeExtensions.cs" />
+    <Compile Include="Libraries\Trakt\Extension\EnumerableExtensions.cs" />
     <Compile Include="Libraries\Trakt\Extension\JsonExtensions.cs" />
+    <Compile Include="Libraries\Trakt\Extension\StringExtensions.cs" />
     <Compile Include="Libraries\Trakt\TraktAPI.cs" />
+    <Compile Include="Libraries\Trakt\TraktCache.cs" />
     <Compile Include="Libraries\Trakt\TraktLogger.cs" />
     <Compile Include="Libraries\Trakt\TraktSettings.cs" />
     <Compile Include="Libraries\Trakt\TraktURIs.cs" />
@@ -254,6 +354,7 @@
     <None Include="build.targets" />
     <None Include="packages.config" />
   </ItemGroup>
+  <ItemGroup />
   <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
   <Import Project="build.targets" />
 </Project>
\ No newline at end of file
