diff --git a/src/sysdep.c b/src/sysdep.c
index 6ec8eec..78e23a0 100644
--- a/src/sysdep.c
+++ b/src/sysdep.c
@@ -3238,7 +3238,7 @@ system_process_attributes (Lisp_Object pid)
   return attrs;
 }
 
-#elif defined __FreeBSD__
+#elif defined __FreeBSD__ || defined DARWIN_OS
 
 static struct timespec
 timeval_to_timespec (struct timeval t)
@@ -3264,7 +3264,12 @@ system_process_attributes (Lisp_Object pid)
   char *ttyname;
   size_t len;
   char args[MAXPATHLEN];
+  struct timeval starttime;
   struct timespec t, now;
+  struct rusage *rusage;
+  dev_t tdev;
+  uid_t uid;
+  gid_t gid;
 
   int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID};
   struct kinfo_proc proc;
@@ -3283,30 +3288,52 @@ system_process_attributes (Lisp_Object pid)
 
   GCPRO2 (attrs, decoded_comm);
 
-  attrs = Fcons (Fcons (Qeuid, make_fixnum_or_float (proc.ki_uid)), attrs);
+#ifdef DARWIN_OS
+  uid = proc.kp_eproc.e_ucred.cr_uid;
+#else
+  uid = proc.ki_uid;
+#endif
+  attrs = Fcons (Fcons (Qeuid, make_fixnum_or_float (uid)), attrs);
 
   block_input ();
-  pw = getpwuid (proc.ki_uid);
+  pw = getpwuid (uid);
   unblock_input ();
   if (pw)
     attrs = Fcons (Fcons (Quser, build_string (pw->pw_name)), attrs);
 
-  attrs = Fcons (Fcons (Qegid, make_fixnum_or_float (proc.ki_svgid)), attrs);
+#ifdef DARWIN_OS
+  gid = proc.kp_eproc.e_pcred.p_svgid;
+#else
+  gid = proc.ki_svgid;
+#endif
+  attrs = Fcons (Fcons (Qegid, make_fixnum_or_float (gid)), attrs);
 
   block_input ();
-  gr = getgrgid (proc.ki_svgid);
+  gr = getgrgid (gid);
   unblock_input ();
   if (gr)
     attrs = Fcons (Fcons (Qgroup, build_string (gr->gr_name)), attrs);
 
+#ifdef DARWIN_OS
+  decoded_comm = (code_convert_string_norecord
+		  (build_unibyte_string (proc.kp_proc.p_comm),
+		   Vlocale_coding_system, 0));
+#else
   decoded_comm = (code_convert_string_norecord
 		  (build_unibyte_string (proc.ki_comm),
 		   Vlocale_coding_system, 0));
+#endif
 
   attrs = Fcons (Fcons (Qcomm, decoded_comm), attrs);
   {
     char state[2] = {'\0', '\0'};
-    switch (proc.ki_stat)
+    char stat;
+#ifdef DARWIN_OS
+    stat = proc.kp_proc.p_stat;
+#else
+    stat = proc.ki_stat;
+#endif
+    switch (stat)
       {
       case SRUN:
 	state[0] = 'R';
@@ -3316,9 +3343,11 @@ system_process_attributes (Lisp_Object pid)
 	state[0] = 'S';
 	break;
 
+#ifdef SLOCK
       case SLOCK:
 	state[0] = 'D';
 	break;
+#endif
 
       case SZOMB:
 	state[0] = 'Z';
@@ -3327,34 +3356,66 @@ system_process_attributes (Lisp_Object pid)
       case SSTOP:
 	state[0] = 'T';
 	break;
+
+#ifdef SIDL
+      case SIDL:
+	state[0] = 'I';
+	break;
+#endif
       }
     attrs = Fcons (Fcons (Qstate, build_string (state)), attrs);
   }
 
+#ifdef DARWIN_OS
+  attrs = Fcons (Fcons (Qppid, make_fixnum_or_float (proc.kp_eproc.e_ppid)), attrs);
+  attrs = Fcons (Fcons (Qpgrp, make_fixnum_or_float (proc.kp_eproc.e_pgid)), attrs);
+#else
   attrs = Fcons (Fcons (Qppid, make_fixnum_or_float (proc.ki_ppid)), attrs);
   attrs = Fcons (Fcons (Qpgrp, make_fixnum_or_float (proc.ki_pgid)), attrs);
   attrs = Fcons (Fcons (Qsess, make_fixnum_or_float (proc.ki_sid)),  attrs);
+#endif
 
+#ifdef DARWIN_OS
+  tdev = proc.kp_eproc.e_tdev;
+#else
+  tdev = proc.ki_tdev;
+#endif
   block_input ();
