diff --git a/src/Nest/Analysis/TokenFilters/PredicateTokenFilter .cs b/src/Nest/Analysis/TokenFilters/PredicateTokenFilter .cs
new file mode 100644
index 00000000000..4f7f18a4fa7
--- /dev/null
+++ b/src/Nest/Analysis/TokenFilters/PredicateTokenFilter .cs
@@ -0,0 +1,43 @@
+using System;
+using Newtonsoft.Json;
+
+namespace Nest
+{
+ ///
+ /// The predicate_token_filter token filter takes a predicate script, and removes tokens that do
+ /// not match the predicate.
+ ///
+ public interface IPredicateTokenFilter : ITokenFilter
+ {
+ ///
+ /// a predicate script that determines whether or not the current token will
+ /// be emitted. Note that only inline scripts are supported.
+ ///
+ [JsonProperty("script")]
+ IScript Script { get; set; }
+ }
+
+ public class PredicateTokenFilter : TokenFilterBase, IPredicateTokenFilter
+ {
+ public PredicateTokenFilter() : base("predicate_token_filter") { }
+
+ public IScript Script { get; set; }
+ }
+
+ ///
+ public class PredicateTokenFilterDescriptor
+ : TokenFilterDescriptorBase, IPredicateTokenFilter
+ {
+ protected override string Type => "predicate_token_filter";
+
+ IScript IPredicateTokenFilter.Script { get; set; }
+
+ ///
+ public PredicateTokenFilterDescriptor Script(Func scriptSelector) =>
+ Assign(a => a.Script = scriptSelector?.Invoke(new ScriptDescriptor()));
+
+ ///
+ public PredicateTokenFilterDescriptor Script(string predicate) =>
+ Assign(a => a.Script = new InlineScript(predicate));
+ }
+}