diff --git a/netfilterqueue/_impl.pxd b/netfilterqueue/_impl.pxd
index be1db6f..d11aea8 100644
--- a/netfilterqueue/_impl.pxd
+++ b/netfilterqueue/_impl.pxd
@@ -1,22 +1,18 @@
-cdef extern from "<sys/types.h>":
+cdef extern from "sys/types.h":
     ctypedef unsigned char u_int8_t
     ctypedef unsigned short int u_int16_t
     ctypedef unsigned int u_int32_t
 
-cdef extern from "<unistd.h>":
-    int dup2(int oldfd, int newfd)
-
 cdef extern from "<errno.h>":
     int errno
 
 # dummy defines from asm-generic/errno.h:
 cdef enum:
-    EINTR = 4
     EAGAIN = 11           # Try again
     EWOULDBLOCK = EAGAIN
     ENOBUFS = 105         # No buffer space available
 
-cdef extern from "<netinet/ip.h>":
+cdef extern from "netinet/ip.h":
     struct iphdr:
         u_int8_t tos
         u_int16_t tot_len
@@ -63,7 +59,7 @@ cdef extern from "Python.h":
     object PyBytes_FromStringAndSize(char *s, Py_ssize_t len)
     object PyString_FromStringAndSize(char *s, Py_ssize_t len)
 
-cdef extern from "<sys/time.h>":
+cdef extern from "sys/time.h":
     ctypedef long time_t
     struct timeval:
         time_t tv_sec
@@ -71,7 +67,7 @@ cdef extern from "<sys/time.h>":
     struct timezone:
         pass
 
-cdef extern from "<netinet/in.h>":
+cdef extern from "netinet/in.h":
     u_int32_t ntohl (u_int32_t __netlong) nogil
     u_int16_t ntohs (u_int16_t __netshort) nogil
     u_int32_t htonl (u_int32_t __hostlong) nogil
@@ -86,9 +82,6 @@ cdef extern from "libnfnetlink/linux_nfnetlink.h":
 cdef extern from "libnfnetlink/libnfnetlink.h":
     struct nfnl_handle:
         pass
-    nfnl_handle *nfnl_open()
-    void nfnl_close(nfnl_handle *h)
-    int nfnl_fd(nfnl_handle *h)
     unsigned int nfnl_rcvbufsiz(nfnl_handle *h, unsigned int size)
 
 cdef extern from "libnetfilter_queue/linux_nfnetlink_queue.h":
@@ -112,7 +105,6 @@ cdef extern from "libnetfilter_queue/libnetfilter_queue.h":
         u_int8_t hw_addr[8]
 
     nfq_handle *nfq_open()
-    nfq_handle *nfq_open_nfnl(nfnl_handle *h)
     int nfq_close(nfq_handle *h)
 
     int nfq_bind_pf(nfq_handle *h, u_int16_t pf)
@@ -123,17 +115,15 @@ cdef extern from "libnetfilter_queue/libnetfilter_queue.h":
                                     u_int16_t num,
                                     nfq_callback *cb,
                                     void *data)
+    int nfq_destroy_queue(nfq_q_handle *qh)
 
-    # Any function that parses Netlink replies might invoke the user
-    # callback and thus might need to propagate a Python exception.
-    # This includes nfq_handle_packet but is not limited to that --
-    # other functions might send a query, read until they get the reply,
-    # and find a packet notification before the reply which they then
-    # must deal with.
-    int nfq_destroy_queue(nfq_q_handle *qh) except? -1
-    int nfq_handle_packet(nfq_handle *h, char *buf, int len) except? -1
-    int nfq_set_mode(nfq_q_handle *qh, u_int8_t mode, unsigned int len) except? -1
-    int nfq_set_queue_maxlen(nfq_q_handle *qh, u_int32_t queuelen) except? -1
+    int nfq_handle_packet(nfq_handle *h, char *buf, int len)
+
+    int nfq_set_mode(nfq_q_handle *qh,
+                       u_int8_t mode, unsigned int len)
+
+    q_set_queue_maxlen(nfq_q_handle *qh,
+                     u_int32_t queuelen)
 
     int nfq_set_verdict(nfq_q_handle *qh,
                           u_int32_t id,
@@ -147,24 +137,24 @@ cdef extern from "libnetfilter_queue/libnetfilter_queue.h":
                             u_int32_t mark,
                             u_int32_t datalen,
                             unsigned char *buf) nogil
