diff --git a/libgda/gda-data-meta-wrapper.c b/libgda/gda-data-meta-wrapper.c
index aba4810..b4d32d5 100644
--- a/libgda/gda-data-meta-wrapper.c
+++ b/libgda/gda-data-meta-wrapper.c
@@ -634,4 +634,3 @@ gda_data_meta_wrapper_get_value_at (GdaDataModel *model, gint col, gint row, GEr
 	}
 	return NULL;
 }
-
diff --git a/libgda/gda-holder.c b/libgda/gda-holder.c
index e7e2f30..e484c7a 100644
--- a/libgda/gda-holder.c
+++ b/libgda/gda-holder.c
@@ -575,7 +575,7 @@ gda_holder_set_property (GObject *object,
 			gda_holder_set_attribute_static (holder, GDA_ATTRIBUTE_DESCRIPTION, value);
 			break;
 		case PROP_GDA_TYPE:
-			if (holder->priv->g_type == GDA_TYPE_NULL) {
+			if (holder->priv->g_type == G_TYPE_INVALID) {
 				holder->priv->g_type = g_value_get_gtype (value);
 				g_object_notify ((GObject*) holder, "g-type");
 			}
diff --git a/libgda/gda-value.c b/libgda/gda-value.c
index 3dfacd2..0c1cc75 100644
--- a/libgda/gda-value.c
+++ b/libgda/gda-value.c
@@ -251,6 +251,66 @@ set_from_string (GValue *value, const gchar *as_string)
 }
 
 /* 
+ * Register the GdaNull type in the GType system
+ */
+
+/* Transform a String GValue to a null*/
+static void
+string_to_null(const GValue *src, GValue *dest)
+{
+	g_return_if_fail (G_VALUE_HOLDS_STRING (src) &&
+			  GDA_VALUE_HOLDS_NULL (dest));
+
+	gda_value_set_null (dest);
+}
+
+static void
+null_to_string (const GValue *src, GValue *dest)
+{
+	gchar *str;
+
+	g_return_if_fail (G_VALUE_HOLDS_STRING (dest) &&
+			  GDA_VALUE_HOLDS_NULL (src) );
+
+	str = g_strdup("NULL");
+
+	g_value_take_string (dest, str);
+}
+
+GType
+gda_null_get_type (void)
+{
+	static GType type = 0;
+
+	if (G_UNLIKELY (type == 0)) {
+		static const GTypeInfo type_info = {
+    			0,			/* class_size */
+    			NULL,		/* base_init */
+    			NULL,		/* base_finalize */
+    			NULL,		/* class_init */
+    			NULL,		/* class_finalize */
+    			NULL,		/* class_data */
+    			0,			/* instance_size */
+    			0,			/* n_preallocs */
+    			NULL,		/* instance_init */
+    			NULL		/* value_table */
+  		};
+
+  		type = g_type_register_static (G_TYPE_INT, "GdaNull", &type_info, 0);
+
+		g_value_register_transform_func(G_TYPE_STRING,
+						type,
+						string_to_null);
+
+		g_value_register_transform_func(type,
+						G_TYPE_STRING,
+						null_to_string);
+	}
+
+	return type;
+}
+
+/*
  * Register the GdaBinary type in the GType system 
  */
 
@@ -1303,7 +1363,7 @@ gboolean
 gda_value_is_null (const GValue *value)
 {
 	g_return_val_if_fail (value, FALSE);
-	return !G_IS_VALUE (value);
+	return G_VALUE_TYPE (value) == GDA_TYPE_NULL;
 }
 
 /**
@@ -1517,6 +1577,7 @@ gda_value_set_null (GValue *value)
 	g_return_if_fail (value);
 
 	l_g_value_unset (value);
+	g_value_init (value, GDA_TYPE_NULL);
 }
 
 /**
diff --git a/libgda/gda-value.h b/libgda/gda-value.h
index 5b2cbc2..05eb30f 100644
--- a/libgda/gda-value.h
+++ b/libgda/gda-value.h
@@ -37,7 +37,7 @@ G_BEGIN_DECLS
 #define GDA_TIMEZONE_INVALID (2*12*60*60)
 
 /* Definition of the GType's values used in GValue*/
-#define GDA_TYPE_NULL 0
+#define GDA_TYPE_NULL (gda_null_get_type())
 #define	GDA_TYPE_BINARY (gda_binary_get_type())
 #define GDA_TYPE_BLOB (gda_blob_get_type())
 #define	GDA_TYPE_GEOMETRIC_POINT (gda_geometricpoint_get_type())
@@ -49,6 +49,7 @@ G_BEGIN_DECLS
 
 
 /* Definition of the GDA_VALUE_HOLDS macros */
+#define GDA_VALUE_HOLDS_NULL(value)            G_VALUE_HOLDS(value, GDA_TYPE_NULL)
 #define GDA_VALUE_HOLDS_BINARY(value)          G_VALUE_HOLDS(value, GDA_TYPE_BINARY)
 #define GDA_VALUE_HOLDS_BLOB(value)            G_VALUE_HOLDS(value, GDA_TYPE_BLOB)
 #define GDA_VALUE_HOLDS_GEOMETRIC_POINT(value) G_VALUE_HOLDS(value, GDA_TYPE_GEOMETRIC_POINT)
@@ -262,6 +263,8 @@ GType                             gda_geometricpoint_get_type (void) G_GNUC_CONS
 gpointer                          gda_geometricpoint_copy (gpointer boxed);
 void                              gda_geometricpoint_free (gpointer boxed);
 
+GType                             gda_null_get_type (void) G_GNUC_CONST;
+
 GType                             gda_binary_get_type (void) G_GNUC_CONST;
 gpointer                          gda_binary_copy (gpointer boxed);
 void                              gda_binary_free (gpointer boxed);