-  ttyname = proc.ki_tdev == NODEV ? NULL : devname (proc.ki_tdev, S_IFCHR);
+  ttyname = tdev == NODEV ? NULL : devname (tdev, S_IFCHR);
   unblock_input ();
   if (ttyname)
     attrs = Fcons (Fcons (Qtty, build_string (ttyname)), attrs);
 
+#ifdef DARWIN_OS
+  attrs = Fcons (Fcons (Qtpgid,   make_fixnum_or_float (proc.kp_eproc.e_tpgid)), attrs);
+#else
   attrs = Fcons (Fcons (Qtpgid,   make_fixnum_or_float (proc.ki_tpgid)), attrs);
-  attrs = Fcons (Fcons (Qminflt,  make_fixnum_or_float (proc.ki_rusage.ru_minflt)), attrs);
-  attrs = Fcons (Fcons (Qmajflt,  make_fixnum_or_float (proc.ki_rusage.ru_majflt)), attrs);
+#endif
+
+#ifdef DARWIN_OS
+  rusage = proc.kp_proc.p_ru;
+#else
+  rusage = &proc.ki_rusage;
+#endif
+  if (rusage)
+    {
+      attrs = Fcons (Fcons (Qminflt,  make_fixnum_or_float (rusage->ru_minflt)), attrs);
+      attrs = Fcons (Fcons (Qmajflt,  make_fixnum_or_float (rusage->ru_majflt)), attrs);
+
+      attrs = Fcons (Fcons (Qutime, make_lisp_timeval (rusage->ru_utime)),
+		     attrs);
+      attrs = Fcons (Fcons (Qstime, make_lisp_timeval (rusage->ru_stime)),
+		     attrs);
+      t = timespec_add (timeval_to_timespec (rusage->ru_utime),
+			timeval_to_timespec (rusage->ru_stime));
+      attrs = Fcons (Fcons (Qtime, make_lisp_time (t)), attrs);
+    }
+#ifndef DARWIN_OS
   attrs = Fcons (Fcons (Qcminflt, make_number (proc.ki_rusage_ch.ru_minflt)), attrs);
   attrs = Fcons (Fcons (Qcmajflt, make_number (proc.ki_rusage_ch.ru_majflt)), attrs);
+#endif
 
-  attrs = Fcons (Fcons (Qutime, make_lisp_timeval (proc.ki_rusage.ru_utime)),
-		 attrs);
-  attrs = Fcons (Fcons (Qstime, make_lisp_timeval (proc.ki_rusage.ru_stime)),
-		 attrs);
-  t = timespec_add (timeval_to_timespec (proc.ki_rusage.ru_utime),
-		    timeval_to_timespec (proc.ki_rusage.ru_stime));
-  attrs = Fcons (Fcons (Qtime, make_lisp_time (t)), attrs);
-
+#ifndef DARWIN_OS
   attrs = Fcons (Fcons (Qcutime,
 			make_lisp_timeval (proc.ki_rusage_ch.ru_utime)),
 		 attrs);
@@ -3368,16 +3429,24 @@ system_process_attributes (Lisp_Object pid)
   attrs = Fcons (Fcons (Qthcount, make_fixnum_or_float (proc.ki_numthreads)),
 		 attrs);
   attrs = Fcons (Fcons (Qpri,   make_number (proc.ki_pri.pri_native)), attrs);
+#endif
+#ifdef DARWIN_OS
+  starttime = proc.kp_proc.p_starttime;
+  attrs = Fcons (Fcons (Qnice,  make_number (proc.kp_proc.p_nice)), attrs);
+#else
+  starttime = proc.ki_start;
   attrs = Fcons (Fcons (Qnice,  make_number (proc.ki_nice)), attrs);
-  attrs = Fcons (Fcons (Qstart, make_lisp_timeval (proc.ki_start)), attrs);
   attrs = Fcons (Fcons (Qvsize, make_number (proc.ki_size >> 10)), attrs);
   attrs = Fcons (Fcons (Qrss,   make_number (proc.ki_rssize * pagesize >> 10)),
 		 attrs);
+#endif
+  attrs = Fcons (Fcons (Qstart, make_lisp_timeval (starttime)), attrs);
 
   now = current_timespec ();
-  t = timespec_sub (now, timeval_to_timespec (proc.ki_start));
+  t = timespec_sub (now, timeval_to_timespec (starttime));
   attrs = Fcons (Fcons (Qetime, make_lisp_time (t)), attrs);
 
+#ifndef DARWIN_OS
   len = sizeof fscale;
   if (sysctlbyname ("kern.fscale", &fscale, &len, NULL, 0) == 0)
     {
@@ -3419,6 +3488,7 @@ system_process_attributes (Lisp_Object pid)
 
       attrs = Fcons (Fcons (Qargs, decoded_comm), attrs);
     }
+#endif
 
   UNGCPRO;
   return attrs;
