Index: src/ResolvExpr/CommonType.cc
===================================================================
--- src/ResolvExpr/CommonType.cc	(revision 550a3385540fe0c2834b682893eb6e8280c52af1)
+++ src/ResolvExpr/CommonType.cc	(revision a2a77af4838992788fa316ffed81aaa3a38c4af8)
@@ -42,4 +42,5 @@
 		virtual void visit( OneType *oneType );
 
+		void getCommonWithVoidPointer( PointerType* voidPointer, PointerType* otherPointer );
 		template< typename RefType > void handleRefType( RefType *inst, Type *other );
 
@@ -145,12 +146,23 @@
 	}
 
+	void CommonType::getCommonWithVoidPointer( PointerType* voidPointer, PointerType* otherPointer ) {
+		if ( TypeInstType* var = dynamic_cast< TypeInstType* >( otherPointer->get_base() ) ) {
+			OpenVarSet::const_iterator entry = openVars.find( var->get_name() );
+			if ( entry != openVars.end() ) {
+				AssertionSet need, have;
+				WidenMode widen( widenFirst, widenSecond );
+				if ( entry != openVars.end() && ! bindVar(var, voidPointer->get_base(), entry->second, env, need, have, openVars, widen, indexer ) ) return;
+			}
+		}
+		result = voidPointer->clone();
+		result->get_qualifiers() += otherPointer->get_qualifiers();
+	}
+	
 	void CommonType::visit( PointerType *pointerType ) {
 		if ( PointerType *otherPointer = dynamic_cast< PointerType* >( type2 ) ) {
 			if ( widenFirst && dynamic_cast< VoidType* >( otherPointer->get_base() ) && ! isFtype(pointerType->get_base(), indexer) ) {
-				result = otherPointer->clone();
-				result->get_qualifiers() += pointerType->get_qualifiers();
+				getCommonWithVoidPointer( otherPointer, pointerType );
 			} else if ( widenSecond && dynamic_cast< VoidType* >( pointerType->get_base() ) && ! isFtype(otherPointer->get_base(), indexer) ) {
-				result = pointerType->clone();
-				result->get_qualifiers() += otherPointer->get_qualifiers();
+				getCommonWithVoidPointer( pointerType, otherPointer );
 			} else if ( ( pointerType->get_base()->get_qualifiers() >= otherPointer->get_base()->get_qualifiers() || widenFirst )
 					   && ( pointerType->get_base()->get_qualifiers() <= otherPointer->get_base()->get_qualifiers() || widenSecond ) ) {
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision 550a3385540fe0c2834b682893eb6e8280c52af1)
+++ src/ResolvExpr/Unify.cc	(revision a2a77af4838992788fa316ffed81aaa3a38c4af8)
@@ -31,14 +31,4 @@
 
 namespace ResolvExpr {
-	struct WidenMode {
-		WidenMode( bool widenFirst, bool widenSecond ): widenFirst( widenFirst ), widenSecond( widenSecond ) {}
-		WidenMode &operator|=( const WidenMode &other ) { widenFirst |= other.widenFirst; widenSecond |= other.widenSecond; return *this; }
-		WidenMode &operator&=( const WidenMode &other ) { widenFirst &= other.widenFirst; widenSecond &= other.widenSecond; return *this; }
-		WidenMode operator|( const WidenMode &other ) { WidenMode newWM( *this ); newWM |= other; return newWM; }
-		WidenMode operator&( const WidenMode &other ) { WidenMode newWM( *this ); newWM &= other; return newWM; }
-		operator bool() { return widenFirst && widenSecond; }
-
-		bool widenFirst : 1, widenSecond : 1;
-	};
 
 	class Unify : public Visitor {
Index: src/ResolvExpr/Unify.h
===================================================================
--- src/ResolvExpr/Unify.h	(revision 550a3385540fe0c2834b682893eb6e8280c52af1)
+++ src/ResolvExpr/Unify.h	(revision a2a77af4838992788fa316ffed81aaa3a38c4af8)
@@ -27,4 +27,16 @@
 
 namespace ResolvExpr {
+	struct WidenMode {
+		WidenMode( bool widenFirst, bool widenSecond ): widenFirst( widenFirst ), widenSecond( widenSecond ) {}
+		WidenMode &operator|=( const WidenMode &other ) { widenFirst |= other.widenFirst; widenSecond |= other.widenSecond; return *this; }
+		WidenMode &operator&=( const WidenMode &other ) { widenFirst &= other.widenFirst; widenSecond &= other.widenSecond; return *this; }
+		WidenMode operator|( const WidenMode &other ) { WidenMode newWM( *this ); newWM |= other; return newWM; }
+		WidenMode operator&( const WidenMode &other ) { WidenMode newWM( *this ); newWM &= other; return newWM; }
+		operator bool() { return widenFirst && widenSecond; }
+
+		bool widenFirst : 1, widenSecond : 1;
+	};
+	
+	bool bindVar( TypeInstType *typeInst, Type *other, TypeDecl::Kind kind, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, const OpenVarSet &openVars, WidenMode widenMode, const SymTab::Indexer &indexer );
 	bool unify( Type *type1, Type *type2, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, OpenVarSet &openVars, const SymTab::Indexer &indexer );
 	bool unify( Type *type1, Type *type2, TypeEnvironment &env, AssertionSet &needAssertions, AssertionSet &haveAssertions, OpenVarSet &openVars, const SymTab::Indexer &indexer, Type *&commonType );
Index: src/libcfa/prelude.cf
===================================================================
--- src/libcfa/prelude.cf	(revision 550a3385540fe0c2834b682893eb6e8280c52af1)
+++ src/libcfa/prelude.cf	(revision a2a77af4838992788fa316ffed81aaa3a38c4af8)
@@ -273,8 +273,8 @@
 forall( ftype FT ) signed int ?!=?( FT *, FT * );
 
-forall( dtype DT ) signed int ?==?( const volatile DT   *, const volatile void * );
-forall( dtype DT ) signed int ?==?( const volatile void *, const volatile DT * );
-forall( dtype DT ) signed int ?!=?( const volatile DT   *, const volatile void * );
-forall( dtype DT ) signed int ?!=?( const volatile void *, const volatile DT * );
+// forall( dtype DT ) signed int ?==?( const volatile DT   *, const volatile void * );
+// forall( dtype DT ) signed int ?==?( const volatile void *, const volatile DT * );
+// forall( dtype DT ) signed int ?!=?( const volatile DT   *, const volatile void * );
+// forall( dtype DT ) signed int ?!=?( const volatile void *, const volatile DT * );
 
 // forall( dtype DT ) signed int ?==?( const volatile DT *, forall( dtype DT2 )const DT2 * );
