public IEnumerable <FbMessage> GetMessages(FbMessageFolder folder)
        {
            Authenticate();

            string call_id = GetNextCallNr();
            var    query   = new StringBuilder();

            query.Append("{");
            query.Append("\"threads\":\"SELECT thread_id, subject, recipients, updated_time, parent_message_id, parent_thread_id, unread FROM thread WHERE folder_id = 0\",");
            query.Append("\"messages\":\"SELECT thread_id, body, author_id, created_time, attachment FROM message WHERE thread_id IN (SELECT thread_id FROM #threads)\",");
            query.Append("\"users\":\"SELECT uid, name FROM user WHERE uid IN (SELECT author_id FROM #messages)\"");
            query.Append("}");

            Dictionary <string, string> requestParams = new Dictionary <string, string>();

            requestParams.Add("method", "fql.multiquery");
            requestParams.Add("api_key", apiKey);
            requestParams.Add("session_key", sessionKey);
            requestParams.Add("call_id", call_id);
            requestParams.Add("v", "1.0");
            requestParams.Add("queries", query.ToString());

            var        result = channel.ExecuteMultiQueries(apiKey, sessionKey, call_id, GenerateSignature(requestParams, sessionSecret), query.ToString());
            XNamespace ns     = result.GetDefaultNamespace();

            // Fire one call to retreive names for all recipients in messages
            var uids      = result.Descendants(ns + "recipients").Elements(ns + "uid").Select(n => n.Value).ToArray();
            var addresses = GetAddresses(String.Join(", ", uids)).ToList();

            foreach (XElement messageElement in result.Descendants(ns + "message"))
            {
                FbMessage message = new FbMessage();

                try
                {
                    var threadid = messageElement.Element(ns + "thread_id").Value;
                    var from     = messageElement.Element(ns + "author_id").Value;

                    //if (String.IsNullOrEmpty(from))
                    //	System.Diagnostics.Debugger.Break();

                    // Find the associated thread which contains the subject and readstate
                    var threadElement = result.Descendants(ns + "thread").FirstOrDefault(t => t.Element(ns + "thread_id").Value == threadid);
                    var senderElement = result.Descendants(ns + "user").FirstOrDefault(u => u.Element(ns + "uid").Value == from);

                    if (threadElement == null || senderElement == null)
                    {
                        Logger.Error("Unable to determine sender for Facebook message, ignoring", LogSource.Channel);

                        continue;
                    }

                    message.ThreadId    = threadid;
                    message.Subject     = threadElement.Element(ns + "subject").Value;
                    message.Body        = messageElement.Element(ns + "body").Value;
                    message.From        = new SourceAddress(senderElement.Element(ns + "uid").Value, senderElement.Element(ns + "name").Value);
                    message.To          = new SourceAddressCollection();
                    message.Read        = threadElement.Element(ns + "unread").Value == "0";
                    message.DateCreated = Int64.Parse(threadElement.Element(ns + "updated_time").Value).ToUnixTime();

                    foreach (XElement recipientElement in threadElement.Element(ns + "recipients").Elements())
                    {
                        message.To.Add(addresses.FirstOrDefault(a => a.Address == recipientElement.Value));
                    }

                    message.MessageId = message.ThreadId + message.From.Address;
                }
                catch (Exception ex)
                {
                    Logger.Error("Unable to retreive mesaage. Result = {0}. Exception = {1}", LogSource.Channel, messageElement.Value, ex);

                    continue;
                }

                yield return(message);
            }
        }