diff --git a/dune/common/test/shared_ptrtest.cc b/dune/common/test/shared_ptrtest.cc
index 9871296f446e1d5f559c2e83acf835c174a67e1d..709f8173a85beb97fda536473fb5cbb8a5d0b3e8 100644
--- a/dune/common/test/shared_ptrtest.cc
+++ b/dune/common/test/shared_ptrtest.cc
@@ -12,6 +12,24 @@
 #include <vector>
 #include <cstdlib>
 
+template<class T>
+class Deleter
+{
+public:
+  Deleter(bool& deleted) :
+    deleted_(deleted)
+  {}
+
+  void operator() (T* p) const
+  {
+    delete p;
+    deleted_ = true;
+  }
+
+private:
+  mutable bool& deleted_;
+};
+
 int main(){
   using namespace Dune;
   int ret=0;
@@ -25,6 +43,58 @@ int main(){
       ret=1;
     }
 
+    // test custom deleter
+    bool deleted = false;
+    {
+      shared_ptr<int> foo(new int(1), Deleter<int>(deleted));
+
+      //test if deleter is called
+      deleted = false;
+      foo.reset(new int(2));        // this should call the deleter in the constructor
+      if (not (deleted))
+      {
+        std::cout << "Custom deleter not called!" << std::endl;
+        ret=1;
+      }
+
+      //test if old deleter is not called
+      deleted = false;
+      foo.reset();        // this should call no deleter
+      if (deleted)
+      {
+        std::cout << "Old deleter was called!" << std::endl;
+        ret=1;
+      }
+
+      //test if old deleter is not called
+      deleted = false;
+      foo.reset(new int(3), Deleter<int>(deleted));        // this should call no deleter
+      if (deleted)
+      {
+        std::cout << "Old deleter was called!" << std::endl;
+        ret=1;
+      }
+      // going out of scope should call the deleter
+    }
+    if (not (deleted))
+    {
+      std::cout << "Custom deleter not called!" << std::endl;
+      ret=1;
+    }
+    {
+      shared_ptr<int> foo(new int(1), Deleter<int>(deleted));
+
+      foo.reset(new int(4));        // this should call the deleter...
+
+      deleted = false;
+      // ... but going out of scope should call no deleter
+    }
+    if (deleted)
+    {
+      std::cout << "1Old deleter was called!" << std::endl;
+      ret=1;
+    }
+
     // test constructor from a given pointer
     shared_ptr<double> bar(new double(43.0));
     assert(bar);
@@ -33,14 +103,18 @@ int main(){
     bar.reset();
     assert(!bar);
 
+    // test get() for empty shared_ptr
+    assert(!bar.get());
+
     // test reset(T*)
-    bar.reset(new double(44.0));
+    double* p = new double(44.0);
+    bar.reset(p);
     assert(bar);
     assert(bar.use_count()==1);
 
     // test get()
     double* barPtr = bar.get();
-    assert(barPtr);
+    assert(barPtr==p);
 
     // test constructor from a given pointer
     shared_ptr<double> b(new double(42.0));