diff --git a/openssl/src/stack.rs b/openssl/src/stack.rs
index 4d5c0a136df98d0876937baa2e68245fdd2e2945..ac1e2a137cbe92f0d3a1fee833ece8e3dbaa02ab 100644
--- a/openssl/src/stack.rs
+++ b/openssl/src/stack.rs
@@ -40,15 +40,8 @@ pub trait Stackable: ForeignType {
 /// An owned stack of `T`.
 pub struct Stack<T: Stackable>(*mut T::StackType);
 
-impl<T: Stackable> Stack<T> {
-    pub fn new() -> Result<Stack<T>, ErrorStack> {
-        unsafe {
-            ffi::init();
-            let ptr = cvt_p(OPENSSL_sk_new_null())?;
-            Ok(Stack(ptr as *mut _))
-        }
-    }
-}
+unsafe impl<T: Stackable + Send> Send for Stack<T> {}
+unsafe impl<T: Stackable + Sync> Sync for Stack<T> {}
 
 impl<T: Stackable> Drop for Stack<T> {
     fn drop(&mut self) {
@@ -59,6 +52,16 @@ impl<T: Stackable> Drop for Stack<T> {
     }
 }
 
+impl<T: Stackable> Stack<T> {
+    pub fn new() -> Result<Stack<T>, ErrorStack> {
+        unsafe {
+            ffi::init();
+            let ptr = cvt_p(OPENSSL_sk_new_null())?;
+            Ok(Stack(ptr as *mut _))
+        }
+    }
+}
+
 impl<T: Stackable> iter::IntoIterator for Stack<T> {
     type IntoIter = IntoIter<T>;
     type Item = T;
@@ -164,6 +167,9 @@ impl<T: Stackable> ExactSizeIterator for IntoIter<T> {}
 
 pub struct StackRef<T: Stackable>(Opaque, PhantomData<T>);
 
+unsafe impl<T: Stackable + Send> Send for StackRef<T> {}
+unsafe impl<T: Stackable + Sync> Sync for StackRef<T> {}
+
 impl<T: Stackable> ForeignTypeRef for StackRef<T> {
     type CType = T::StackType;
 }