+    int nfq_set_queue_maxlen(nfq_q_handle *qh, u_int32_t queuelen)
 
     int nfq_fd(nfq_handle *h)
     nfqnl_msg_packet_hdr *nfq_get_msg_packet_hdr(nfq_data *nfad)
-    int nfq_get_payload(nfq_data *nfad, unsigned char **data)
+    int nfq_get_payload(nfq_data *nfad, char **data)
     int nfq_get_timestamp(nfq_data *nfad, timeval *tv)
     nfqnl_msg_packet_hw *nfq_get_packet_hw(nfq_data *nfad)
     int nfq_get_nfmark (nfq_data *nfad)
     u_int8_t nfq_get_indev(nfq_data *nfad)
     u_int8_t nfq_get_outdev(nfq_data *nfad)
     nfnl_handle *nfq_nfnlh(nfq_handle *h)
-
+    
 # Dummy defines from linux/socket.h:
 cdef enum: #  Protocol families, same as address families.
     PF_INET = 2
     PF_INET6 = 10
-    PF_NETLINK = 16
 
-cdef extern from "<sys/socket.h>":
+cdef extern from "sys/socket.h":
     ssize_t recv(int __fd, void *__buf, size_t __n, int __flags) nogil
     int MSG_DONTWAIT
 
@@ -178,22 +168,14 @@ cdef enum:
     NF_STOP
     NF_MAX_VERDICT = NF_STOP
 
-cdef class NetfilterQueue:
-    cdef object __weakref__
-    cdef object user_callback # User callback
-    cdef nfq_handle *h # Handle to NFQueue library
-    cdef nfq_q_handle *qh # A handle to the queue
-
 cdef class Packet:
-    cdef NetfilterQueue _queue
-    cdef bint _verdict_is_set # True if verdict has been issued,
-        # false otherwise
-    cdef bint _mark_is_set # True if a mark has been given, false otherwise
-    cdef bint _hwaddr_is_set
-    cdef bint _timestamp_is_set
-    cdef u_int32_t _given_mark # Mark given to packet
+    cdef nfq_q_handle *_qh
+    cdef nfq_data *_nfa
+    cdef nfqnl_msg_packet_hdr *_hdr
+    cdef nfqnl_msg_packet_hw *_hw
+    cdef bint _verdict_is_set # True if verdict has been issued, otherwise false
+    cdef u_int32_t _modified_mark # Mark given to packet
     cdef bytes _given_payload # New payload of packet, or null
-    cdef bytes _owned_payload
 
     # From NFQ packet header:
     cdef readonly u_int32_t id
@@ -203,27 +185,36 @@ cdef class Packet:
 
     # Packet details:
     cdef Py_ssize_t payload_len
-    cdef unsigned char *payload
+    cdef readonly unsigned char *payload
     cdef timeval timestamp
     cdef u_int8_t hw_addr[8]
 
-    # TODO: implement these
+    # TODO: implement these | likely not using in this manner.
+    #cdef u_int8_t hw_addr[8] # A eui64-formatted address?
     #cdef readonly u_int32_t nfmark
     #cdef readonly u_int32_t indev
     #cdef readonly u_int32_t physindev
     #cdef readonly u_int32_t outdev
     #cdef readonly u_int32_t physoutdev
 
-    cdef set_nfq_data(self, NetfilterQueue queue, nfq_data *nfa)
-    cdef drop_refs(self)
-    cdef int verdict(self, u_int8_t verdict) except -1
+    cdef set_nfq_data(self, nfq_q_handle *qh, nfq_data *nfa)
+    cdef void verdict(self, u_int8_t verdict)
+    cpdef get_inint(self, bint name=*)
+    cpdef get_outint(self, bint name=*)
+    cpdef update_mark(self, u_int32_t mark)
     cpdef Py_ssize_t get_payload_len(self)
     cpdef double get_timestamp(self)
-    cpdef bytes get_payload(self)
     cpdef set_payload(self, bytes payload)
-    cpdef set_mark(self, u_int32_t mark)
-    cpdef get_mark(self)
-    cpdef retain(self)
+    #cpdef get_mark(self)
     cpdef accept(self)
     cpdef drop(self)
+    cpdef forward(self, u_int16_t queue_num)
     cpdef repeat(self)
+
+cdef class NetfilterQueue:
+    cdef object user_callback # User callback
+    cdef nfq_handle *h # Handle to NFQueue library
+    cdef nfq_q_handle *qh # A handle to the queue
+    cdef u_int16_t af # Address family
+    cdef packet_copy_size # Amount of packet metadata + data copied to buffer
+