diff --git a/CREDITS.txt b/CREDITS.txt
index b99ec8e31..208dd03da 100644
--- a/CREDITS.txt
+++ b/CREDITS.txt
@@ -7,12 +7,6 @@ The Outercurve Foundation (http://www.outercurve.org/).
 
 Orchard includes works distributed under the licenses listed below. The full text for most of the licenses listed below can be found in the LICENSE.txt file accompanying each work. The original copyright notices have been preserved within the respective files and or packages. Please refer to the specific files and/or packages for more detailed information about the authors, copyright notices, and licenses.
 
-Akismet.Net
------
-Website:      http://www.codeplex.com/wikipage?ProjectName=AkismetApi
-Copyright:    Copyright (c) 2006, Joel Thoms
-License:      New BSD
-
 Antlr
 -----
 Website:      http://www.antlr.org/
diff --git a/lib/joel.net.akismet/Joel.Net.Akismet.dll b/lib/joel.net.akismet/Joel.Net.Akismet.dll
deleted file mode 100644
index c6982d980..000000000
Binary files a/lib/joel.net.akismet/Joel.Net.Akismet.dll and /dev/null differ
diff --git a/lib/joel.net.akismet/LICENSE.txt b/lib/joel.net.akismet/LICENSE.txt
deleted file mode 100644
index c72c03c86..000000000
--- a/lib/joel.net.akismet/LICENSE.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-BSD License
-
-Copyright (c) 2006, Joel Thoms
-All rights reserved.
-
-Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
-
-* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 
-* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 
-* Neither the name of the JOEL.NET nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. 
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file
diff --git a/src/Orchard.Tests.Modules/Comments/Services/CommentServiceTests.cs b/src/Orchard.Tests.Modules/Comments/Services/CommentServiceTests.cs
index bfe276efc..af0a2262f 100644
--- a/src/Orchard.Tests.Modules/Comments/Services/CommentServiceTests.cs
+++ b/src/Orchard.Tests.Modules/Comments/Services/CommentServiceTests.cs
@@ -105,20 +105,6 @@ namespace Orchard.Tests.Modules.Comments.Services {
             Assert.That(_commentService.GetCommentedContent(commentId), Is.Not.Null);
         }
 
-        [Test]
-        public void UpdateShouldChangeComment() {
-            var commentedItem = _contentManager.New("commentedItem");
-            _contentManager.Create(commentedItem);
-            _contentManager.Create(commentedItem, VersionOptions.Published);
-            int commentId = commentedItem.As<CommentPart>().Id;
-
-            Assert.That(_commentService.GetComment(commentId).Record.Author, Is.Null.Or.Empty);
-
-            _commentService.UpdateComment(commentId, "test", "", "", "new text", CommentStatus.Pending);
-
-            Assert.That(_commentService.GetComment(commentId).Record.Author, Is.EqualTo("test"));
-        }
-
         [Test]
         public void CommentsShouldBePendingByDefault() {
             var commentedItem = _contentManager.New("commentedItem");
diff --git a/src/Orchard.Web/Modules/Orchard.AntiSpam/EventHandlers/DefaultCheckSpamEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AntiSpam/EventHandlers/DefaultCheckSpamEventHandler.cs
new file mode 100644
index 000000000..0518e0426
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.AntiSpam/EventHandlers/DefaultCheckSpamEventHandler.cs
@@ -0,0 +1,28 @@
+using System.Linq;
+using Orchard.AntiSpam.Models;
+using Orchard.AntiSpam.Services;
+using Orchard.AntiSpam.Settings;
+
+namespace Orchard.AntiSpam.EventHandlers {
+    public class DefaultCheckSpamEventHandler : ICheckSpamEventHandler {
+        private readonly ISpamService _spamService;
+
+        public DefaultCheckSpamEventHandler(ISpamService spamService) {
+            _spamService = spamService;
+        }
+
+        public void CheckSpam(dynamic context) {
+            if(!_spamService.GetSpamFilters().Any()) {
+                return;
+            }
+
+            context.Checked = true;
+            
+            if(string.IsNullOrWhiteSpace(context.Text)) {
+                return;
+            }
+
+            context.IsSpam = _spamService.CheckForSpam(context.Text, SpamFilterAction.One) == SpamStatus.Spam;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.AntiSpam/EventHandlers/ICheckSpamEventHandler.cs b/src/Orchard.Web/Modules/Orchard.AntiSpam/EventHandlers/ICheckSpamEventHandler.cs
new file mode 100644
index 000000000..18c64a131
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.AntiSpam/EventHandlers/ICheckSpamEventHandler.cs
@@ -0,0 +1,7 @@
+using Orchard.Events;
+
+namespace Orchard.AntiSpam.EventHandlers {
+    public interface ICheckSpamEventHandler : IEventHandler {
+        void CheckSpam(dynamic context);
+    }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.AntiSpam/Models/SpamStatus.cs b/src/Orchard.Web/Modules/Orchard.AntiSpam/Models/SpamStatus.cs
index 881a65231..cb5ab4ac4 100644
--- a/src/Orchard.Web/Modules/Orchard.AntiSpam/Models/SpamStatus.cs
+++ b/src/Orchard.Web/Modules/Orchard.AntiSpam/Models/SpamStatus.cs
@@ -1,9 +1,4 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Web;
-
-namespace Orchard.AntiSpam.Models {
+namespace Orchard.AntiSpam.Models {
     public enum SpamStatus {
         Spam,
         Ham
diff --git a/src/Orchard.Web/Modules/Orchard.AntiSpam/Module.txt b/src/Orchard.Web/Modules/Orchard.AntiSpam/Module.txt
index 12443e9e4..7e0f680b5 100644
--- a/src/Orchard.Web/Modules/Orchard.AntiSpam/Module.txt
+++ b/src/Orchard.Web/Modules/Orchard.AntiSpam/Module.txt
@@ -2,7 +2,7 @@ Name: AntiSpam
 AntiForgery: enabled
 Author: The Orchard Team
 Website: http://orchardproject.net
-Version: 1.6
+Version: 1.6.1
 OrchardVersion: 1.0
 Description: Provides anti-spam services to protect your content from malicious submissions.
 Features:
diff --git a/src/Orchard.Web/Modules/Orchard.AntiSpam/Orchard.AntiSpam.csproj b/src/Orchard.Web/Modules/Orchard.AntiSpam/Orchard.AntiSpam.csproj
index ede0a6a41..fd4892e2e 100644
--- a/src/Orchard.Web/Modules/Orchard.AntiSpam/Orchard.AntiSpam.csproj
+++ b/src/Orchard.Web/Modules/Orchard.AntiSpam/Orchard.AntiSpam.csproj
@@ -21,6 +21,10 @@
     </UpgradeBackupLocation>
     <TargetFrameworkProfile />
     <UseIISExpress>false</UseIISExpress>
+    <IISExpressSSLPort />
+    <IISExpressAnonymousAuthentication />
+    <IISExpressWindowsAuthentication />
+    <IISExpressUseClassicPipelineMode />
   </PropertyGroup>
   <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
     <DebugSymbols>true</DebugSymbols>
@@ -89,6 +93,8 @@
     <Compile Include="Drivers\SpamFilterPartDriver.cs" />
     <Compile Include="Drivers\ReCaptchaPartDriver.cs" />
     <Compile Include="Drivers\SubmissionLimitPartDriver.cs" />
+    <Compile Include="EventHandlers\DefaultCheckSpamEventHandler.cs" />
+    <Compile Include="EventHandlers\ICheckSpamEventHandler.cs" />
     <Compile Include="Handlers\AkismetSettingsPartHandler.cs" />
     <Compile Include="Handlers\TypePadSettingsPartHandler.cs" />
     <Compile Include="Handlers\SpamFilterPartHandler.cs" />
diff --git a/src/Orchard.Web/Modules/Orchard.AntiSpam/Services/DefaultSpamService.cs b/src/Orchard.Web/Modules/Orchard.AntiSpam/Services/DefaultSpamService.cs
index 4c7eccd73..f41ed2ac2 100644
--- a/src/Orchard.Web/Modules/Orchard.AntiSpam/Services/DefaultSpamService.cs
+++ b/src/Orchard.Web/Modules/Orchard.AntiSpam/Services/DefaultSpamService.cs
@@ -26,6 +26,11 @@ namespace Orchard.AntiSpam.Services {
         }
 
         public SpamStatus CheckForSpam(string text, SpamFilterAction action) {
+
+            if (string.IsNullOrWhiteSpace(text)) {
+                return SpamStatus.Ham;
+            }
+
             var spamFilters = GetSpamFilters().ToList();
 
             switch (action) {
@@ -53,6 +58,10 @@ namespace Orchard.AntiSpam.Services {
             // evaluate the text to submit to the spam filters
             var text = _tokenizer.Replace(settings.Pattern, new Dictionary<string, object> { { "Content", part.ContentItem } });
 
+            if (string.IsNullOrWhiteSpace(text)) {
+                return SpamStatus.Ham;
+            }
+
             var result = CheckForSpam(text, settings.Action);
 
             // trigger events and rules
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Comments/Controllers/AdminController.cs
index c31cf6563..53fc365ac 100644
--- a/src/Orchard.Web/Modules/Orchard.Comments/Controllers/AdminController.cs
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Controllers/AdminController.cs
@@ -13,7 +13,6 @@ using Orchard.UI.Navigation;
 using Orchard.UI.Notify;
 using Orchard.Comments.ViewModels;
 using Orchard.Comments.Services;
-using Orchard.Utility.Extensions;
 
 namespace Orchard.Comments.Controllers {
     using Orchard.Settings;
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Controllers/CommentController.cs b/src/Orchard.Web/Modules/Orchard.Comments/Controllers/CommentController.cs
index d0683ce64..092f3595d 100644
--- a/src/Orchard.Web/Modules/Orchard.Comments/Controllers/CommentController.cs
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Controllers/CommentController.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Linq;
+using System.Linq;
 using System.Web.Mvc;
 using Orchard.Comments.Models;
 using Orchard.Comments.Services;
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs
index 4f2d381dd..7636cf75e 100644
--- a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/CommentPartDriver.cs
@@ -15,7 +15,7 @@ namespace Orchard.Comments.Drivers {
         private readonly IContentManager _contentManager;
         private readonly IWorkContextAccessor _workContextAccessor;
         private readonly IClock _clock;
-        private readonly ICommentService _commentService;
+        private readonly ICommentValidator _commentValidator;
 
         protected override string Prefix { get { return "Comments"; } }
 
@@ -25,11 +25,12 @@ namespace Orchard.Comments.Drivers {
             IContentManager contentManager,
             IWorkContextAccessor workContextAccessor,
             IClock clock,
-            ICommentService commentService) {
+            ICommentService commentService,
+            ICommentValidator commentValidator) {
             _contentManager = contentManager;
             _workContextAccessor = workContextAccessor;
             _clock = clock;
-            _commentService = commentService;
+            _commentValidator = commentValidator;
 
             T = NullLocalizer.Instance;
         }
@@ -43,7 +44,7 @@ namespace Orchard.Comments.Drivers {
 
         // GET
         protected override DriverResult Editor(CommentPart part, dynamic shapeHelper) {
-            if (Orchard.UI.Admin.AdminFilter.IsApplied(_workContextAccessor.GetContext().HttpContext.Request.RequestContext)) {
+            if (UI.Admin.AdminFilter.IsApplied(_workContextAccessor.GetContext().HttpContext.Request.RequestContext)) {
                 return ContentShape("Parts_Comment_AdminEdit", 
                     () => shapeHelper.EditorTemplate(TemplateName: "Parts.Comment.AdminEdit", Model: part, Prefix: Prefix));
             }
@@ -64,7 +65,6 @@ namespace Orchard.Comments.Drivers {
                 part.SiteName = "http://" + part.SiteName;
             }
 
-            // TODO: it's very bad how the corresponding user is stored. Needs revision.
             var currentUser = workContext.CurrentUser;
             part.UserName = (currentUser != null ? currentUser.UserName : null);
 
@@ -72,8 +72,11 @@ namespace Orchard.Comments.Drivers {
 
             if (String.IsNullOrEmpty(part.Author)) updater.AddModelError("NameMissing", T("You didn't specify your name."));
 
-            // TODO: needs spam handling
-            part.Status = workContext.CurrentSite.As<CommentSettingsPart>().ModerateComments ? CommentStatus.Pending : CommentStatus.Approved;
+            // applying anti-spam filters
+            var moderateComments = workContext.CurrentSite.As<CommentSettingsPart>().Record.ModerateComments;
+            part.Status = _commentValidator.ValidateComment(part) 
+                ? moderateComments ? CommentStatus.Pending : CommentStatus.Approved 
+                : CommentStatus.Spam;
 
             var commentedOn = _contentManager.Get<ICommonPart>(part.CommentedOn);
             if (commentedOn != null && commentedOn.Container != null) {
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Drivers/MissingFilterBanner.cs b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/MissingFilterBanner.cs
new file mode 100644
index 000000000..1366fa307
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Drivers/MissingFilterBanner.cs
@@ -0,0 +1,39 @@
+using System.Collections.Generic;
+using System.Dynamic;
+using Orchard.Comments.Models;
+using Orchard.Comments.Services;
+using Orchard.ContentManagement;
+using Orchard.Localization;
+using Orchard.UI.Admin.Notification;
+using Orchard.UI.Notify;
+
+namespace Orchard.Comments.Drivers {
+    public class MissingFilterBanner : INotificationProvider {
+        private readonly IOrchardServices _orchardServices;
+        private readonly ICheckSpamEventHandler _spamEventHandler;
+
+        public MissingFilterBanner(IOrchardServices orchardServices, ICheckSpamEventHandler spamEventHandler) {
+            _orchardServices = orchardServices;
+            _spamEventHandler = spamEventHandler;
+            T = NullLocalizer.Instance;
+        }
+
+        public Localizer T { get; set; }
+
+        public IEnumerable<NotifyEntry> GetNotifications() {
+
+            var commentSettings = _orchardServices.WorkContext.CurrentSite.As<CommentSettingsPart>();
+
+            dynamic context = new ExpandoObject();
+            context.Checked = false;
+            context.IsSpam = false;
+            context.Text = string.Empty;
+            
+            _spamEventHandler.CheckSpam(context);
+
+            if (commentSettings != null && commentSettings.EnableSpamProtection && !context.Checked) {
+                yield return new NotifyEntry {Message = T("Comments anti-spam protection requires at least one anti-spam filter to be enabled and configured."), Type = NotifyType.Warning};
+            }
+        }
+    }
+}
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentSettingsPart.cs b/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentSettingsPart.cs
index 131fdf260..0940509d6 100644
--- a/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentSettingsPart.cs
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Models/CommentSettingsPart.cs
@@ -11,15 +11,5 @@ namespace Orchard.Comments.Models {
             get { return Record.EnableSpamProtection; }
             set { Record.EnableSpamProtection = value; }
         } 
-
-        public string AkismetKey {
-            get { return Record.AkismetKey; }
-            set { Record.AkismetKey = value; }
-        }
-
-        public string AkismetUrl {
-            get { return Record.AkismetUrl; }
-            set { Record.AkismetUrl = value; }
-        }
     }
 }
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj b/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj
index 2fcdebf17..64c2b448c 100644
--- a/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Orchard.Comments.csproj
@@ -63,6 +63,7 @@
     <Compile Include="AdminMenu.cs" />
     <Compile Include="Controllers\AdminController.cs" />
     <Compile Include="Controllers\CommentController.cs" />
+    <Compile Include="Drivers\MissingFilterBanner.cs" />
     <Compile Include="Migrations.cs" />
     <Compile Include="Drivers\CommentPartDriver.cs" />
     <Compile Include="Drivers\CommentsContainerPartDriver.cs" />
@@ -72,6 +73,8 @@
     <Compile Include="ResourceManifest.cs" />
     <Compile Include="Rules\CommentsActions.cs" />
     <Compile Include="Rules\CommentsForms.cs" />
+    <Compile Include="Services\CommentValidator.cs" />
+    <Compile Include="Services\ICheckSpamEventHandler.cs" />
     <Compile Include="Shapes.cs" />
     <Compile Include="Models\CommentPart.cs" />
     <Compile Include="Handlers\CommentPartHandler.cs" />
@@ -94,7 +97,6 @@
     <Compile Include="Permissions.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="Services\CommentService.cs" />
-    <Compile Include="Services\CommentValidator.cs" />
     <Compile Include="Services\ICommentValidator.cs" />
     <Compile Include="ViewModels\CommentsDetailsViewModel.cs" />
     <Compile Include="ViewModels\CommentsIndexViewModel.cs" />
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentService.cs b/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentService.cs
index 0d161406f..997e8a057 100644
--- a/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentService.cs
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentService.cs
@@ -1,31 +1,24 @@
-using System;
-using System.Linq;
-using JetBrains.Annotations;
+using JetBrains.Annotations;
 using Orchard.Comments.Models;
-using Orchard.ContentManagement.Aspects;
-using Orchard.Data;
 using Orchard.Logging;
 using Orchard.ContentManagement;
-using Orchard.Services;
 
 namespace Orchard.Comments.Services {
     [UsedImplicitly]
     public class CommentService : ICommentService {
-        private readonly IClock _clock;
-        private readonly ICommentValidator _commentValidator;
         private readonly IOrchardServices _orchardServices;
 
-        public CommentService(IClock clock,
-                              ICommentValidator commentValidator,
-                              IOrchardServices orchardServices) {
-            _clock = clock;
-            _commentValidator = commentValidator;
+        public CommentService(IOrchardServices orchardServices) {
             _orchardServices = orchardServices;
             Logger = NullLogger.Instance;
         }
 
         public ILogger Logger { get; set; }
 
+        public CommentPart GetComment(int id) {
+            return _orchardServices.ContentManager.Get<CommentPart>(id);
+        }
+        
         public IContentQuery<CommentPart, CommentPartRecord> GetComments() {
             return _orchardServices.ContentManager
                        .Query<CommentPart, CommentPartRecord>();
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentValidator.cs b/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentValidator.cs
index a76fc18d5..92128aa67 100644
--- a/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentValidator.cs
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Services/CommentValidator.cs
@@ -1,61 +1,30 @@
-using System;
-using System.Web;
-using JetBrains.Annotations;
+using System.Dynamic;
 using Orchard.Comments.Models;
-using Orchard.ContentManagement;
-using Orchard.Localization;
-using Orchard.Logging;
-using Orchard.UI.Notify;
-using Joel.Net;
 
 namespace Orchard.Comments.Services {
-    //This uses an akismet api implementation from http://akismetapi.codeplex.com/ 
-    //Since the implementation is trivial, it may make sense to implement it to reduce dependencies.
-    [UsedImplicitly]
-    public class AkismetCommentValidator : ICommentValidator {
-        private readonly INotifier _notifer;
-        private readonly IOrchardServices _orchardServices;
+    public class AntiSpamFilterValidator : ICommentValidator {
+        private readonly ICheckSpamEventHandler _spamEventHandler;
 
-        public AkismetCommentValidator(INotifier notifier, IOrchardServices orchardServices) {
-            _notifer = notifier;
-            _orchardServices = orchardServices;
-            Logger = NullLogger.Instance;
-            T = NullLocalizer.Instance;
+        public AntiSpamFilterValidator(ICheckSpamEventHandler spamEventHandler) {
+            _spamEventHandler = spamEventHandler;
         }
 
-        public ILogger Logger { get; set; }
-        public Localizer T { get; set; }
-
         public bool ValidateComment(CommentPart commentPart) {
-            CommentSettingsPartRecord commentSettingsPartRecord = _orchardServices.WorkContext.CurrentSite.As<CommentSettingsPart>().Record;
-            string akismetKey = commentSettingsPartRecord.AkismetKey;
-            string akismetUrl = commentSettingsPartRecord.AkismetUrl;
-            bool enableSpamProtection = commentSettingsPartRecord.EnableSpamProtection;
-            if (enableSpamProtection == false) {
-                return true;
-            }
-            if (String.IsNullOrEmpty(akismetKey)) {
-                _notifer.Information(T("Please configure your Akismet key for spam protection"));
-                return true;
-            }
-            if (String.IsNullOrEmpty(akismetUrl)) {
-                akismetUrl = "http://www.orchardproject.net";
-            }
-            Akismet akismetApi = new Akismet(akismetKey, akismetUrl, null);
-            AkismetComment akismetComment = new AkismetComment {
-                CommentAuthor = commentPart.Record.Author,
-                CommentAuthorEmail = commentPart.Record.Email,
-                Blog = akismetUrl,
-                CommentAuthorUrl = commentPart.Record.SiteName,
-                CommentContent = commentPart.Record.CommentText,
-                UserAgent = HttpContext.Current.Request.UserAgent,
-            };
+            // true == spam
 
-            if (akismetApi.VerifyKey()) {
-                return !akismetApi.CommentCheck(akismetComment); // CommentCheck returning true == spam
-            }
+            var text = commentPart.Author + System.Environment.NewLine
+                       + commentPart.CommentText + System.Environment.NewLine
+                       + commentPart.Email + System.Environment.NewLine
+                       + commentPart.SiteName + System.Environment.NewLine;
 
-            return false;
+            dynamic context = new ExpandoObject();
+            context.Checked = false;
+            context.IsSpam = false;
+            context.Text = text;
+
+            _spamEventHandler.CheckSpam(context);
+
+            return context.IsSpam;
         }
     }
 }
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Services/ICheckSpamEventHandler.cs b/src/Orchard.Web/Modules/Orchard.Comments/Services/ICheckSpamEventHandler.cs
new file mode 100644
index 000000000..3d2731940
--- /dev/null
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Services/ICheckSpamEventHandler.cs
@@ -0,0 +1,10 @@
+using Orchard.Events;
+
+namespace Orchard.Comments.Services {
+    /// <summary>
+    /// Stub interface for Orchard.AntiSpam.EventHandlers.ISpamEventHandler
+    /// </summary>
+    public interface ICheckSpamEventHandler : IEventHandler {
+        void CheckSpam(dynamic context);
+    }
+}
\ No newline at end of file
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Services/ICommentService.cs b/src/Orchard.Web/Modules/Orchard.Comments/Services/ICommentService.cs
index 540babe99..50b1d04f8 100644
--- a/src/Orchard.Web/Modules/Orchard.Comments/Services/ICommentService.cs
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Services/ICommentService.cs
@@ -7,6 +7,7 @@ namespace Orchard.Comments.Services {
         IContentQuery<CommentPart, CommentPartRecord> GetComments(CommentStatus status);
         IContentQuery<CommentPart, CommentPartRecord> GetCommentsForCommentedContent(int id);
         IContentQuery<CommentPart, CommentPartRecord> GetCommentsForCommentedContent(int id, CommentStatus status);
+        CommentPart GetComment(int id);
         ContentItemMetadata GetDisplayForCommentedContent(int id);
         ContentItem GetCommentedContent(int id);
         void ApproveComment(int commentId);
diff --git a/src/Orchard.Web/Modules/Orchard.Comments/Views/EditorTemplates/Parts.Comments.SiteSettings.cshtml b/src/Orchard.Web/Modules/Orchard.Comments/Views/EditorTemplates/Parts.Comments.SiteSettings.cshtml
index 8241a99c8..a31b2fb97 100644
--- a/src/Orchard.Web/Modules/Orchard.Comments/Views/EditorTemplates/Parts.Comments.SiteSettings.cshtml
+++ b/src/Orchard.Web/Modules/Orchard.Comments/Views/EditorTemplates/Parts.Comments.SiteSettings.cshtml
@@ -6,20 +6,12 @@
         @Html.EditorFor(m => m.ModerateComments)
         <label class="forcheckbox" for="CommentSettings_ModerateComments">@T("Comments must be approved before they appear")</label>
         @Html.ValidationMessage("ModerateComments", "*")
+        <span class="hint">@T("Check if you want to manually approve comments before they can be displayed.")</span>
     </div>
     <div>
         @Html.EditorFor(m => m.EnableSpamProtection) 
         <label class="forcheckbox" for="@Html.FieldIdFor(m => m.EnableSpamProtection)">@T("Enable spam protection")</label>
         @Html.ValidationMessage("EnableSpamProtection", "*")
-    </div>
-    <div data-controllerid="@Html.FieldIdFor(m => m.EnableSpamProtection)">
-        <label for="CommentSettings_AkismetKey">@T("Akismet key")</label>
-        @Html.EditorFor(m => m.AkismetKey)
-        @Html.ValidationMessage("AkismetKey", "*")
-    </div>
-    <div data-controllerid="@Html.FieldIdFor(m => m.EnableSpamProtection)">
-        <label for="CommentSettings_AkismetUrl">@T("Blog URL")</label>
-        @Html.EditorFor(m => m.AkismetUrl) 
-        @Html.ValidationMessage("AkismetUrl", "*")
+        <span class="hint">@T("Check to use an anti-spam filter on incoming comments. This requires that you have also enabled an actual filter like Akismet or Typepad.")</span>
     </div>
 </fieldset>
\ No newline at end of file