diff --git a/dune/common/Makefile.am b/dune/common/Makefile.am
index 042647db493b426dcfbafdd15674a0c9c7b6fc54..ed5d9d73738ccf38508d0ea329456819867e751b 100644
--- a/dune/common/Makefile.am
+++ b/dune/common/Makefile.am
@@ -63,7 +63,6 @@ commoninclude_HEADERS = 			\
 	nullptr.hh				\
 	parametertree.hh                        \
 	path.hh					\
-	polyallocator.hh			\
 	poolallocator.hh			\
 	precision.hh				\
 	propertymap.hh				\
@@ -71,7 +70,6 @@ commoninclude_HEADERS = 			\
 	shared_ptr.hh				\
 	singleton.hh				\
 	sllist.hh				\
-	smallobject.hh				\
 	static_assert.hh			\
 	stdstreams.hh				\
 	timer.hh				\
diff --git a/dune/common/polyallocator.hh b/dune/common/polyallocator.hh
deleted file mode 100644
index 8d1ba9d2d6a594c5dc4071e053d83ef865625823..0000000000000000000000000000000000000000
--- a/dune/common/polyallocator.hh
+++ /dev/null
@@ -1,71 +0,0 @@
-// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
-// vi: set et ts=4 sw=2 sts=2:
-#ifndef DUNE_POLYALLOCATOR_HH
-#define DUNE_POLYALLOCATOR_HH
-
-#include <cstdlib>
-#include <memory>
-
-namespace Dune
-{
-
-  // PolyAllocator
-  // -------------
-
-  struct PolyAllocator
-  {
-    template< class T >
-    T *create ( const T &value )
-    {
-      return new T( value );
-    }
-
-    template< class T >
-    void destroy ( T *p )
-    {
-      delete p;
-    }
-  };
-
-
-
-  // STLPolyAllocator
-  // ----------------
-
-  /** This PolyAllocator tries to use an STL allocator to create polymorphic
-   *  objects (i.e., where the type on create differs from the type on destroy).
-   *
-   *  Note: It is totally unclear whether this works or is in any way conforming
-   *        to the standard. See FS#766 for details.
-   */
-  template< class A = std::allocator< void > >
-  struct STLPolyAllocator
-  {
-    explicit STLPolyAllocator ( const A &a = A() )
-      : allocator_( a )
-    {}
-
-    template< class T >
-    T *create ( const T &value )
-    {
-      typename A::template rebind< T >::other allocator( allocator_ );
-      T *p = allocator.allocate( 1 );
-      allocator.construct( p, value );
-      return p;
-    }
-
-    template< class T >
-    void destroy ( T *p )
-    {
-      typename A::template rebind< T >::other allocator( allocator_ );
-      allocator.destroy( p );
-      allocator.deallocate( p, 1 );
-    }
-
-  private:
-    typename A::template rebind< void * >::other allocator_;
-  };
-
-}
-
-#endif // #ifndef DUNE_POLYALLOCATOR_HH
diff --git a/dune/common/smallobject.hh b/dune/common/smallobject.hh
deleted file mode 100644
index da41e130494bfdcad9def3f5edd85c356b60d13d..0000000000000000000000000000000000000000
--- a/dune/common/smallobject.hh
+++ /dev/null
@@ -1,223 +0,0 @@
-// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
-// vi: set et ts=4 sw=2 sts=2:
-#ifndef DUNE_SMALLOBJECT_HH
-#define DUNE_SMALLOBJECT_HH
-
-#include <cassert>
-#include <new>
-
-namespace Dune
-{
-
-  // SmallObjectPool
-  // ---------------
-
-  class SmallObjectPool
-  {
-    union Block
-    {
-      Block *next;
-      unsigned int blocks;
-    };
-
-  public:
-    enum { blockSize = sizeof( Block ) };
-    enum { maxBlocks = (1 << 10) - 1 };
-    enum { maxSize = maxBlocks * blockSize };
-
-  private:
-    Block *list_[ maxBlocks ];
-
-    SmallObjectPool ()
-    {
-      for( unsigned int i = 0; i < maxBlocks; ++i )
-        list_[ i ] = 0;
-    }
-
-    ~SmallObjectPool ()
-    {
-      for( unsigned int i = 0; i < maxBlocks; ++i )
-      {
-        for( Block *next = list_[ i ]; next != 0; )
-        {
-          Block *current = next;
-          next = current->next;
-          delete[] current;
-        }
-      }
-    }
-
-    static SmallObjectPool &instance ()
-    {
-      static SmallObjectPool inst;
-      return inst;
-    }
-
-    static Block *&list ( unsigned int blocks )
-    {
-      assert( blocks < maxBlocks );
-      return instance().list_[ blocks ];
-    }
-
-  public:
-    static void *allocate ( unsigned int size )
-    {
-      const unsigned int blocks = (size + (blockSize-1)) / blockSize;
-      if( blocks >= maxBlocks )
-        return 0;
-      Block *&next = list( blocks );
-      Block *current = next;
-      if( current != 0 )
-        next = current->next;
-      else
-        current = new Block[ blocks+1 ];
-      current->blocks = blocks;
-      return current + 1;
-    }
-
-    static void free ( void *p )
-    {
-      if( p != 0 )
-      {
-        Block *current = reinterpret_cast< Block * >( p ) - 1;
-        const unsigned int blocks = current->blocks;
-        Block *&next = list( blocks );
-        current->next = next;
-        next = current;
-      }
-    }
-  };
-
-
-
-  // SmallObject
-  // -----------
-
-  struct SmallObject
-  {
-    void *operator new ( size_t size )
-    {
-      return SmallObjectPool::allocate( size );
-    }
-
-    void operator delete ( void *p )
-    {
-      SmallObjectPool::free( p );
-    }
-  };
-
-
-
-  // SmallObjectAllocator
-  // --------------------
-
-  template< class T >
-  struct SmallObjectAllocator;
-
-  template<>
-  struct SmallObjectAllocator< void >
-  {
-    typedef void value_type;
-
-    typedef void *pointer;
-    typedef const void *const_pointer;
-
-    template< class U > struct rebind { typedef SmallObjectAllocator< U > other; };
-  };
-
-  template< class T >
-  struct SmallObjectAllocator
-  {
-    typedef T value_type;
-    typedef size_t size_type;
-    typedef ptrdiff_t difference_type;
-
-    typedef T *pointer;
-    typedef const T *const_pointer;
-
-    typedef T &reference;
-    typedef const T &const_reference;
-
-    template< class U > struct rebind { typedef SmallObjectAllocator< U > other; };
-
-    SmallObjectAllocator () throw () {}
-    template< class U > SmallObjectAllocator ( const SmallObjectAllocator< U > & ) throw () {}
-    ~SmallObjectAllocator () throw () {}
-
-    pointer address ( reference r ) const { return &r; }
-    const_pointer address ( const_reference r ) const { return &r; }
-
-    pointer allocate ( size_type n, SmallObjectAllocator< void >::const_pointer hint = 0 );
-    void deallocate ( pointer p, size_type n );
-
-    void construct ( pointer p, const T &value ) { new( p ) T( value ); }
-    void destroy ( pointer p ) { p->~T(); }
-  };
-
-
-
-  // SmallObjectPolyAllocator
-  // ------------------------
-
-  struct SmallObjectPolyAllocator
-  {
-    template< class T > T *create ( const T &value );
-    template< class T > void destroy ( T *p );
-  };
-
-
-
-  // Implementation of SmallObjectAllocator
-  // --------------------------------------
-
-  template< class T >
-  inline typename SmallObjectAllocator< T >::pointer
-  SmallObjectAllocator< T >::allocate ( size_type n, SmallObjectAllocator< void >::const_pointer hint )
-  {
-    return static_cast< pointer >( SmallObjectPool::allocate( n * sizeof( T ) ) );
-  }
-
-
-  template< class T >
-  inline void
-  SmallObjectAllocator< T >::deallocate ( pointer p, size_type n )
-  {
-    SmallObjectPool::free( p );
-  }
-
-
-  template< class T >
-  bool operator== ( const SmallObjectAllocator< T > &, const SmallObjectAllocator< T > & ) throw()
-  {
-    return true;
-  }
-
-
-  template< class T >
-  bool operator!= ( const SmallObjectAllocator< T > &, const SmallObjectAllocator< T > & ) throw()
-  {
-    return false;
-  }
-
-
-
-  // Implementation of SmallObjectPolyAllocator
-  // ------------------------------------------
-
-  template< class T >
-  inline T *SmallObjectPolyAllocator::create ( const T &value )
-  {
-    void *address = SmallObjectPool::allocate( sizeof( T ) );
-    return new( address ) T( value );
-  }
-
-  template< class T >
-  inline void SmallObjectPolyAllocator::destroy ( T *p )
-  {
-    p->~T();
-    SmallObjectPool::free( p );
-  }
-
-}
-
-#endif // #ifndef DUNE_SMALLOBJECT_HH
diff --git a/dune/common/test/Makefile.am b/dune/common/test/Makefile.am
index 4c1f9a4767fde475c8d7583de5be038bfc0d6ea4..0878cd5bc7fd576842ab2db2a199acefb964802b 100644
--- a/dune/common/test/Makefile.am
+++ b/dune/common/test/Makefile.am
@@ -26,12 +26,10 @@ TESTPROGS = \
     nullptr-test \
     pathtest \
     paramtreetest \
