diff -Naur findutils-4.4.2-old/doc/find.info findutils-4.4.2-new/doc/find.info
diff -Naur findutils-4.4.2-old/find/defs.h findutils-4.4.2-new/find/defs.h
--- findutils-4.4.2-old/find/defs.h	2009-05-16 17:17:01.000000000 +0200
+++ findutils-4.4.2-new/find/defs.h	2010-05-27 21:48:44.367988756 +0200
@@ -450,6 +450,7 @@
 PREDICATEFUNCTION pred_quit;
 PREDICATEFUNCTION pred_readable;
 PREDICATEFUNCTION pred_regex;
+PREDICATEFUNCTION pred_dtype;
 PREDICATEFUNCTION pred_samefile;
 PREDICATEFUNCTION pred_size;
 PREDICATEFUNCTION pred_true;
diff -Naur findutils-4.4.2-old/find/parser.c findutils-4.4.2-new/find/parser.c
--- findutils-4.4.2-old/find/parser.c	2009-05-16 17:17:01.000000000 +0200
+++ findutils-4.4.2-new/find/parser.c	2010-05-27 21:48:44.354001118 +0200
@@ -144,6 +144,7 @@
 static boolean parse_time          PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
 static boolean parse_true          PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
 static boolean parse_type          PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
+static boolean parse_dtype         PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
 static boolean parse_uid           PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
 static boolean parse_used          PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
 static boolean parse_user          PARAMS((const struct parser_table*, char *argv[], int *arg_ptr));
@@ -164,7 +165,8 @@
 				   PRED_FUNC which_pred));
 static boolean insert_regex PARAMS((char *argv[], int *arg_ptr,
 				    const struct parser_table *entry,
-				    int regex_options));
+				    int regex_options, 
+				    PRED_FUNC *func));
 static boolean insert_fprintf (struct format_val *vec,
 			       const struct parser_table *entry,
 			       PRED_FUNC func,
@@ -321,6 +323,7 @@
   {ARG_TEST,       "writable",               parse_accesscheck, pred_writable}, /* GNU, 4.3.0+ */
   PARSE_OPTION     ("xdev",                  xdev), /* POSIX */
   PARSE_TEST       ("xtype",                 xtype),	     /* GNU */
+  PARSE_TEST       ("dtype",                 dtype),	     /* GNU */
 #ifdef UNIMPLEMENTED_UNIX
   /* It's pretty ugly for find to know about archive formats.
      Plus what it could do with cpio archives is very limited.
@@ -1286,7 +1289,7 @@
 static boolean
 parse_iregex (const struct parser_table* entry, char **argv, int *arg_ptr)
 {
-  return insert_regex (argv, arg_ptr, entry, RE_ICASE|options.regex_options);
+  return insert_regex (argv, arg_ptr, entry, RE_ICASE|options.regex_options,0);
 }
 
 static boolean
@@ -2022,21 +2025,39 @@
 static boolean
 parse_regex (const struct parser_table* entry, char **argv, int *arg_ptr)
 {
-  return insert_regex (argv, arg_ptr, entry, options.regex_options);
+  return insert_regex (argv, arg_ptr, entry, options.regex_options, 0);
+}
+
+#include "magic.h"
+struct magic_set *magic = NULL;
+
+static boolean
+parse_dtype (const struct parser_table* entry, char **argv, int *arg_ptr)
+{
+  int flags = 0;  char *magicfile = 0;
+  if (magic == NULL) {
+    magic = magic_open(flags);
+    if (magic_load(magic, magicfile) == -1) {
+      magic_close(magic);
+      magic = 0;
+    }
+  }
+  return insert_regex (argv, arg_ptr, entry, options.regex_options, pred_dtype);
 }
 
 static boolean
 insert_regex (char **argv,
 	      int *arg_ptr,
 	      const struct parser_table *entry,
-	      int regex_options)
+	      int regex_options, 
+	      PRED_FUNC *func)
 {
   const char *rx;
   if (collect_arg(argv, arg_ptr, &rx))
     {
       struct re_pattern_buffer *re;
       const char *error_message;
-      struct predicate *our_pred = insert_primary_withpred (entry, pred_regex);
+      struct predicate *our_pred = insert_primary_withpred (entry, func ? func : pred_regex);
       our_pred->need_stat = our_pred->need_type = false;
       re = xmalloc (sizeof (struct re_pattern_buffer));
       our_pred->args.regex = re;
diff -Naur findutils-4.4.2-old/find/pred.c findutils-4.4.2-new/find/pred.c
--- findutils-4.4.2-old/find/pred.c	2009-05-16 17:17:01.000000000 +0200
+++ findutils-4.4.2-new/find/pred.c	2010-05-27 21:48:44.363988337 +0200
@@ -221,6 +221,7 @@
   {pred_quit, "quit    "},
   {pred_readable, "readable    "},
   {pred_regex, "regex   "},
+  {pred_dtype, "dtype   "},
   {pred_samefile,"samefile "},
   {pred_size, "size    "},
   {pred_true, "true    "},
@@ -1648,6 +1649,26 @@
   return (false);
 }
 
+#include <magic.h>
+
+extern struct magic_set *magic;
+
+boolean
+pred_dtype (const char *pathname, struct stat *stat_buf, struct predicate *pred_ptr)
+{
+  int len = strlen (pathname); char *type;
+(void) stat_buf;
+ if (magic) {
+   if ((type = magic_file(magic, pathname))) {
+     len = strlen(type);
+     if (re_match (pred_ptr->args.regex, type, len, 0,
+		   (struct re_registers *) NULL) == len)
+       return (true);
+   }
+ }
+ return (false);
+}
+
 boolean
 pred_size (const char *pathname, struct stat *stat_buf, struct predicate *pred_ptr)
 {
diff -Naur findutils-4.4.2-old/find/tree.c findutils-4.4.2-new/find/tree.c
--- findutils-4.4.2-old/find/tree.c	2009-05-16 17:17:01.000000000 +0200
+++ findutils-4.4.2-new/find/tree.c	2010-05-27 21:48:44.355988616 +0200
@@ -945,6 +945,7 @@
     { pred_quit	     ,  NeedsNothing         },
     { pred_readable  ,  NeedsAccessInfo      },
     { pred_regex     ,  NeedsNothing         },
+    { pred_dtype     ,  NeedsType            },
     { pred_samefile  ,  NeedsStatInfo        },
     { pred_size      ,  NeedsStatInfo        },
     { pred_true	     ,  NeedsNothing         },
