public ServiceResult <string> Save(BlogEntryModel entryModel)
        {
            if (entryModel == null)
            {
                throw new ArgumentNullException("entryModel");
            }
            entryModel.RebuildTagsFromString();

            BlogEntry entry = null;

            if (!Exists(entryModel.Slug))
            {
                entry = new BlogEntry
                {
                    Slug        = entryModel.Title.ToUrlSlug(),
                    DateCreated = DateTime.Now
                };

                if (Exists(entry.Slug))
                {
                    return(ServiceResult <string> .Error("Sorry, a post with that slug already exists."));
                }
            }
            else
            {
                entry             = AutoMapper.Mapper.Map <BlogEntryEntity, BlogEntry>(_blogRepository.Single <BlogEntryEntity>(b => b.Slug == entryModel.Slug));
                entry.DateCreated = DateTime.ParseExact(entryModel.Date, DateSettings.DateStringFormat(), Thread.CurrentThread.CurrentCulture);

                var slugChanged =
                    !string.Equals(entryModel.Slug, entryModel.NewSlug, StringComparison.InvariantCultureIgnoreCase) &&
                    !string.IsNullOrWhiteSpace(entryModel.NewSlug);

                if (slugChanged)
                {
                    if (Exists(entryModel.NewSlug))
                    {
                        return(ServiceResult <string> .Error("Sorry, a post with that slug already exists."));
                    }
                    //delete current one as slug is the ID will create / save a new one.
                    Delete(entryModel.Slug);
                    entry.Slug = entryModel.NewSlug.ToLowerInvariant();
                }
            }

            if (!IsValidSlug(entry.Slug))
            {
                return(ServiceResult <string> .Error("That's not a valid slug. Only letters, numbers and hypens are allowed."));
            }

            entry.Title            = entryModel.Title;
            entry.Markdown         = entryModel.Markdown;
            entry.Summary          = CreateSummary(entryModel.Markdown);
            entry.IsPublished      = entryModel.IsPublished;
            entry.IsCodePrettified = entryModel.IsCodePrettified;

            entry.Author = _blogUserService.FindByName(_currentUserService.GetUserName()).DisplayName;

            //update all the tags.
            var tags = _blogRepository.All <TagEntity>().ToArray();

            var distinctTags = entryModel.Tags.Distinct();
            var trimmedTags  = distinctTags.Select(t => t.Trim().ToLowerInvariant()).ToArray();
            var matchedTags  = tags.Where(t => trimmedTags.Contains(t.Name.ToLowerInvariant())).ToArray();

            var newTags = trimmedTags.Where(t => tags.All(tag => tag.Name.ToLowerInvariant() != t))
                          .Select(t => new TagEntity {
                Id = 0, Name = t
            }).ToArray();

            //ensure new tags are added to the list of known tags.
            foreach (var newTag in newTags)
            {
                _blogRepository.Add(newTag);
            }

            var actualTags = newTags.Union(matchedTags);

            var entryEntity = AutoMapper.Mapper.Map <BlogEntry, BlogEntryEntity>(entry);

            entryEntity.Tags.Clear();
            entryEntity.Tags.AddRange(actualTags);

            _blogRepository.Save(entryEntity, b => b.Slug == entry.Slug);

            _blogTagService.RemoveUnsedTags();
            _blogTagService.UpdateTagCount();

            return(ServiceResult <string> .Success(entry.Slug));
        }