-    polyallocator \
     poolallocatortest \
     shared_ptrtest_config \
     shared_ptrtest_dune \
     singletontest \
-    smallobject \
     static_assert_test \
     streamtest \
     test-stack \
@@ -82,8 +80,6 @@ pathtest_SOURCES = pathtest.cc
 
 paramtreetest_SOURCES = paramtreetest.cc
 
-smallobject_SOURCES = smallobject.cc
-
 bitsetvectortest_SOURCES = bitsetvectortest.cc
 
 nullptr_test_SOURCES = nullptr-test.cc nullptr-test2.cc
@@ -144,8 +140,6 @@ fmatrixtest_LDADD = $(LAPACK_LIBS) $(LDADD)
 
 fvectortest_SOURCES = fvectortest.cc
 
-polyallocator_SOURCES = polyallocator.cc
-
 poolallocatortest_SOURCES = poolallocatortest.cc
 
 enumsettest_SOURCES=enumsettest.cc
diff --git a/dune/common/test/polyallocator.cc b/dune/common/test/polyallocator.cc
deleted file mode 100644
index 836d6e7b502d188c31d83b63f3b1b1c954989c8c..0000000000000000000000000000000000000000
--- a/dune/common/test/polyallocator.cc
+++ /dev/null
@@ -1,147 +0,0 @@
-// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
-// vi: set et ts=4 sw=2 sts=2:
-#include <config.h>
-
-#include <iostream>
-#include <memory>
-
-#include <dune/common/poolallocator.hh>
-#include <dune/common/polyallocator.hh>
-
-// A test of the PolyAllocator as used in the GenericGeometries:
-// struct A   -> HybridMapping
-// struct B,C -> VirtualMapping, i.e., HybridMappingImpl
-// struct G   -> BasicGeometry
-
-struct A
-{
-  virtual ~A () {}
-  virtual void test ( ) = 0;
-};
-
-struct B
-  : public A
-{
-  B( int i ) : k( i ) {}
-
-  void test ( )
-  {
-    std::cout << "B( " << k << " ).test( )" << std::endl;
-  }
-
-private:
-  int k;
-};
-
-struct C
-  : public A
-{
-  void test ( )
-  {
-    std::cout << "C.test( )" << std::endl;
-  }
-};
-
-template <class Allocator>
-struct G
-{
-  explicit G( int k, const Allocator &alloc = Allocator() ) :
-    alloc_(alloc)
-  {
-    if( k>0 )
-      a_ = alloc_.create( B( k ) );
-    else
-      a_ = alloc_.create( C() );
-  }
-
-  ~G()
-  {
-    alloc_.destroy( a_ );
-  }
-
-  void test()
-  {
-    a_->test();
-  }
-
-private:
-  Allocator alloc_;
-  A *a_;
-};
-
-template< class Allocator >
-struct H
-{
-  explicit H ( int k, const Allocator &alloc = Allocator() )
-    : alloc_( alloc )
-  {
-    if( k > 0 )
-      create< B >( B( k ) );
-    else
-      create< C >( C() );
-  }
-
-  ~H()
-  {
-    destroy_( *this );
-  }
-
-  void test()
-  {
-    a_->test();
-  }
-
-private:
-  template< class Impl >
-  void create ( const Impl &impl )
-  {
-    typename Allocator::template rebind< Impl >::other alloc( alloc_ );
-    Impl *p = alloc.allocate( 1 );
-    alloc.construct( p, impl );
-    a_ = p;
-    destroy_ = destroy< Impl >;
-  }
-
-  template< class Impl >
-  static void destroy ( H &h )
-  {
-    typename Allocator::template rebind< Impl >::other alloc( h.alloc_ );
-    alloc.destroy( (Impl*)h.a_ );
-    alloc.deallocate( (Impl*)h.a_, 1 );
-  }
-
-  typedef void (*Destroy)( H &h );
-
-  Allocator alloc_;
-  A *a_;
-  Destroy destroy_;
-};
-
-int main ( int argc, char **argv )
-{
-  int k = 0;
-  if( argc > 1 )
-    k = atoi(argv[1]);
-
-  {
-    G<Dune::PolyAllocator> g(k);
-    g.test();
-  }
-
-  {
-    H< std::allocator< A > > h( k );
-    h.test();
-  }
-
-  if( argc > 2 )
-  {
-    const int numLoops = atoi( argv[ 2 ] );
-    for( int i = 0; i < numLoops; ++i )
-    {
-      G< Dune::STLPolyAllocator< Dune::PoolAllocator< A, 4096 > > > g( k );
-      g.test();
-    }
-  }
-
-  return 0;
-}
diff --git a/dune/common/test/smallobject.cc b/dune/common/test/smallobject.cc
deleted file mode 100644
index 69ae3dec9c63aeafe5eb2488adf0df358798b3b7..0000000000000000000000000000000000000000
--- a/dune/common/test/smallobject.cc
+++ /dev/null
@@ -1,97 +0,0 @@
-// -*- tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
-// vi: set et ts=4 sw=2 sts=2:
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <iostream>
-
-#include <dune/common/timer.hh>
-#include <dune/common/smallobject.hh>
-#include <dune/common/poolallocator.hh>
-
-using namespace Dune;
-
-class A
-{
-  int a_;
-
-public:
-  A( int a )
-    : a_( a )
-  {}
-};
-
-
-class B
-  : public SmallObject
-{
-  int b_;
-
-public:
-  B( int b )
-    : b_( b )
-  {}
-};
-
-
-int main ( int argc, char **argv )
-{
-  Timer timer;
-
-  const unsigned long iterations = 1 << 7;
-  const unsigned long factor = 16;
-  std :: cout << "Performing " << (factor*iterations) << " iterations." << std :: endl;
-
-  timer.reset();
-  for( unsigned long i = 0; i < iterations; ++i )
-  {
-    A *a = new A( (int)i );
-    delete a;
-  }
-  double timeA = factor*timer.elapsed();
-  std :: cout << "Time without SmallObject: " << timeA << std :: endl;
-
-  timer.reset();
-  for( unsigned long i = 0; i < factor*iterations; ++i )
-  {
-    B *b = new B( (int)i );
-    delete b;
-  }
-  double timeB = timer.elapsed();
-  std :: cout << "Time with SmallObject: " << timeB << std :: endl;
-  std :: cout << "Result: SmallObject is " << (timeA / timeB) << " times faster." << std :: endl;
-
-  timer.reset();
-  SmallObjectAllocator< A > alloc;
-  for( unsigned long i = 0; i < factor*iterations; ++i )
-  {
-    A *a = alloc.allocate( 1 );
-    alloc.construct( a, A( int( i ) ) );
-    alloc.destroy( a );
-    alloc.deallocate( a, 1 );
-  }
-  double timeC = timer.elapsed();
-  std :: cout << "Time with SmallObjectAllocator: " << timeC << std :: endl;
-  std :: cout << "Result: SmallObject is " << (timeA / timeC) << " times faster." << std :: endl;
-
-  timer.reset();
-  PoolAllocator< A, 100 > pool;
-  for( unsigned long i = 0; i < factor*iterations; ++i )
-  {
-    A *a = pool.allocate(1);
-    pool.construct( a, A( int( i ) ) );
-    pool.destroy( a );
-    pool.deallocate( a, 1 );
-  }
-  double timeD = timer.elapsed();
-  std :: cout << "Time with pool allocator: " << timeD << std :: endl;
-  std :: cout << "Result: pool allocator is " << (timeA / timeD) << " times faster." << std :: endl;
-  std :: cout << "Result: pool allocator is " << (timeB / timeD) << " times faster than SmallObject." << std :: endl;
-
-  // we require a speedup due to SmallObject
-  //assert((timeA / timeB) > 1.0);
-
-  // we require the speed of the poolallocator
-  // assert((timeB2 / timeB) > 1.0);
-}