[anjuta] libanjuta, am-project, dir-project, mk-project, project-manager: Change AnjutaProjectProperty



commit 3226c3e2b04d115f91e97e57377744562d44e84f
Author: SÃbastien Granjoux <seb sfo free fr>
Date:   Sat Dec 17 14:10:04 2011 +0100

    libanjuta, am-project, dir-project, mk-project, project-manager: Change AnjutaProjectProperty
    
    Split project properties and project properties informations

 libanjuta/anjuta-project.c              |  417 ++++++++++++++---------
 libanjuta/anjuta-project.h              |   57 ++--
 libanjuta/interfaces/libanjuta.idl      |   10 +-
 plugins/am-project/ac-writer.c          |   18 +-
 plugins/am-project/am-project-private.h |    9 +-
 plugins/am-project/am-project.c         |   50 ++--
 plugins/am-project/am-project.h         |    1 +
 plugins/am-project/am-properties.c      |  564 +++++++++++++++++--------------
 plugins/am-project/am-properties.h      |   13 +-
 plugins/am-project/am-writer.c          |  313 +++++++++---------
 plugins/am-project/amp-group.c          |    4 +-
 plugins/am-project/amp-module.c         |   70 ++--
 plugins/am-project/amp-object.c         |    2 +-
 plugins/am-project/amp-package.c        |   20 +-
 plugins/am-project/amp-root.c           |    2 +-
 plugins/am-project/amp-source.c         |    4 +-
 plugins/am-project/amp-target.c         |   12 +-
 plugins/am-project/projectparser.c      |   64 ++--
 plugins/am-project/tests/anjuta.lst     |    2 +-
 plugins/am-project/tests/nemiver.lst    |    1 +
 plugins/dir-project/dir-node.c          |   22 +-
 plugins/dir-project/dir-project.c       |   96 +++---
 plugins/mk-project/mk-project.c         |   16 +-
 plugins/mk-project/mk-rule.c            |   42 ++--
 plugins/project-manager/dialogs.c       |   58 ++--
 25 files changed, 1017 insertions(+), 850 deletions(-)
---
diff --git a/libanjuta/anjuta-project.c b/libanjuta/anjuta-project.c
index 0b092a1..1a660c2 100644
--- a/libanjuta/anjuta-project.c
+++ b/libanjuta/anjuta-project.c
@@ -2,24 +2,24 @@
 /*
  * anjuta-project.c
  * Copyright (C) SÃbastien Granjoux 2009 <seb sfo free fr>
- * 
+ *
  * This program is free software: you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
  * Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  * See the GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License along
  * with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "anjuta-project.h"
 
-#include "anjuta-debug.h" 
+#include "anjuta-debug.h"
 #include "anjuta-marshal.h"
 #include "anjuta-enum-types.h"
 
@@ -29,21 +29,21 @@
  * SECTION:anjuta-project
  * @title: Anjuta project
  * @short_description: Anjuta project
- * @see_also: 
+ * @see_also:
  * @stability: Unstable
  * @include: libanjuta/anjuta-project.h
- * 
+ *
  * A project in Anjuta is represented by a tree. There are six kinds of node.
  *
  * The root node is the parent of all other nodes, it can implement
  * IAnjutaProject interface and represent the project itself but it is not
  * mandatory.
- * 
+ *
  * A module node represents a module in autotools project, it is a group of
  * packages.
- * 
+ *
  * A package node represents a package in autotools project, it is library.
- * 
+ *
  * A group node is used to group several target or source, it can represent
  * a directory by example.
  *
@@ -56,7 +56,7 @@
  *
  * All these nodes are base objects. They have derived in each project backend
  * to provide more specific information.
- */ 
+ */
 
 /* Node properties
  *---------------------------------------------------------------------------*/
@@ -66,44 +66,38 @@
 
 /**
  * anjuta_project_property_new:
- * @id: (transfer none):
- * @name: (transfer none):
- * @value: (transfer none):
- * @native: (allow-none) (transfer none):
+ * @value: (transfer none): Value
+ * @name: (allow-none) (transfer none): Optional name used by map properties
+ * @user_data: (allow-none) (transfer full): Optional user data
  *
  * Returns: (transfer full):
  */
 AnjutaProjectProperty *
-anjuta_project_property_new (const gchar* id, const gchar *name, AnjutaProjectValueType type,
-                             const gchar *value, AnjutaProjectProperty *native)
+anjuta_project_property_new (const gchar *value,
+                             const gchar *name,
+                             gpointer user_data)
 {
 	AnjutaProjectProperty *prop = g_slice_new0(AnjutaProjectProperty);
-	prop->id = g_strdup (id);
-	prop->name = g_strdup (name);
-	prop->type = type;
+
 	prop->value = g_strdup (value);
+	prop->name = name != NULL ? g_strdup (name) : NULL;
+	prop->user_data = user_data;
+	prop->info = NULL;
 
-	if (native != NULL) {
-		prop->native = native;
-		prop->flags = native->flags;
-		prop->detail = native->detail;
-	}
-	
 	return prop;
 }
 
 AnjutaProjectProperty *
 anjuta_project_property_copy (AnjutaProjectProperty *prop)
 {
-	return anjuta_project_property_new (prop->id, prop->name, prop->type,
-	                                    prop->value, prop->native);
+	return anjuta_project_property_new (prop->value, prop->name, prop->user_data);
 }
 
 void
 anjuta_project_property_free (AnjutaProjectProperty *prop)
 {
-	g_free (prop->name);
 	g_free (prop->value);
+	g_free (prop->name);
 	g_slice_free (AnjutaProjectProperty, prop);
 }
 
@@ -120,7 +114,76 @@ anjuta_project_property_get_type (void)
 	return type_id;
 }
 
+/* Node properties information
+ *---------------------------------------------------------------------------*/
 
+/* Implement Boxed type
+ *---------------------------------------------------------------------------*/
+
+/**
+ * anjuta_project_property_info_new:
+ * @id: (transfer none): Property identifier
+ * @name: (transfer none): Translatable property name
+ * @type: Property value type
+ * @flags: Property flags
+ * @description: (transfer none): Property description
+ * @property: (transfer full): Default property value
+ * @user_data: (allow-none) (transfer full): Optional user data
+ *
+ * Returns: (transfer full):
+ */
+AnjutaProjectPropertyInfo *
+anjuta_project_property_info_new (const gchar *id,
+                                  const gchar *name,
+                                  AnjutaProjectValueType type,
+                                  AnjutaProjectPropertyFlags flags,
+                                  const gchar *description,
+                                  AnjutaProjectProperty *property,
+                                  gpointer user_data)
+{
+	AnjutaProjectPropertyInfo *info = g_slice_new0(AnjutaProjectPropertyInfo);
+
+	info->id = g_strdup (id);
+	info->name = g_strdup (name);
+	info->type = type;
+	info->flags = flags;
+	info->description = g_strdup (description);
+	info->property = property;
+	info->user_data = user_data;
+
+	return info;
+}
+
+AnjutaProjectPropertyInfo *
+anjuta_project_property_info_copy (AnjutaProjectPropertyInfo *info)
+{
+	return anjuta_project_property_info_new (info->id, info->name, info->type,
+	                                         info->flags, info->description,
+	                                         info->property, info->user_data);
+}
+
+void
+anjuta_project_property_info_free (AnjutaProjectPropertyInfo *info)
+{
+	g_free (info->id);
+	g_free (info->name);
+	g_free (info->description);
+	anjuta_project_property_free (info->property);
+	g_slice_free (AnjutaProjectPropertyInfo, info);
+}
+
+GType
+anjuta_project_property_info_get_type (void)
+{
+	static GType type_id = 0;
+
+	if (!type_id)
+		type_id = g_boxed_type_register_static ("AnjutaProjectPropertyInfo",
+		                                        (GBoxedCopyFunc) anjuta_project_property_info_copy,
+		                                        (GBoxedFreeFunc) anjuta_project_property_info_free);
+
+	return type_id;
+}
 
 /* Node
  *---------------------------------------------------------------------------*/
@@ -138,7 +201,7 @@ AnjutaProjectNode *
 anjuta_project_node_parent(AnjutaProjectNode *node)
 {
 	g_return_val_if_fail (node != NULL, NULL);
-	
+
 	return node->parent;
 }
 
@@ -170,7 +233,7 @@ AnjutaProjectNode *
 anjuta_project_node_first_child(AnjutaProjectNode *node)
 {
 	g_return_val_if_fail (node != NULL, NULL);
-	
+
 	return node->children;
 }
 
@@ -202,7 +265,7 @@ AnjutaProjectNode *
 anjuta_project_node_next_sibling (AnjutaProjectNode *node)
 {
 	g_return_val_if_fail (node != NULL, NULL);
-	
+
 	return node->next;
 }
 
@@ -215,7 +278,7 @@ AnjutaProjectNode *
 anjuta_project_node_prev_sibling (AnjutaProjectNode *node)
 {
 	g_return_val_if_fail (node != NULL, NULL);
-	
+
 	return node->prev;
 }
 
@@ -240,7 +303,7 @@ static AnjutaProjectNode *
 anjuta_project_node_post_order_traverse (AnjutaProjectNode *node, AnjutaProjectNodeTraverseFunc func, gpointer data)
 {
 	AnjutaProjectNode *child;
-	
+
 	child = node->children;
 	while (child != NULL)
 	{
@@ -254,7 +317,7 @@ anjuta_project_node_post_order_traverse (AnjutaProjectNode *node, AnjutaProjectN
 			return current;
 		}
 	}
-	
+
 	return func (node, data) ? node : NULL;
 }
 
@@ -267,7 +330,7 @@ anjuta_project_node_pre_order_traverse (AnjutaProjectNode *node, AnjutaProjectNo
 	{
 		return node;
 	}
-	
+
 	child = node->children;
 	while (child != NULL)
 	{
@@ -320,7 +383,7 @@ AnjutaProjectNode *
 anjuta_project_node_children_traverse (AnjutaProjectNode *node, AnjutaProjectNodeTraverseFunc func, gpointer data)
 {
 	AnjutaProjectNode *child;
-	
+
 	g_return_val_if_fail (node != NULL, NULL);
 
 	child = node->children;
@@ -343,7 +406,7 @@ static void
 anjuta_project_node_post_order_foreach (AnjutaProjectNode *node, AnjutaProjectNodeForeachFunc func, gpointer data)
 {
 	AnjutaProjectNode *child;
-	
+
 	child = node->children;
 	while (child != NULL)
 	{
@@ -353,7 +416,7 @@ anjuta_project_node_post_order_foreach (AnjutaProjectNode *node, AnjutaProjectNo
 		child = current->next;
 		anjuta_project_node_post_order_foreach (current, func, data);
 	}
-	
+
 	func (node, data);
 }
 
@@ -363,7 +426,7 @@ anjuta_project_node_pre_order_foreach (AnjutaProjectNode *node, AnjutaProjectNod
 	AnjutaProjectNode *child;
 
 	func (node, data);
-	
+
 	child = node->children;
 	while (child != NULL)
 	{
@@ -407,7 +470,7 @@ void
 anjuta_project_node_children_foreach (AnjutaProjectNode *node, AnjutaProjectNodeForeachFunc func, gpointer data)
 {
 	AnjutaProjectNode *child;
-	
+
 	g_return_if_fail (node != NULL);
 
 	child = node->children;
@@ -472,7 +535,7 @@ void
 anjuta_project_node_check (AnjutaProjectNode *parent)
 {
 	AnjutaProjectNode *node;
-	
+
 	g_message ("Check node %p", parent);
 	node = anjuta_project_node_traverse (parent, G_POST_ORDER, check_node, parent);
 	if (node == NULL) g_message ("    Node %p is valid", parent);
@@ -489,10 +552,10 @@ static void
 anjuta_project_node_dump_child (AnjutaProjectNode *parent, gint indent)
 {
 	AnjutaProjectNode *child;
-	
+
 	anjuta_project_node_show (parent, indent);
 	indent += 4;
-	
+
 	for (child = anjuta_project_node_first_child (parent); child != NULL; child = anjuta_project_node_next_sibling (child))
 	{
 		anjuta_project_node_dump_child (child, indent);
@@ -530,7 +593,7 @@ anjuta_project_node_insert_before (AnjutaProjectNode *parent, AnjutaProjectNode
 		g_return_val_if_fail (sibling->parent == parent, node);*/
 
 	g_object_ref_sink (node);
-	
+
 	node->parent = parent;
 	if (sibling)
 	{
@@ -564,7 +627,7 @@ anjuta_project_node_insert_before (AnjutaProjectNode *parent, AnjutaProjectNode
 		}
 	}
 
-	return node;	
+	return node;
 }
 
 /**
@@ -587,7 +650,7 @@ anjuta_project_node_insert_after (AnjutaProjectNode *parent, AnjutaProjectNode *
 		g_return_val_if_fail (sibling->parent == parent, node);*/
 
 	g_object_ref_sink (node);
-	
+
 	node->parent = parent;
 	if (sibling)
     {
@@ -609,7 +672,7 @@ anjuta_project_node_insert_after (AnjutaProjectNode *parent, AnjutaProjectNode *
 		parent->children = node;
 	}
 
-	return node;	
+	return node;
 }
 
 /**
@@ -622,7 +685,7 @@ AnjutaProjectNode *
 anjuta_project_node_remove (AnjutaProjectNode *node)
 {
 	g_return_val_if_fail (node != NULL, NULL);
-	
+
 	if (node->prev)
 		node->prev->next = node->next;
 	else if (node->parent)
@@ -634,7 +697,7 @@ anjuta_project_node_remove (AnjutaProjectNode *node)
 		node->next = NULL;
 	}
 	node->prev = NULL;
-	
+
 	return node;
 }
 
@@ -646,7 +709,7 @@ anjuta_project_node_remove (AnjutaProjectNode *node)
 AnjutaProjectNode *
 anjuta_project_node_prepend (AnjutaProjectNode *parent, AnjutaProjectNode *node)
 {
-	return anjuta_project_node_insert_before (parent, parent->children, node);	
+	return anjuta_project_node_insert_before (parent, parent->children, node);
 }
 
 /**
@@ -656,7 +719,7 @@ anjuta_project_node_prepend (AnjutaProjectNode *parent, AnjutaProjectNode *node)
  */
 AnjutaProjectNode *
 anjuta_project_node_append (AnjutaProjectNode *parent, AnjutaProjectNode *node)
-{ 
+{
 	return anjuta_project_node_insert_before (parent, NULL, node);
 }
 
@@ -703,7 +766,7 @@ anjuta_project_node_get_file (const AnjutaProjectNode *node)
 {
 	switch (node->type & ANJUTA_PROJECT_TYPE_MASK)
 	{
-	case ANJUTA_PROJECT_OBJECT:	
+	case ANJUTA_PROJECT_OBJECT:
 	case ANJUTA_PROJECT_TARGET:
 		if ((node->name) && (node->parent != NULL) && (node->parent->file != NULL))
 		{
@@ -725,99 +788,136 @@ anjuta_project_node_get_file (const AnjutaProjectNode *node)
 	default:
 		break;
 	}
-			
-	return node->file;		
+
+	return node->file;
 }
 
 /**
- * anjuta_project_node_get_custom_properties:
+ * anjuta_project_node_get_properties_info:
  *
  * Returns: (transfer none) (element-type Anjuta.ProjectProperty):
  */
 GList *
-anjuta_project_node_get_custom_properties (AnjutaProjectNode *node)
+anjuta_project_node_get_properties_info (AnjutaProjectNode *node)
 {
-	return node->custom_properties;
+	return node->properties_info;
 }
 
 /**
- * anjuta_project_node_get_native_properties:
+ * anjuta_project_node_get_properties:
  *
- * Returns: (transfer none) (element-type Anjuta.ProjectProperty):
+ * Returns: (transfer none) (element-type Anjuta.ProjectPropertyInfo):
  */
 GList *
-anjuta_project_node_get_native_properties (AnjutaProjectNode *node)
+anjuta_project_node_get_properties (AnjutaProjectNode *node)
 {
-	return node->native_properties;
+	return node->properties;
 }
 
 static gint
-find_property (gconstpointer item, gconstpointer data)
+find_property_info (gconstpointer item, gconstpointer data)
+{
+	AnjutaProjectPropertyInfo *info = (AnjutaProjectPropertyInfo *)item;
+	const gchar *id = (const gchar *)data;
+
+	return strcmp (info->id, id);
+}
+
+/**
+ * anjuta_project_node_get_property_info:
+ * @node: (transfer none):
+ * @id: (transfer none): Property identifier
+ *
+ * Returns: (transfer none):
+ */
+AnjutaProjectPropertyInfo *
+anjuta_project_node_get_property_info (AnjutaProjectNode *node,
+                                       const gchar *id)
 {
-	AnjutaProjectProperty *prop_a = (AnjutaProjectProperty *)item;
-	AnjutaProjectProperty *prop_b = (AnjutaProjectProperty *)data;
+	GList *found;
+
+	/* Find property info */
+	found = g_list_find_custom (node->properties_info, id, find_property_info);
+
+	return found != NULL ? (AnjutaProjectPropertyInfo *)found->data : NULL;
+}
 
-	if (prop_a->native != NULL) prop_a = prop_a->native;
-	if (prop_b->native != NULL) prop_b = prop_b->native;
+static gint
+find_property (gconstpointer item, gconstpointer data)
+{
+	AnjutaProjectProperty *prop = (AnjutaProjectProperty *)item;
+	AnjutaProjectPropertyInfo *info = (AnjutaProjectPropertyInfo *)data;
 
-	return prop_a != prop_b;
+	return prop->info != info;
 }
 
 /**
  * anjuta_project_node_get_property:
+ * @node: (transfer none):
+ * @id: (transfer none): Property identifier
  *
  * Returns: (transfer none):
  */
 AnjutaProjectProperty *
-anjuta_project_node_get_property (AnjutaProjectNode *node, AnjutaProjectProperty *property)
+anjuta_project_node_get_property (AnjutaProjectNode *node, const gchar *id)
 {
-	GList *found;
+	AnjutaProjectPropertyInfo *info;
+	AnjutaProjectProperty *prop = NULL;
 
-	/* Search in custom properties */
-	found = g_list_find_custom (node->custom_properties, property, find_property);
-
-	if (found == NULL)
+	/* Find property info */
+	info = anjuta_project_node_get_property_info (node, id);
+	if (info != NULL)
 	{
-		/* Search in native properties */
-		found = g_list_find_custom (node->native_properties, property, find_property);
+		GList *found;
+
+		/* Get default property */
+		prop = info->property;
+
+		/* Find custom property */
+		found = g_list_find_custom (node->properties, info, find_property);
+		if (found != NULL)
+		{
+			prop = (AnjutaProjectProperty *)found->data;
+		}
 	}
 
-	return found != NULL ? (AnjutaProjectProperty *)found->data : NULL;
+	return prop;
 }
 
 /* If name is specified, look for a property with the same name, useful for
  * map properties */
 AnjutaProjectProperty *
-anjuta_project_node_get_map_property (AnjutaProjectNode *node, AnjutaProjectProperty *property, const gchar *name)
+anjuta_project_node_get_map_property (AnjutaProjectNode *node, const gchar *id, const gchar *name)
 {
-	GList *found = NULL;
+	AnjutaProjectPropertyInfo *info;
+	AnjutaProjectProperty *prop = NULL;
 
-	/* Check if the property is already the right one */
-	if (property->native != NULL)
+	/* Find property info */
+	info = anjuta_project_node_get_property_info (node, id);
+	if (info != NULL)
 	{
-		found = g_list_find (node->custom_properties, property);
-	}
-	
-	/* Search in custom properties */
-	if (found == NULL)
-	{
-		found = g_list_find_custom (node->custom_properties, property, find_property);
-		if (name != NULL)
+		GList *found;
+
+		/* Get default property */
+		prop = info->property;
+
+		/* Find property */
+		found = node->properties;
+		do
 		{
-			while ((found != NULL) && (strcmp (name, ((AnjutaProjectProperty *)found->data)->name) != 0))
+			found = g_list_find_custom (found, info, find_property);
+			if (found != NULL)
 			{
-				found = g_list_find_custom (g_list_next (found), property, find_property);
+				prop = (AnjutaProjectProperty *)found->data;
+				if ((info->type != ANJUTA_PROJECT_PROPERTY_MAP) || (g_strcmp0 (prop->name, name) == 0)) break;
+				prop = NULL;
+				found = g_list_next (found);
 			}
 		}
+		while (found != NULL);
 	}
 
-	if (found == NULL)
-	{
-		/* Search in native properties */
-		found = g_list_find_custom (node->native_properties, property, find_property);
-	}
-
-	return found != NULL ? (AnjutaProjectProperty *)found->data : NULL;
+	return prop;
 }
 
 /* Set functions
@@ -839,60 +939,47 @@ anjuta_project_node_clear_state (AnjutaProjectNode *node, AnjutaProjectNodeState
 	return TRUE;
 }
 
+AnjutaProjectPropertyInfo *
+anjuta_project_node_insert_property_info (AnjutaProjectNode *node,
+                                          AnjutaProjectPropertyInfo *info)
+{
+	node->properties_info = g_list_append (node->properties_info, info);
+
+	return info;
+}
+
 /**
  * anjuta_project_node_insert_property:
+ * @node: (transfer none):
+ * @info: (transfer none):
  * @property: (transfer full):
  *
  * Returns: (transfer none):
  */
 
 AnjutaProjectProperty *
-anjuta_project_node_insert_property (AnjutaProjectNode *node, AnjutaProjectProperty *native, AnjutaProjectProperty *property)
+anjuta_project_node_insert_property (AnjutaProjectNode *node, AnjutaProjectPropertyInfo *info, AnjutaProjectProperty *property)
 {
 	/* Make sure the property is native */
-	if (native->native != NULL) native = native->native;
-	
-	/* Fill missing information */
-	if (property->name == NULL) property->name = native->name;
-	property->type = native->type;
-	property->native = native;
-	property->flags = native->flags;
-	property->detail = native->detail;
-
-	/* Get properties list */
-	node->custom_properties = g_list_append (node->custom_properties, property);
-	
+	property->info = info;
+
+	/* Add in properties list */
+	node->properties = g_list_append (node->properties, property);
+
 	return property;
 }
 
 AnjutaProjectProperty *
 anjuta_project_node_remove_property (AnjutaProjectNode *node, AnjutaProjectProperty *prop)
 {
-	GList *found;
-	AnjutaProjectProperty *removed = NULL;
-
 	/* Search the exact property, useful for list property */
-	found = g_list_find (node->custom_properties, prop);
-	if (found == NULL)
-	{
-		found = g_list_find_custom (node->custom_properties, prop, find_property);
-	}
-
-	if (found != NULL)
+	if (prop != prop->info->property)
 	{
-		removed = (AnjutaProjectProperty *)found->data;
-		node->custom_properties = g_list_delete_link (node->custom_properties, found);
-		/* If name is not owned by the property, remove it as the
-		 * property can be associated with another one, having a
-		 * different name */
-		if ((removed->native != NULL) && (removed->name == removed->native->name))
-		{
-			removed->name = NULL;
-		}
+		node->properties = g_list_remove (node->properties, prop);
+		prop->info = NULL;
 	}
 
-
-	return removed;
+	return prop;
 }
 
 
@@ -1004,8 +1091,8 @@ enum {
 	PROP_FILE,
 	PROP_STATE,
 	PROP_TYPE,
-	PROP_NATIVE_PROPERTIES,
-	PROP_CUSTOM_PROPERTIES
+	PROP_PROPERTIES,
+	PROP_PROPERTIES_INFO
 };
 
 
@@ -1020,11 +1107,11 @@ anjuta_project_node_init (AnjutaProjectNode *node)
 	node->prev = NULL;
 	node->parent = NULL;
 	node->children = NULL;
-	
+
 	node->type = 0;
 	node->state = 0;
-	node->native_properties = NULL;
-	node->custom_properties = NULL;
+	node->properties = NULL;
+	node->properties_info = NULL;
 	node->file = NULL;
 	node->name = NULL;
 }
@@ -1035,18 +1122,18 @@ anjuta_project_node_dispose (GObject *object)
 	AnjutaProjectNode *node = ANJUTA_PROJECT_NODE(object);
 
 	anjuta_project_node_remove (node);
-	
+
 	if (node->file != NULL) g_object_unref (node->file);
 	node->file = NULL;
 
 	while (node->children != NULL)
 	{
 		AnjutaProjectNode *child;
-		
+
 		child = anjuta_project_node_remove (node->children);
 		g_object_unref (child);
 	}
-	
+
 	G_OBJECT_CLASS (anjuta_project_node_parent_class)->dispose (object);
 }
 
@@ -1056,11 +1143,11 @@ anjuta_project_node_finalize (GObject *object)
 	AnjutaProjectNode *node = ANJUTA_PROJECT_NODE(object);
 
 	if (node->name != NULL) g_free (node->name);
-	
+
 	G_OBJECT_CLASS (anjuta_project_node_parent_class)->finalize (object);
 }
 
-static void 
+static void
 anjuta_project_node_get_gobject_property (GObject    *object,
                                           guint       prop_id,
                                           GValue     *value,
@@ -1080,18 +1167,18 @@ anjuta_project_node_get_gobject_property (GObject    *object,
 		case PROP_TYPE:
 			g_value_set_flags (value, anjuta_project_node_get_node_type (node));
 			break;
-		case PROP_NATIVE_PROPERTIES:
-			g_value_set_pointer (value, node->native_properties);
+		case PROP_PROPERTIES:
+			g_value_set_pointer (value, node->properties);
 			break;
-		case PROP_CUSTOM_PROPERTIES:
-			g_value_set_pointer (value, node->custom_properties);
+		case PROP_PROPERTIES_INFO:
+			g_value_set_pointer (value, node->properties_info);
 			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
 	}
 }
 
-static void 
+static void
 anjuta_project_node_set_gobject_property (GObject      *object,
                                           guint         prop_id,
                                           const GValue *value,
@@ -1115,12 +1202,12 @@ anjuta_project_node_set_gobject_property (GObject      *object,
 		case PROP_TYPE:
 			node->type = g_value_get_flags (value);
 			break;
-		case PROP_NATIVE_PROPERTIES:
-			node->native_properties = g_value_get_pointer (value);
+		case PROP_PROPERTIES:
+			node->properties = g_value_get_pointer (value);
 			break;
 		/* XXX: We may need to copy this instead */
-		case PROP_CUSTOM_PROPERTIES:
-			node->custom_properties = g_value_get_pointer (value);
+		case PROP_PROPERTIES_INFO:
+			node->properties_info = g_value_get_pointer (value);
 			break;
 		default:
 			G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -1132,7 +1219,7 @@ anjuta_project_node_class_init (AnjutaProjectNodeClass *klass)
 {
 	GObjectClass* object_class = G_OBJECT_CLASS (klass);
 	GParamSpec* pspec;
-	
+
 	object_class->finalize = anjuta_project_node_finalize;
 	object_class->dispose = anjuta_project_node_dispose;
 	object_class->get_property = anjuta_project_node_get_gobject_property;
@@ -1150,7 +1237,7 @@ anjuta_project_node_class_init (AnjutaProjectNodeClass *klass)
 	 The plugin should probably get the GFile from the
 	 AnjutaProjectNode object and then use a function
 	 in project-view.c to create the corresponding shortcut*/
-	
+
 	anjuta_project_node_signals[UPDATED] = g_signal_new ("updated",
 	    G_OBJECT_CLASS_TYPE (object_class),
 	    G_SIGNAL_RUN_LAST,
@@ -1161,7 +1248,7 @@ anjuta_project_node_class_init (AnjutaProjectNodeClass *klass)
 	    2,
 	    G_TYPE_POINTER,
 	    G_TYPE_ERROR);
-	
+
 	anjuta_project_node_signals[LOADED] = g_signal_new ("loaded",
 		G_OBJECT_CLASS_TYPE (object_class),
 		G_SIGNAL_RUN_LAST,
@@ -1208,28 +1295,28 @@ anjuta_project_node_class_init (AnjutaProjectNodeClass *klass)
 	                                 pspec);
 
 /**
- * AnjutaProjectNode:native-properties:
+ * AnjutaProjectNode:properties:
  *
  * type: GLib.List<Anjuta.ProjectProperty>
  * Transfer: none
  */
-	pspec = g_param_spec_pointer ("native-properties",
-	                              "Native properties",
-	                              "The list of all possible properties",
+	pspec = g_param_spec_pointer ("properties",
+	                              "Properties",
+	                              "The list of properties",
 	                              G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-	g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_NATIVE_PROPERTIES,
+	g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PROPERTIES,
 	                                 pspec);
 /**
- * AnjutaProjectNode:custom-properties:
+ * AnjutaProjectNode:properties-info:
  *
- * Type: GLib.List<Anjuta.ProjectProperty>
+ * Type: GLib.List<Anjuta.ProjectPropertyInfo>
  * Transfer: none
  */
-	pspec = g_param_spec_pointer ("custom-properties",
-	                              "Custom properties",
-	                              "The list of overriden properties",
+	pspec = g_param_spec_pointer ("properties-info",
+	                              "Properties info",
+	                              "The list of all possible properties informations",
 	                              G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
-	g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_CUSTOM_PROPERTIES,
+	g_object_class_install_property (G_OBJECT_CLASS (klass), PROP_PROPERTIES_INFO,
 	                                 pspec);
 
 }
@@ -1248,7 +1335,7 @@ anjuta_project_node_info_name (const AnjutaProjectNodeInfo *info)
 	return info->name;
 }
 
-const gchar *   
+const gchar *
 anjuta_project_node_info_mime (const AnjutaProjectNodeInfo *info)
 {
 	return info->mime_type;
diff --git a/libanjuta/anjuta-project.h b/libanjuta/anjuta-project.h
index 70cb597..c7a08d2 100644
--- a/libanjuta/anjuta-project.h
+++ b/libanjuta/anjuta-project.h
@@ -2,17 +2,17 @@
 /*
  * anjuta-project.h
  * Copyright (C) SÃbastien Granjoux 2009 <seb sfo free fr>
- * 
+ *
  * This program is free software: you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the
  * Free Software Foundation, either version 3 of the License, or
  * (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful, but
  * WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  * See the GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License along
  * with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
@@ -29,6 +29,7 @@ G_BEGIN_DECLS
 #define ANJUTA_IS_PROJECT_PROPERTY
 
 typedef struct _AnjutaProjectProperty AnjutaProjectProperty;
+typedef struct _AnjutaProjectPropertyInfo AnjutaProjectPropertyInfo;
 
 typedef enum
 {
@@ -43,26 +44,39 @@ typedef enum
 	ANJUTA_PROJECT_PROPERTY_READ_ONLY = 1 << 0,
 	ANJUTA_PROJECT_PROPERTY_READ_WRITE = 1 << 1,
 	ANJUTA_PROJECT_PROPERTY_HIDDEN = 1 << 2,
+	ANJUTA_PROJECT_PROPERTY_STATIC = 1 << 3,
 } AnjutaProjectPropertyFlags;
 
 struct _AnjutaProjectProperty
 {
-	gchar *id;
 	gchar *name;
-	AnjutaProjectValueType type;
-	AnjutaProjectPropertyFlags flags;
-	const gchar *detail;
 	gchar *value;
-	AnjutaProjectProperty *native;
+	AnjutaProjectPropertyInfo *info;
+	gpointer user_data;
 };
 
 GType anjuta_project_property_get_type (void);
-
-AnjutaProjectProperty *anjuta_project_property_new (const gchar *id, const gchar *name, AnjutaProjectValueType type, const gchar *value, AnjutaProjectProperty *native);
+AnjutaProjectProperty *anjuta_project_property_new (const gchar *value, const gchar *name, gpointer user_data);
 AnjutaProjectProperty * anjuta_project_property_copy (AnjutaProjectProperty *prop);
 void anjuta_project_property_free (AnjutaProjectProperty *prop);
 
 
+struct _AnjutaProjectPropertyInfo
+{
+    gchar *id;
+	gchar *name;
+    AnjutaProjectValueType type;
+    AnjutaProjectPropertyFlags flags;
+    gchar *description;
+    AnjutaProjectProperty *property;
+	gpointer user_data;
+};
+
+GType anjuta_project_property_info_get_type (void);
+AnjutaProjectPropertyInfo *anjuta_project_property_info_new (const gchar *id, const gchar *name, AnjutaProjectValueType type, AnjutaProjectPropertyFlags flags, const gchar *description, AnjutaProjectProperty *property, gpointer user_data);
+AnjutaProjectPropertyInfo * anjuta_project_property_info_copy (AnjutaProjectPropertyInfo *info);
+void anjuta_project_property_info_free (AnjutaProjectPropertyInfo *info);
+
 
 #define ANJUTA_TYPE_PROJECT_NODE 			(anjuta_project_node_get_type ())
 #define ANJUTA_PROJECT_NODE(obj)			(G_TYPE_CHECK_INSTANCE_CAST ((obj), ANJUTA_TYPE_PROJECT_NODE, AnjutaProjectNode))
@@ -145,12 +159,12 @@ struct _AnjutaProjectNode
 	AnjutaProjectNode *prev;
 	AnjutaProjectNode	*parent;
 	AnjutaProjectNode *children;
-	
+
 	AnjutaProjectNodeType type;
 	AnjutaProjectNodeState state;
 
-	GList *native_properties;
-	GList *custom_properties;
+	GList *properties_info;
+	GList *properties;
 	GFile *file;
 	gchar *name;
 };
@@ -204,17 +218,20 @@ AnjutaProjectNodeState anjuta_project_node_get_state (const AnjutaProjectNode *n
 const gchar *anjuta_project_node_get_name (const AnjutaProjectNode *node);
 GFile *anjuta_project_node_get_file (const AnjutaProjectNode *node);
 
-GList *anjuta_project_node_get_native_properties (AnjutaProjectNode *node);
-GList *anjuta_project_node_get_custom_properties (AnjutaProjectNode *node);
-AnjutaProjectProperty *anjuta_project_node_get_property (AnjutaProjectNode *node, AnjutaProjectProperty *property);
-AnjutaProjectProperty *anjuta_project_node_get_map_property (AnjutaProjectNode *node, AnjutaProjectProperty *property, const gchar *name);
+GList *anjuta_project_node_get_properties_info (AnjutaProjectNode *node);
+GList *anjuta_project_node_get_properties (AnjutaProjectNode *node);
+AnjutaProjectPropertyInfo *anjuta_project_node_get_property_info (AnjutaProjectNode *node, const gchar *id);
+AnjutaProjectProperty *anjuta_project_node_get_property (AnjutaProjectNode *node, const gchar *id);
+AnjutaProjectProperty *anjuta_project_node_get_map_property (AnjutaProjectNode *node, const gchar *id, const gchar *name);
 
-gboolean anjuta_project_node_set_state (AnjutaProjectNode *node, AnjutaProjectNodeState state);
-gboolean anjuta_project_node_clear_state (AnjutaProjectNode *node, AnjutaProjectNodeState state);
 
-AnjutaProjectProperty *anjuta_project_node_insert_property (AnjutaProjectNode *node, AnjutaProjectProperty *native, AnjutaProjectProperty *property);
+AnjutaProjectPropertyInfo *anjuta_project_node_insert_property_info (AnjutaProjectNode *node, AnjutaProjectPropertyInfo *info);
+AnjutaProjectProperty *anjuta_project_node_insert_property (AnjutaProjectNode *node, AnjutaProjectPropertyInfo *info, AnjutaProjectProperty *property);
 AnjutaProjectProperty *anjuta_project_node_remove_property (AnjutaProjectNode *node, AnjutaProjectProperty *property);
 
+gboolean anjuta_project_node_set_state (AnjutaProjectNode *node, AnjutaProjectNodeState state);
+gboolean anjuta_project_node_clear_state (AnjutaProjectNode *node, AnjutaProjectNodeState state);
+
 AnjutaProjectNode *anjuta_project_node_get_group_from_file (const AnjutaProjectNode *root, GFile *directory);
 AnjutaProjectNode *anjuta_project_target_get_node_from_name (const AnjutaProjectNode *parent, const gchar *name);
 AnjutaProjectNode *anjuta_project_node_get_source_from_file (const AnjutaProjectNode *parent, GFile *file);
diff --git a/libanjuta/interfaces/libanjuta.idl b/libanjuta/interfaces/libanjuta.idl
index e28b991..4a49c7b 100644
--- a/libanjuta/interfaces/libanjuta.idl
+++ b/libanjuta/interfaces/libanjuta.idl
@@ -3272,7 +3272,8 @@ interface IAnjutaProject
 	 * ianjuta_project_set_property:
 	 * @obj: Self
 	 * @node: (transfer none): Node
-	 * @property: (transfer none): Property
+	 * @id: (transfer none): Property
+	 * @name: (allow-none) (transfer none): Name for map property
 	 * @value: (transfer none): Value
 	 * @err: Error propagation and reporting
 	 *
@@ -3280,20 +3281,21 @@ interface IAnjutaProject
 	 *
 	 * Return value: (allow-none) (transfer none): The new property of NULL if the property cannot be set
 	 */
-	AnjutaProjectProperty *set_property (AnjutaProjectNode *parent, AnjutaProjectProperty* property, const gchar *value);
+	AnjutaProjectProperty *set_property (AnjutaProjectNode *parent, const gchar *id, const gchar *name, const gchar *value);
 
 	/**
 	 * ianjuta_project_remove_property:
 	 * @obj: Self
 	 * @node: (transfer none): Node
-	 * @property: (transfer none): Property
+	 * @id: (transfer none): Property
+	 * @name: (allow-none) (transfer none): Name for map property
 	 * @err: Error propagation and reporting
 	 *
 	 * Remove a property of the node
 	 *
 	 * Return value: TRUE if the node is removed
 	 */
-	gboolean remove_property (AnjutaProjectNode *node, AnjutaProjectProperty* property);
+	gboolean remove_property (AnjutaProjectNode *node, const gchar *id, const gchar *name);
 
 	/**
 	 * ianjuta_project_get_root:
diff --git a/plugins/am-project/ac-writer.c b/plugins/am-project/ac-writer.c
index 1da7333..751ce0d 100644
--- a/plugins/am-project/ac-writer.c
+++ b/plugins/am-project/ac-writer.c
@@ -187,11 +187,11 @@ find_similar_property (AnjutaProjectNode *node, AmpProperty *property)
 {
 	GList *item;
 
-	for (item = anjuta_project_node_get_custom_properties (node); item != NULL; item = g_list_next (item))
+	for (item = anjuta_project_node_get_properties (node); item != NULL; item = g_list_next (item))
 	{
 		AmpProperty *prop = (AmpProperty *)item->data;
 
-		if ((prop->token_type == property->token_type) && (prop->token != NULL))
+		if ((((AmpPropertyInfo *)prop->base.info)->token_type == ((AmpPropertyInfo *)property->base.info)->token_type) && (prop->token != NULL))
 		{
 			return prop;
 		}
@@ -210,14 +210,15 @@ amp_project_update_ac_property (AmpProject *project, AnjutaProjectProperty *prop
 	AnjutaToken *arg;
 	AnjutaToken *args;
 	AmpProperty *prop;
+	AmpPropertyInfo *info;
 
-	if (((property->native->value == NULL) && (property->value == NULL)) ||
-	    (g_strcmp0 (property->native->value, property->value) == 0))
+	if (g_strcmp0 (((AmpPropertyInfo *)property->info)->value, property->value) == 0)
 	{
 		/* Remove property */
+		info = (AmpPropertyInfo *)property->info;
 		prop = (AmpProperty *)property;
 
-		if (prop->position == -1)
+		if (info->position == -1)
 		{
 			token = prop->token;
 
@@ -228,6 +229,7 @@ amp_project_update_ac_property (AmpProject *project, AnjutaProjectProperty *prop
 	}
 	else
 	{
+		info = (AmpPropertyInfo *)property->info;
 		prop = find_similar_property (ANJUTA_PROJECT_NODE (project), (AmpProperty *)property);
 		args = prop != NULL ? prop->token : NULL;
 
@@ -240,7 +242,7 @@ amp_project_update_ac_property (AmpProject *project, AnjutaProjectProperty *prop
 			const char *suffix;
 
 			configure = amp_project_get_configure_token (project);
-			token = anjuta_token_find_position (configure, TRUE, prop->token_type, NULL);
+			token = anjuta_token_find_position (configure, TRUE, info->token_type, NULL);
 			if (token == NULL)
 			{
 				token = skip_comment (configure);
@@ -253,7 +255,7 @@ amp_project_update_ac_property (AmpProject *project, AnjutaProjectProperty *prop
 				}
 			}
 
-			suffix = ((AmpProperty *)prop->base.native)->suffix;
+			suffix = info->suffix;
 			token = anjuta_token_insert_after (token, anjuta_token_new_string (AC_TOKEN_AC_INIT | ANJUTA_TOKEN_ADDED, suffix));
 			if (suffix[strlen(suffix) - 1] == '(')
 			{
@@ -272,7 +274,7 @@ amp_project_update_ac_property (AmpProject *project, AnjutaProjectProperty *prop
 			arg = anjuta_token_insert_before (token, anjuta_token_new_static (ANJUTA_TOKEN_ITEM | ANJUTA_TOKEN_ADDED, NULL));
 			anjuta_token_merge (arg, token);
 
-			pos = prop->position;
+			pos = info->position;
 			if (pos == -1) pos = 0;
 			anjuta_token_replace_nth_word (args, pos, arg);
 			anjuta_token_style_format (project->arg_list, args);
diff --git a/plugins/am-project/am-project-private.h b/plugins/am-project/am-project-private.h
index 1408d6d..d61019a 100644
--- a/plugins/am-project/am-project-private.h
+++ b/plugins/am-project/am-project-private.h
@@ -39,12 +39,17 @@ typedef enum {
 
 struct _AmpProperty {
 	AnjutaProjectProperty base;
+	AnjutaToken *token;
+};
+
+struct _AmpPropertyInfo {
+	AnjutaProjectPropertyInfo base;
 	gint token_type;
 	gint position;
 	const gchar *suffix;
 	AmpPropertyFlag flags;
-	AnjutaToken *token;
-	AmpProperty *link;			/* Link to a boolean property disabling this one */
+	const gchar *value;
+	AnjutaProjectPropertyInfo *link;			/* Link to a boolean property disabling this one */
 };
 
 struct _AmpProject {
diff --git a/plugins/am-project/am-project.c b/plugins/am-project/am-project.c
index 4c822cc..99eafe0 100644
--- a/plugins/am-project/am-project.c
+++ b/plugins/am-project/am-project.c
@@ -674,31 +674,28 @@ amp_project_load_properties (AmpProject *project, AnjutaToken *macro, AnjutaToke
 	GList *item;
 	gint type = anjuta_token_get_type (macro);
 
-	for (item = anjuta_project_node_get_native_properties (ANJUTA_PROJECT_NODE (project)); item != NULL; item = g_list_next (item))
+	for (item = anjuta_project_node_get_properties_info (ANJUTA_PROJECT_NODE (project)); item != NULL; item = g_list_next (item))
 	{
-		AmpProperty *prop = (AmpProperty *)item->data;
+		AmpPropertyInfo *info = (AmpPropertyInfo *)item->data;
 
-		if ((prop->token_type == type) && (prop->flags & AM_PROPERTY_IN_CONFIGURE))
+		if ((info->token_type == type) && (info->flags & AM_PROPERTY_IN_CONFIGURE))
 		{
 			AnjutaProjectProperty *new_prop;
 
-			new_prop = anjuta_project_node_remove_property (ANJUTA_PROJECT_NODE (project), (AnjutaProjectProperty *)prop);
+			new_prop = anjuta_project_node_get_property (ANJUTA_PROJECT_NODE (project), info->base.id);
 			if (new_prop != NULL)
 			{
 				amp_property_free (new_prop);
 			}
-			new_prop = amp_property_new (NULL, prop->token_type, prop->position, NULL, args);
+			new_prop = amp_property_new (NULL, info->token_type, info->position, NULL, args);
 
-			if (prop->position >= 0)
+			if (info->position >= 0)
 			{
 				/* Each parameter correspond to a different property */
 				AnjutaToken *arg;
 
-				arg = anjuta_token_nth_word (args, prop->position);
-				if ((new_prop->value != NULL) && (new_prop->value != prop->base.value))
-				{
-					g_free (new_prop->value);
-				}
+				arg = anjuta_token_nth_word (args, info->position);
+				g_free (new_prop->value);
 				new_prop->value = anjuta_token_evaluate (arg);
 			}
 			else
@@ -717,7 +714,7 @@ amp_project_load_properties (AmpProject *project, AnjutaToken *macro, AnjutaToke
 					if (new_prop->value == NULL) new_prop->value = g_strdup(" ");
 				}
 			}
-			anjuta_project_node_insert_property (ANJUTA_PROJECT_NODE (project), (AnjutaProjectProperty *)prop, new_prop);
+			amp_node_property_add (ANJUTA_PROJECT_NODE (project), new_prop);
 		}
 	}
 }
@@ -914,13 +911,12 @@ project_load_target (AmpProject *project, AnjutaProjectNode *parent, AnjutaToken
 				}
 
 				/* Copy all properties */
-				while ((properties = anjuta_project_node_get_custom_properties (ANJUTA_PROJECT_NODE (orphan))) != NULL)
+				while ((properties = anjuta_project_node_get_properties (ANJUTA_PROJECT_NODE (orphan))) != NULL)
 				{
 					AnjutaProjectProperty *prop;
 
 					prop = (AnjutaProjectProperty *)anjuta_project_node_remove_property (ANJUTA_PROJECT_NODE (orphan), (AnjutaProjectProperty *)properties->data);
-
-					amp_node_property_add (ANJUTA_PROJECT_NODE (target), prop);
+					amp_node_property_add ((AnjutaProjectNode *)target, prop);
 				}
 
 				/* Copy all sources */
@@ -1283,6 +1279,7 @@ project_load_group_properties (AmpProject *project, AnjutaProjectNode *parent, A
 	prop = amp_property_new (name, anjuta_token_get_type (variable), 0, value, list);
 
 	amp_node_property_add (parent, prop);
+
 	g_free (value);
 	g_free (name);
 
@@ -1529,9 +1526,9 @@ amp_project_update_node (AnjutaProjectNode *key, AnjutaProjectNode *value, GHash
 			amp_node_update (AMP_NODE (node), AMP_NODE (new_node));
 
 			/* Swap custom properties */
-			properties = node->custom_properties;
-			node->custom_properties = new_node->custom_properties;
-			new_node->custom_properties = properties;
+			properties = node->properties;
+			node->properties = new_node->properties;
+			new_node->properties = properties;
 
 			if (new_node->parent == NULL)
 			{
@@ -2239,7 +2236,7 @@ amp_set_property_work (PmJob *job)
 {
 	gint flags;
 
-	flags = ((AmpProperty *)job->property->native)->flags;
+	flags = ((AmpPropertyInfo *)job->property->info)->flags;
 
 	if (flags & AM_PROPERTY_IN_CONFIGURE)
 	{
@@ -2247,7 +2244,7 @@ amp_set_property_work (PmJob *job)
 	}
 	else if (flags & AM_PROPERTY_IN_MAKEFILE)
 	{
-		if (((AnjutaProjectProperty *)job->property->native)->flags & ANJUTA_PROJECT_PROPERTY_READ_WRITE)
+		if (((AnjutaProjectPropertyInfo *)job->property->info)->flags & ANJUTA_PROJECT_PROPERTY_READ_WRITE)
 		{
 			amp_project_update_am_property (AMP_PROJECT (job->user_data), job->node, job->property);
 		}
@@ -2277,7 +2274,7 @@ amp_remove_property_work (PmJob *job)
 {
 	gint flags;
 
-	flags = ((AmpProperty *)job->property->native)->flags;
+	flags = ((AmpPropertyInfo *)job->property->info)->flags;
 
 	if (flags & AM_PROPERTY_IN_CONFIGURE)
 	{
@@ -2285,7 +2282,7 @@ amp_remove_property_work (PmJob *job)
 	}
 	else if (flags & AM_PROPERTY_IN_MAKEFILE)
 	{
-		if (((AnjutaProjectProperty *)job->property->native)->flags & ANJUTA_PROJECT_PROPERTY_READ_WRITE)
+		if (((AnjutaProjectPropertyInfo *)job->property->info)->flags & ANJUTA_PROJECT_PROPERTY_READ_WRITE)
 		{
 			amp_project_update_am_property (AMP_PROJECT (job->user_data), job->node, job->property);
 		}
@@ -2387,14 +2384,14 @@ iproject_remove_node (IAnjutaProject *obj, AnjutaProjectNode *node, GError **err
 }
 
 static AnjutaProjectProperty *
-iproject_set_property (IAnjutaProject *obj, AnjutaProjectNode *node, AnjutaProjectProperty *property, const gchar *value, GError **error)
+iproject_set_property (IAnjutaProject *obj, AnjutaProjectNode *node, const gchar *id, const gchar *name, const gchar *value, GError **error)
 {
 	AnjutaProjectProperty *new_prop;
 	PmJob *set_property_job;
 
 	if (AMP_PROJECT (obj)->queue == NULL) AMP_PROJECT (obj)->queue = pm_command_queue_new ();
 
-	new_prop = amp_node_property_set (node, property, value);
+	new_prop = name == NULL ? amp_node_property_set (node, id, value) : amp_node_map_property_set (node, id, name, value);
 	set_property_job = pm_job_new (&amp_set_property_job, node, NULL, NULL, ANJUTA_PROJECT_UNKNOWN, NULL, NULL, obj);
 	set_property_job->property = new_prop;
 	pm_command_queue_push (AMP_PROJECT (obj)->queue, set_property_job);
@@ -2403,7 +2400,7 @@ iproject_set_property (IAnjutaProject *obj, AnjutaProjectNode *node, AnjutaProje
 }
 
 static gboolean
-iproject_remove_property (IAnjutaProject *obj, AnjutaProjectNode *node, AnjutaProjectProperty *property, GError **error)
+iproject_remove_property (IAnjutaProject *obj, AnjutaProjectNode *node, const gchar *id, const gchar *name, GError **error)
 {
 	AnjutaProjectProperty *new_prop;
 	PmJob *remove_property_job;
@@ -2411,8 +2408,7 @@ iproject_remove_property (IAnjutaProject *obj, AnjutaProjectNode *node, AnjutaPr
 	if (AMP_PROJECT (obj)->queue == NULL) AMP_PROJECT (obj)->queue = pm_command_queue_new ();
 
 
-	new_prop = amp_node_property_set (node, property, NULL);
-	new_prop->value = new_prop->native->value;
+	new_prop = amp_node_map_property_set (node, id, name, NULL);
 	remove_property_job = pm_job_new (&amp_set_property_job, node, NULL, NULL, ANJUTA_PROJECT_UNKNOWN, NULL, NULL, obj);
 	remove_property_job->property = new_prop;
 	pm_command_queue_push (AMP_PROJECT (obj)->queue, remove_property_job);
diff --git a/plugins/am-project/am-project.h b/plugins/am-project/am-project.h
index 3eb3298..1c995c5 100644
--- a/plugins/am-project/am-project.h
+++ b/plugins/am-project/am-project.h
@@ -54,6 +54,7 @@ struct _AmpProjectClass {
 };
 
 typedef struct _AmpProperty AmpProperty;
+typedef struct _AmpPropertyInfo AmpPropertyInfo;
 
 GType         amp_project_get_type (void);
 AmpProject   *amp_project_new      (GFile *file, IAnjutaLanguage *language, GError **error);
diff --git a/plugins/am-project/am-properties.c b/plugins/am-project/am-properties.c
index 2327b3f..68fb679 100644
--- a/plugins/am-project/am-properties.c
+++ b/plugins/am-project/am-properties.c
@@ -42,13 +42,13 @@
 /* Constants
   *---------------------------------------------------------------------------*/
 
-static AmpProperty AmpProjectProperties[] =
+static AmpPropertyInfo AmpProjectProperties[] =
 {
 	{
 		{"NAME",
 		N_("Name:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 		N_("Project name, it can contain spaces by example 'GNU Autoconf'")},
 		AC_TOKEN_AC_INIT, 0, "AC_INIT(",
 		AM_PROPERTY_IN_CONFIGURE
@@ -57,7 +57,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"VERSION",
 		N_("Version:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 		N_("Project version, typically a few numbers separated by dot by example '1.0.0'")},
 		AC_TOKEN_AC_INIT, 1, "AC_INIT(",
 		AM_PROPERTY_IN_CONFIGURE
@@ -66,7 +66,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"BUGREPORT",
 		N_("Bug report URL:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 		N_("An email address or a link to a web page where the user can report bug. It is optional.")},
 		AC_TOKEN_AC_INIT, 2, "AC_INIT(",
 		AM_PROPERTY_IN_CONFIGURE
@@ -75,7 +75,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"PACKAGE",
 		N_("Package name:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 		N_("Package name, it can contains only alphanumerics and underscore characters."
 		   "It is generated from the project name if not provided.")},
 		AC_TOKEN_AC_INIT, 3, "AC_INIT(",
@@ -85,7 +85,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"URL",
 		N_("URL:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 		N_("An link to the project web page if provided.")},
 		AC_TOKEN_AC_INIT, 4, "AC_INIT(",
 		AM_PROPERTY_IN_CONFIGURE
@@ -103,7 +103,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"LDFLAGS",
 		N_("Linker flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional linker flags for all targets in this group.")},
 		AM_TOKEN__LDFLAGS,	0, "AM_LDFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -112,7 +112,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"CPPFLAGS",
 		N_("C preprocessor flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional C preprocessor flags for all targets in this group.")},
 		AM_TOKEN__CPPFLAGS, 0, "AM_CPPFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -121,7 +121,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"CFLAGS",
 		N_("C compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional C compiler flags for all targets in this group.")},
 		AM_TOKEN__CFLAGS, 0, "AM_CFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -130,7 +130,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"CXXFLAGS",
 		N_("C++ compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional C++ compiler flags for all targets in this group.")},
 		AM_TOKEN__CXXFLAGS, 0, "AM_CXXFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -139,7 +139,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"JAVAFLAGS",
 		N_("Java compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Java compiler flags for all targets in this group.")},
 		AM_TOKEN__JAVACFLAGS, 0, "AM_JAVAFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -148,7 +148,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"VALAFLAGS",
 		N_("Vala compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Vala compiler flags for all targets in this group.")},
 		AM_TOKEN__VALAFLAGS, 0, "AM_VALAFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -157,7 +157,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"FCFLAGS",
 		N_("Fortran compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Fortran compiler flags for all targets in this group.")},
 		AM_TOKEN__FCFLAGS, 0, "AM_FCFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -166,7 +166,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"OBJCFLAGS",
 		N_("Objective C compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Objective C compiler flags for all targets in this group.")},
 		AM_TOKEN__OBJCFLAGS,	0, "AM_OBJCFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -175,7 +175,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"LFLAGS",
 		N_("Lex/Flex flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Lex or Flex lexical analyser generator flags for all targets in this group.")},
 		AM_TOKEN__LFLAGS, 0, "AM_LFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -184,7 +184,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"YFLAGS",
 		N_("Yacc/Bison flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Yacc or Bison parser generator flags for all targets in this group.")},
 		AM_TOKEN__YFLAGS, 0, "AM_YFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -193,7 +193,7 @@ static AmpProperty AmpProjectProperties[] =
 		{"INSTALLDIRS",
 		N_("Installation directories:"),
 			ANJUTA_PROJECT_PROPERTY_MAP,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("List of custom installation directories used by targets in this group.")},
 		AM_TOKEN_DIR, 0, NULL,
 		AM_PROPERTY_IN_MAKEFILE
@@ -204,13 +204,13 @@ static AmpProperty AmpProjectProperties[] =
 static GList* AmpProjectPropertyList = NULL;
 
 
-static AmpProperty AmpGroupNodeProperties[] =
+static AmpPropertyInfo AmpGroupNodeProperties[] =
 {
 	{
 		{"LDFLAGS",
 		N_("Linker flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional linker flags for all targets in this group.")},
 		AM_TOKEN__LDFLAGS,	0, "AM_LDFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -219,7 +219,7 @@ static AmpProperty AmpGroupNodeProperties[] =
 		{"CPPFLAGS",
 		N_("C preprocessor flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional C preprocessor flags for all targets in this group.")},
 		AM_TOKEN__CPPFLAGS, 0, "AM_CPPFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -228,7 +228,7 @@ static AmpProperty AmpGroupNodeProperties[] =
 		{"CFLAGS",
 		N_("C compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional C compiler flags for all targets in this group.")},
 		AM_TOKEN__CFLAGS, 0, "AM_CFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -237,7 +237,7 @@ static AmpProperty AmpGroupNodeProperties[] =
 		{"CXXFLAGS",
 		N_("C++ compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional C++ compiler flags for all targets in this group.")},
 		AM_TOKEN__CXXFLAGS, 0, "AM_CXXFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -246,7 +246,7 @@ static AmpProperty AmpGroupNodeProperties[] =
 		{"JAVAFLAGS",
 		N_("Java compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Java compiler flags for all targets in this group.")},
 		AM_TOKEN__JAVACFLAGS, 0, "AM_JAVAFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -255,7 +255,7 @@ static AmpProperty AmpGroupNodeProperties[] =
 		{"VALAFLAGS",
 		N_("Vala compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Vala compiler flags for all targets in this group.")},
 		AM_TOKEN__VALAFLAGS, 0, "AM_VALAFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -264,7 +264,7 @@ static AmpProperty AmpGroupNodeProperties[] =
 		{"FCFLAGS",
 		N_("Fortran compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Fortran compiler flags for all targets in this group.")},
 		AM_TOKEN__FCFLAGS, 0, "AM_FCFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -273,7 +273,7 @@ static AmpProperty AmpGroupNodeProperties[] =
 		{"OBJCFLAGS",
 		N_("Objective C compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Objective C compiler flags for all targets in this group.")},
 		AM_TOKEN__OBJCFLAGS,	0, "AM_OBJCFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -282,7 +282,7 @@ static AmpProperty AmpGroupNodeProperties[] =
 		{"LFLAGS",
 		N_("Lex/Flex flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Lex or Flex lexical analyser generator flags for all targets in this group.")},
 		AM_TOKEN__LFLAGS, 0, "AM_LFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -291,7 +291,7 @@ static AmpProperty AmpGroupNodeProperties[] =
 		{"YFLAGS",
 		N_("Yacc/Bison flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Common additional Yacc or Bison parser generator flags for all targets in this group.")},
 		AM_TOKEN__YFLAGS, 0, "AM_YFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -300,7 +300,7 @@ static AmpProperty AmpGroupNodeProperties[] =
 		{"INSTALLDIRS",
 		N_("Installation directories:"),
 			ANJUTA_PROJECT_PROPERTY_MAP,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("List of custom installation directories used by targets in this group.")},
 		AM_TOKEN_DIR, 0, NULL,
 		AM_PROPERTY_IN_MAKEFILE
@@ -311,22 +311,22 @@ static AmpProperty AmpGroupNodeProperties[] =
 static GList* AmpGroupNodePropertyList = NULL;
 
 
-static AmpProperty AmpTargetNodeProperties[] = {
+static AmpPropertyInfo AmpTargetNodeProperties[] = {
 	{
 		{"NOINST",
 		N_("Do not install:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_ONLY,
-			N_("Build but do not install the target."),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_ONLY | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Build but do not install the target.")},
 		AM_TOKEN__PROGRAMS,	 3, NULL,
-		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DISABLE_FOLLOWING
+		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DISABLE_FOLLOWING,
+		"0"
 	},
 	{
 		{"INSTALLDIR",
 		N_("Installation directory:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_ONLY,
+			ANJUTA_PROJECT_PROPERTY_READ_ONLY | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("It has to be a standard directory or a custom one defined in group properties.")},
 		AM_TOKEN__PROGRAMS, 	6, "bin",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DIRECTORY
@@ -335,7 +335,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"LDFLAGS",
 		N_("Linker flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional linker flags for this target.")},
 		AM_TOKEN_TARGET_LDFLAGS, 0, "_LDFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -344,7 +344,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"LIBADD",
 		N_("Additional libraries:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional libraries for this target.")},
 		AM_TOKEN_TARGET_LIBADD, 0, "_LIBADD",
 		AM_PROPERTY_IN_MAKEFILE
@@ -353,7 +353,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"LDADD",
 		N_("Additional objects:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional object files for this target.")},
 		AM_TOKEN_TARGET_LDADD,	0, "_LDADD",
 		AM_PROPERTY_IN_MAKEFILE
@@ -362,7 +362,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"CPPFLAGS",
 		N_("C preprocessor flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional C preprocessor flags for this target.")},
 		AM_TOKEN_TARGET_CPPFLAGS,	0, "_CPPFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -371,7 +371,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"CFLAGS",
 		N_("C compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional C compiler flags for this target.")},
 		AM_TOKEN_TARGET_CFLAGS, 0, 	"_CFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -380,7 +380,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"CXXFLAGS",
 		N_("C++ compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional C++ compiler flags for this target.")},
 		AM_TOKEN_TARGET_CXXFLAGS,	0, "_CXXFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -389,7 +389,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"JAVAFLAGS",
 		N_("Java compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Java compiler flags for this target.")},
 		AM_TOKEN_TARGET_JAVACFLAGS, 0, "_JAVACFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -398,7 +398,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"VALAFLAGS",
 		N_("Vala compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Vala compiler flags for this target.")},
 		AM_TOKEN_TARGET_VALAFLAGS,0, "_VALAFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -407,7 +407,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"FCFLAGS",
 		N_("Fortran compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Fortran compiler flags for this target.")},
 		AM_TOKEN_TARGET_FCFLAGS, 0, "_FCFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -416,7 +416,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"OBJCFLAGS",
 		N_("Objective C compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Objective C compiler flags for this target.")},
 		AM_TOKEN_TARGET_OBJCFLAGS, 0, "_OBJCFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -425,7 +425,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"LFLAGS",
 		N_("Lex/Flex flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Lex or Flex lexical analyser generator flags for this target.")},
 		AM_TOKEN_TARGET_LFLAGS, 0, "_LFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -434,7 +434,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"YFLAGS",
 		N_("Yacc/Bison flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Yacc or Bison parser generator flags for this target.")},
 		AM_TOKEN_TARGET_YFLAGS,	0, 	"_YFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -443,7 +443,7 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"EXTRA_DIST",
 		N_("Additional dependencies:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional dependencies for this target.")},
 		AM_TOKEN_TARGET_DEPENDENCIES, 0, "EXTRA_DIST",
 		AM_PROPERTY_IN_MAKEFILE
@@ -452,42 +452,42 @@ static AmpProperty AmpTargetNodeProperties[] = {
 		{"DIST",
 		N_("Include in distribution:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_ONLY,
-			N_("Include this target in the distributed package."),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_ONLY | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Include this target in the distributed package.")},
 		AM_TOKEN__PROGRAMS, 	2, NULL,
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{
 		{"CHECKONLY",
 		N_("Build for check only:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_ONLY,
-			N_("Build this target only when running automatic tests."),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_ONLY | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Build this target only when running automatic tests.")},
 		AM_TOKEN__PROGRAMS, 	4, 	NULL,
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{
 		{"NOTRANS",
 		N_("Do not use prefix:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_ONLY,
-			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. "),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_ONLY | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. ")},
 		AM_TOKEN__PROGRAMS, 	1, NULL,
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{
 		{"NOBASE",
 		N_("Keep target path:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_ONLY,
+			ANJUTA_PROJECT_PROPERTY_READ_ONLY | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Keep relative target path for installing it. "
-			   "By example if you have a program subdir/app installed in bin directory it will be installed in bin/subdir/app not in bin/app."),
-			"0"},
+			   "By example if you have a program subdir/app installed in bin directory it will be installed in bin/subdir/app not in bin/app.")},
 		AM_TOKEN__PROGRAMS, 	0, NULL,
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{}
 };
@@ -495,22 +495,22 @@ static AmpProperty AmpTargetNodeProperties[] = {
 static GList* AmpTargetNodePropertyList = NULL;
 
 
-static AmpProperty AmpProgramTargetProperties[] = {
+static AmpPropertyInfo AmpProgramTargetProperties[] = {
 	{
 		{"NOINST",
 		N_("Do not install:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Build but do not install the target."),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Build but do not install the target.")},
 		AM_TOKEN__PROGRAMS,	 3, "noinst_",
-		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DISABLE_FOLLOWING
+		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DISABLE_FOLLOWING,
+		"0"
 	},
 	{
 		{"INSTALLDIR",
 		N_("Installation directory:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("It has to be a standard directory or a custom one defined in group properties.")},
 		AM_TOKEN__PROGRAMS, 	6, "bin",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DIRECTORY
@@ -519,7 +519,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"LDFLAGS",
 		N_("Linker flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional linker flags for this target.")},
 		AM_TOKEN_TARGET_LDFLAGS, 0, "_LDFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -528,7 +528,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"LDADD",
 		N_("Libraries:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional libraries for this target.")},
 		AM_TOKEN_TARGET_LDADD,	0, "_LDADD",
 		AM_PROPERTY_IN_MAKEFILE
@@ -537,7 +537,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"CPPFLAGS",
 		N_("C preprocessor flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional C preprocessor flags for this target.")},
 		AM_TOKEN_TARGET_CPPFLAGS,	0, "_CPPFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -546,7 +546,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"CFLAGS",
 		N_("C compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional C compiler flags for this target.")},
 		AM_TOKEN_TARGET_CFLAGS, 0, 	"_CFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -555,7 +555,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"CXXFLAGS",
 		N_("C++ compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional C++ compiler flags for this target.")},
 		AM_TOKEN_TARGET_CXXFLAGS,	0, "_CXXFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -564,7 +564,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"JAVAFLAGS",
 		N_("Java compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Java compiler flags for this target.")},
 		AM_TOKEN_TARGET_JAVACFLAGS, 0, "_JAVACFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -573,7 +573,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"VALAFLAGS",
 		N_("Vala compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Vala compiler flags for this target.")},
 		AM_TOKEN_TARGET_VALAFLAGS,0, "_VALAFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -582,7 +582,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"FCFLAGS",
 		N_("Fortran compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Fortran compiler flags for this target.")},
 		AM_TOKEN_TARGET_FCFLAGS, 0, "_FCFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -591,7 +591,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"OBJCFLAGS",
 		N_("Objective C compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Objective C compiler flags for this target.")},
 		AM_TOKEN_TARGET_OBJCFLAGS, 0, "_OBJCFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -600,7 +600,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"LFLAGS",
 		N_("Lex/Flex flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Lex or Flex lexical analyser generator flags for this target.")},
 		AM_TOKEN_TARGET_LFLAGS, 0, "_LFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -609,7 +609,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"YFLAGS",
 		N_("Yacc/Bison flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Yacc or Bison parser generator flags for this target.")},
 		AM_TOKEN_TARGET_YFLAGS,	0, 	"_YFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -618,7 +618,7 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"EXTRA_DIST",
 		N_("Additional dependencies:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional dependencies for this target.")},
 		AM_TOKEN_TARGET_DEPENDENCIES, 0, "EXTRA_DIST",
 		AM_PROPERTY_IN_MAKEFILE
@@ -627,42 +627,42 @@ static AmpProperty AmpProgramTargetProperties[] = {
 		{"DIST",
 		N_("Include in distribution:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Include this target in the distributed package."),
-			"1"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Include this target in the distributed package.")},
 		AM_TOKEN__PROGRAMS, 	2, "nodist_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"1"
 	},
 	{
 		{"CHECK",
 		N_("Build for check only:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Build this target only when running automatic tests."),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Build this target only when running automatic tests.")},
 		AM_TOKEN__PROGRAMS, 	4, 	"check_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{
 		{"NOTRANS",
 		N_("Do not use prefix:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. "),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. ")},
 		AM_TOKEN__PROGRAMS, 	1, "notrans_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{
 		{"NOBASE",
 		N_("Keep target path:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Keep relative target path for installing it. "
-			   "By example if you have a program subdir/app installed in bin directory it will be installed in bin/subdir/app not in bin/app."),
-			"0"},
+			   "By example if you have a program subdir/app installed in bin directory it will be installed in bin/subdir/app not in bin/app.")},
 		AM_TOKEN__PROGRAMS, 	0, "nobase_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{}
 };
@@ -670,22 +670,22 @@ static AmpProperty AmpProgramTargetProperties[] = {
 static GList* AmpProgramTargetPropertyList = NULL;
 
 
-static AmpProperty AmpLibraryTargetProperties[] = {
+static AmpPropertyInfo AmpLibraryTargetProperties[] = {
 		{
 		{"NOINST",
 		N_("Do not install:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Build but do not install the target."),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Build but do not install the target.")},
 		AM_TOKEN__PROGRAMS,	 3, "noinst_",
-		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DISABLE_FOLLOWING
+		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DISABLE_FOLLOWING,
+		"0"
 	},
 	{
 		{"INSTALLDIR",
 		N_("Installation directory:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("It has to be a standard directory or a custom one defined in group properties.")},
 		AM_TOKEN__PROGRAMS, 	6, "lib",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DIRECTORY
@@ -694,7 +694,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"LDFLAGS",
 		N_("Linker flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional linker flags for this target.")},
 		AM_TOKEN_TARGET_LDFLAGS, 0, "_LDFLAGS",
 		AM_PROPERTY_IN_MAKEFILE
@@ -703,7 +703,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"LIBADD",
 		N_("Libraries:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional libraries for this target.")},
 		AM_TOKEN_TARGET_LIBADD,	0, "_LIBADD",
 		AM_PROPERTY_IN_MAKEFILE
@@ -712,7 +712,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"CPPFLAGS",
 		N_("C preprocessor flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional C preprocessor flags for this target.")},
 		AM_TOKEN_TARGET_CPPFLAGS,	0, "_CPPFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -721,7 +721,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"CFLAGS",
 		N_("C compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional C compiler flags for this target.")},
 		AM_TOKEN_TARGET_CFLAGS, 0, 	"_CFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -730,7 +730,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"CXXFLAGS",
 		N_("C++ compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional C++ compiler flags for this target.")},
 		AM_TOKEN_TARGET_CXXFLAGS,	0, "_CXXFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -739,7 +739,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"JAVAFLAGS",
 		N_("Java compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Java compiler flags for this target.")},
 		AM_TOKEN_TARGET_JAVACFLAGS, 0, "_JAVACFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -748,7 +748,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"VALAFLAGS",
 		N_("Vala compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Vala compiler flags for this target.")},
 		AM_TOKEN_TARGET_VALAFLAGS,0, "_VALAFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -757,7 +757,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"FCFLAGS",
 		N_("Fortran compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Fortran compiler flags for this target.")},
 		AM_TOKEN_TARGET_FCFLAGS, 0, "_FCFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -766,7 +766,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"OBJCFLAGS",
 		N_("Objective C compiler flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Objective C compiler flags for this target.")},
 		AM_TOKEN_TARGET_OBJCFLAGS, 0, "_OBJCFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -775,7 +775,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"LFLAGS",
 		N_("Lex/Flex flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Lex or Flex lexical analyser generator flags for this target.")},
 		AM_TOKEN_TARGET_LFLAGS, 0, "_LFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -784,7 +784,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"YFLAGS",
 		N_("Yacc/Bison flags:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional Yacc or Bison parser generator flags for this target.")},
 		AM_TOKEN_TARGET_YFLAGS,	0, 	"_YFLAGS",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_COMPILATION_FLAG
@@ -793,7 +793,7 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"EXTRA_DIST",
 		N_("Additional dependencies:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional dependencies for this target.")},
 		AM_TOKEN_TARGET_DEPENDENCIES, 0, "EXTRA_DIST",
 		AM_PROPERTY_IN_MAKEFILE
@@ -802,42 +802,42 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 		{"DIST",
 		N_("Include in distribution:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Include this target in the distributed package."),
-			"1"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Include this target in the distributed package.")},
 		AM_TOKEN__PROGRAMS, 	2, "nodist_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"1"
 	},
 	{
 		{"CHECK",
 		N_("Build for check only:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Build this target only when running automatic tests."),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Build this target only when running automatic tests.")},
 		AM_TOKEN__PROGRAMS, 	4, 	"check_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{
 		{"NOTRANS",
 		N_("Do not use prefix:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. "),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. ")},
 		AM_TOKEN__PROGRAMS, 	1, "notrans_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{
 		{"NOBASE",
 		N_("Keep target path:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Keep relative target path for installing it. "
-			   "By example if you have a program subdir/app installed in bin directory it will be installed in bin/subdir/app not in bin/app."),
-			"0"},
+			   "By example if you have a program subdir/app installed in bin directory it will be installed in bin/subdir/app not in bin/app.")},
 		AM_TOKEN__PROGRAMS, 	0, "nobase_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{}
 };
@@ -845,12 +845,12 @@ static AmpProperty AmpLibraryTargetProperties[] = {
 static GList* AmpLibraryTargetPropertyList = NULL;
 
 
-static AmpProperty AmpManTargetProperties[] = {
+static AmpPropertyInfo AmpManTargetProperties[] = {
 	{
 		{"EXTRA_DIST",
 		N_("Additional dependencies:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_ONLY,
+			ANJUTA_PROJECT_PROPERTY_READ_ONLY | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional dependencies for this target.")},
 		0, 0, NULL,
 		AM_PROPERTY_IN_MAKEFILE
@@ -859,17 +859,17 @@ static AmpProperty AmpManTargetProperties[] = {
 		{"NOTRANS",
 		N_("Do not use prefix:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. "),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. ")},
 		AM_TOKEN__PROGRAMS,	1, "notrans_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{
 		{"MAN",
 		N_("Manual section:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Section where are installed the man pages. Valid section names are the digits â0â through â9â, and the letters âlâ and ânâ. ")},
 		AM_TOKEN__PROGRAMS,	 5, "man_",
 		AM_PROPERTY_IN_MAKEFILE
@@ -880,22 +880,22 @@ static AmpProperty AmpManTargetProperties[] = {
 static GList* AmpManTargetPropertyList = NULL;
 
 
-static AmpProperty AmpDataTargetProperties[] = {
+static AmpPropertyInfo AmpDataTargetProperties[] = {
 	{
 		{"NOINST",
 		N_("Do not install:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Build but do not install the target."),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Build but do not install the target.")},
 		AM_TOKEN__PROGRAMS,	 3, "noinst_",
-		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DISABLE_FOLLOWING
+		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DISABLE_FOLLOWING,
+		"0"
 	},
 	{
 		{"INSTALLDIR",
 		N_("Installation directory:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("It has to be a standard directory or a custom one defined in group properties.")},
 		AM_TOKEN__PROGRAMS, 	6, "data",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DIRECTORY
@@ -904,7 +904,7 @@ static AmpProperty AmpDataTargetProperties[] = {
 		{"EXTRA_DIST",
 		N_("Additional dependencies:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional dependencies for this target.")},
 		AM_TOKEN_TARGET_DEPENDENCIES, 0, "EXTRA_DIST",
 		AM_PROPERTY_IN_MAKEFILE
@@ -913,42 +913,42 @@ static AmpProperty AmpDataTargetProperties[] = {
 		{"DIST",
 		N_("Include in distribution:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Include this target in the distributed package."),
-			"1"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Include this target in the distributed package.")},
 		AM_TOKEN__PROGRAMS, 	2, "nodist_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"1"
 	},
 	{
 		{"CHECK",
 		N_("Build for check only:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Build this target only when running automatic tests."),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Build this target only when running automatic tests.")},
 		AM_TOKEN__PROGRAMS, 	4, 	"check_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{
 		{"NOTRANS",
 		N_("Do not use prefix:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
-			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. "),
-			"0"},
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
+			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. ")},
 		AM_TOKEN__PROGRAMS, 	1, "notrans_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{
 		{"NOBASE",
 		N_("Keep target path:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Keep relative target path for installing it. "
-			   "By example if you have a program subdir/app installed in bin directory it will be installed in bin/subdir/app not in bin/app."),
-			"0"},
+			   "By example if you have a program subdir/app installed in bin directory it will be installed in bin/subdir/app not in bin/app.")},
 		AM_TOKEN__PROGRAMS, 	0, "nobase_",
-		AM_PROPERTY_IN_MAKEFILE
+		AM_PROPERTY_IN_MAKEFILE,
+		"0"
 	},
 	{}
 };
@@ -956,12 +956,12 @@ static AmpProperty AmpDataTargetProperties[] = {
 static GList* AmpDataTargetPropertyList = NULL;
 
 
-static AmpProperty AmpScriptTargetProperties[] = {
+static AmpPropertyInfo AmpScriptTargetProperties[] = {
 	{
 		{"NOINST",
 		N_("Do not install:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_ONLY,
+			ANJUTA_PROJECT_PROPERTY_READ_ONLY | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Build but do not install the target.")},
 		AM_TOKEN__PROGRAMS,	 3, "noinst_",
 		AM_PROPERTY_IN_MAKEFILE | AM_PROPERTY_DISABLE_FOLLOWING
@@ -970,7 +970,7 @@ static AmpProperty AmpScriptTargetProperties[] = {
 		{"INSTALLDIR",
 		N_("Installation directory:"),
 			ANJUTA_PROJECT_PROPERTY_STRING,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("It has to be a standard directory or a custom one defined in group properties.")},
 		AM_TOKEN__PROGRAMS, 	6, "bin",
 		AM_PROPERTY_IN_MAKEFILE
@@ -979,7 +979,7 @@ static AmpProperty AmpScriptTargetProperties[] = {
 		{"EXTRA_DIST",
 		N_("Additional dependencies:"),
 			ANJUTA_PROJECT_PROPERTY_LIST,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Additional dependencies for this target.")},
 		AM_TOKEN_TARGET_DEPENDENCIES, 0, "EXTRA_DIST",
 		AM_PROPERTY_IN_MAKEFILE
@@ -988,7 +988,7 @@ static AmpProperty AmpScriptTargetProperties[] = {
 		{"DIST",
 		N_("Include in distribution:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Include this target in the distributed package.")},
 		AM_TOKEN__PROGRAMS, 	2, "nodist_",
 		AM_PROPERTY_IN_MAKEFILE
@@ -997,7 +997,7 @@ static AmpProperty AmpScriptTargetProperties[] = {
 		{"CHECK",
 		N_("Build for check only:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Build this target only when running automatic tests.")},
 		AM_TOKEN__PROGRAMS, 	4, 	"check_",
 		AM_PROPERTY_IN_MAKEFILE
@@ -1006,7 +1006,7 @@ static AmpProperty AmpScriptTargetProperties[] = {
 		{"NOTRANS",
 		N_("Do not use prefix:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Do not rename the target with an optional prefix, used to avoid overwritting system program. ")},
 		AM_TOKEN__PROGRAMS, 	1, "notrans_",
 		AM_PROPERTY_IN_MAKEFILE
@@ -1015,7 +1015,7 @@ static AmpProperty AmpScriptTargetProperties[] = {
 		{"NOBASE",
 		N_("Keep target path:"),
 			ANJUTA_PROJECT_PROPERTY_BOOLEAN,
-			ANJUTA_PROJECT_PROPERTY_READ_WRITE,
+			ANJUTA_PROJECT_PROPERTY_READ_WRITE | ANJUTA_PROJECT_PROPERTY_STATIC,
 			N_("Keep relative target path for installing it. "
 			   "By example if you have a program subdir/app installed in bin directory it will be installed in bin/subdir/app not in bin/app.")},
 		AM_TOKEN__PROGRAMS, 	0, "nobase_",
@@ -1034,18 +1034,20 @@ static GList* AmpScriptTargetPropertyList = NULL;
  *---------------------------------------------------------------------------*/
 
 static GList *
-amp_create_property_list (GList **list, AmpProperty *properties)
+amp_create_property_list (GList **list, AmpPropertyInfo *properties)
 {
 	if (*list == NULL)
 	{
-		AmpProperty *prop;
-		AmpProperty *link = NULL;
+		AmpPropertyInfo *info;
+		AnjutaProjectPropertyInfo *link = NULL;
 
-		for (prop = properties; prop->base.name != NULL; prop++)
+		for (info = properties; info->base.name != NULL; info++)
 		{
-			prop->link = link;
-			*list = g_list_prepend (*list, prop);
-			link = prop->flags & AM_PROPERTY_DISABLE_FOLLOWING ? prop : NULL;
+			info->link = link;
+			*list = g_list_prepend (*list, info);
+			link = info->flags & AM_PROPERTY_DISABLE_FOLLOWING ? (AnjutaProjectPropertyInfo *)info : NULL;
+			info->base.property = amp_property_new (NULL, 0, 0, info->value, NULL);
+			info->base.property->info = (AnjutaProjectPropertyInfo *)info;
 		}
 		*list = g_list_reverse (*list);
 	}
@@ -1056,6 +1058,30 @@ amp_create_property_list (GList **list, AmpProperty *properties)
 /* Public functions
  *---------------------------------------------------------------------------*/
 
+/* Properties info objects
+ *---------------------------------------------------------------------------*/
+
+AnjutaProjectPropertyInfo *
+amp_property_info_new (AnjutaTokenType type, gint position)
+{
+	AmpPropertyInfo* info;
+
+	info = g_slice_new0(AmpPropertyInfo);
+	info->token_type = type;
+	info->position = position;
+
+	return (AnjutaProjectPropertyInfo *)info;
+}
+
+void
+amp_property_info_free (AnjutaProjectPropertyInfo *info)
+{
+	if (!(info->flags & ANJUTA_PROJECT_PROPERTY_STATIC))
+	{
+		g_slice_free (AmpPropertyInfo, (AmpPropertyInfo *)info);
+	}
+}
+
 
 /* Properties objects
  *---------------------------------------------------------------------------*/
@@ -1069,8 +1095,11 @@ amp_property_new (const gchar *name, AnjutaTokenType type, gint position, const
 	prop->base.name = g_strdup (name);
 	prop->base.value = g_strdup (value);
 	prop->token = token;
-	prop->token_type = type;
-	prop->position = position;
+	if ((type != 0) || (position != 0))
+	{
+		/* Add a dummy properties info to keep track of type and position */
+		prop->base.info = amp_property_info_new (type, position);
+	}
 
 	return (AnjutaProjectProperty *)prop;
 }
@@ -1078,16 +1107,8 @@ amp_property_new (const gchar *name, AnjutaTokenType type, gint position, const
 void
 amp_property_free (AnjutaProjectProperty *prop)
 {
-	if (prop->native == NULL) return;
-
-	if ((prop->name != NULL) && (prop->name != prop->native->name))
-	{
-		g_free (prop->name);
-	}
-	if ((prop->value != NULL) && (prop->value != prop->native->value))
-	{
-		g_free (prop->value);
-	}
+	g_free (prop->name);
+	g_free (prop->value);
 	g_slice_free (AmpProperty, (AmpProperty *)prop);
 }
 
@@ -1100,21 +1121,21 @@ amp_node_property_load (AnjutaProjectNode *node, gint token_type, gint position,
 	GList *item;
 	gboolean set = FALSE;
 
-	for (item = anjuta_project_node_get_native_properties (node); item != NULL; item = g_list_next (item))
+	for (item = anjuta_project_node_get_properties_info (node); item != NULL; item = g_list_next (item))
 	{
-		AmpProperty *prop = (AmpProperty *)item->data;
+		AmpPropertyInfo *info = (AmpPropertyInfo *)item->data;
 
-		if ((prop->token_type == token_type) && (prop->position == position))
+		if ((info->token_type == token_type) && (info->position == position))
 		{
 			AnjutaProjectProperty *new_prop;
 
-			new_prop = anjuta_project_node_get_property (node, (AnjutaProjectProperty *)prop);
-			if (new_prop->native == NULL)
+			new_prop = anjuta_project_node_get_property (node, info->base.id);
+			if ((new_prop == NULL) || (new_prop == new_prop->info->property))
 			{
-				new_prop = anjuta_project_node_insert_property (node, new_prop, amp_property_new (NULL, token_type, position, NULL, token));
+				new_prop = anjuta_project_node_insert_property (node, (AnjutaProjectPropertyInfo *)info, amp_property_new (NULL, 0, 0, NULL, token));
 			}
 
-			if ((new_prop->value != NULL) && (new_prop->value != prop->base.value)) g_free (new_prop->value);
+			g_free (new_prop->value);
 			new_prop->value = g_strdup (value);
 			set = TRUE;
 		}
@@ -1129,28 +1150,27 @@ amp_node_property_add (AnjutaProjectNode *node, AnjutaProjectProperty *new_prop)
 	GList *item;
 	gboolean set = FALSE;
 
-	for (item = anjuta_project_node_get_native_properties (node); item != NULL; item = g_list_next (item))
+	for (item = anjuta_project_node_get_properties_info (node); item != NULL; item = g_list_next (item))
 	{
-		AmpProperty *prop = (AmpProperty *)item->data;
+		AmpPropertyInfo *info = (AmpPropertyInfo *)item->data;
 		AnjutaToken *arg;
 		GString *list;
 
-		if ((prop->token_type == ((AmpProperty *)new_prop)->token_type) && (prop->position == ((AmpProperty *)new_prop)->position))
+		if ((info->token_type == ((AmpPropertyInfo *)new_prop->info)->token_type) && (info->position == ((AmpPropertyInfo *)new_prop->info)->position))
 		{
-			if (prop->base.type != ANJUTA_PROJECT_PROPERTY_MAP)
+			if (info->base.type != ANJUTA_PROJECT_PROPERTY_MAP)
 			{
 				/* Replace property */
 				AnjutaProjectProperty *old_prop;
 
-				old_prop = anjuta_project_node_remove_property (node, (AnjutaProjectProperty *)prop);
-				if (old_prop != NULL)
+				old_prop = anjuta_project_node_get_map_property (node, info->base.id, new_prop->name);
+				if ((old_prop != NULL) && (old_prop->info->property != old_prop))
 				{
+					anjuta_project_node_remove_property (node, old_prop);
 					amp_property_free (old_prop);
 				}
 			}
-			anjuta_project_node_insert_property (node, (AnjutaProjectProperty *)prop, new_prop);
-
-			switch (prop->base.type)
+			switch (info->base.type)
 			{
 			case  ANJUTA_PROJECT_PROPERTY_LIST:
 				/* Re-evaluate token to remove useless space between item */
@@ -1167,22 +1187,23 @@ amp_node_property_add (AnjutaProjectNode *node, AnjutaProjectProperty *new_prop)
 						g_string_append (list, value);
 					}
 				}
-				if (new_prop->value != prop->base.value) g_free (new_prop->value);
+				g_free (new_prop->value);
 				new_prop->value = g_string_free (list, FALSE);
 				break;
 			case ANJUTA_PROJECT_PROPERTY_MAP:
 			case ANJUTA_PROJECT_PROPERTY_STRING:
 				/* Strip leading and trailing space */
-				if (new_prop->value != prop->base.value)
-				{
-					new_prop->value = g_strstrip (new_prop->value);
-				}
+				if (new_prop->value != NULL) new_prop->value = g_strstrip (new_prop->value);
 				break;
 			default:
 				break;
 			}
 
-			set = TRUE;
+			if (g_strcmp0 (new_prop->value, info->base.property->value) != 0)
+			{
+				anjuta_project_node_insert_property (node, (AnjutaProjectPropertyInfo *)info, new_prop);
+				set = TRUE;
+			}
 			break;
 		}
 	}
@@ -1193,13 +1214,14 @@ amp_node_property_add (AnjutaProjectNode *node, AnjutaProjectProperty *new_prop)
 }
 
 AnjutaProjectProperty *
-amp_node_property_set (AnjutaProjectNode *node, AnjutaProjectProperty *prop, const gchar* value)
+amp_node_property_set (AnjutaProjectNode *node, const gchar *id, const gchar* value)
 {
-	AnjutaProjectProperty *new_prop;
+	AnjutaProjectPropertyInfo *info;
 	gchar *name;
+	AnjutaProjectProperty *prop;
 
-
-	if ((value != NULL) && (prop->type == ANJUTA_PROJECT_PROPERTY_MAP))
+	info = anjuta_project_node_get_property_info (node, id);
+	if ((value != NULL) && (info->type == ANJUTA_PROJECT_PROPERTY_MAP))
 	{
 		name = strchr (value, '=');
 		if (name != NULL)
@@ -1215,25 +1237,54 @@ amp_node_property_set (AnjutaProjectNode *node, AnjutaProjectProperty *prop, con
 		name = NULL;
 	}
 
-	new_prop = anjuta_project_node_get_map_property (node, prop, name);
-	if (new_prop != NULL)
+	prop = amp_node_map_property_set (node, id, name, value);
+	g_free (name);
+
+	return prop;
+}
+
+AnjutaProjectProperty *
+amp_node_map_property_set (AnjutaProjectNode *node, const gchar *id, const gchar *name, const gchar* value)
+{
+	AnjutaProjectProperty *new_prop;
+
+	new_prop = anjuta_project_node_get_map_property (node, id, name);
+	if ((new_prop != NULL) && (new_prop->info->property != new_prop))
 	{
-		if (new_prop->native != NULL)
-		{
-			/* Custom property already exist, replace value */
-			if ((new_prop->value != NULL) && (new_prop->value != new_prop->native->value)) g_free (new_prop->value);
-			new_prop->value = g_strdup (value);
-		}
-		else
+		/* Property already exist, replace value */
+		g_free (new_prop->value);
+		new_prop->value = g_strdup (value);
+	}
+	else
+	{
+		/* Add new property */
+		AnjutaProjectPropertyInfo *info;
+
+		info = anjuta_project_node_get_property_info (node, id);
+		new_prop = amp_property_new (name, 0, 0, value, NULL);
+		anjuta_project_node_insert_property (node, info, new_prop);
+	}
+
+	return new_prop;
+}
+
+
+AnjutaProjectPropertyInfo *
+amp_node_get_property_info_from_token (AnjutaProjectNode *node, gint token, gint pos)
+{
+	GList *item;
+
+	for (item = anjuta_project_node_get_properties_info (node); item != NULL; item = g_list_next (item))
+	{
+		AmpPropertyInfo *info = (AmpPropertyInfo *)item->data;
+
+		if ((info->token_type == token) && (info->position == pos))
 		{
-			/* Add new custom property */
-			new_prop = amp_property_new (name, ((AmpProperty *)new_prop)->token_type, ((AmpProperty *)prop)->position, value, NULL);
-			anjuta_project_node_insert_property (node, prop, new_prop);
+			return (AnjutaProjectPropertyInfo *)info;
 		}
 	}
-	g_free (name);
 
-	return new_prop;
+	return NULL;
 }
 
 AnjutaProjectProperty *
@@ -1241,13 +1292,13 @@ amp_node_get_property_from_token (AnjutaProjectNode *node, gint token, gint pos)
 {
 	GList *item;
 
-	for (item = anjuta_project_node_get_native_properties (node); item != NULL; item = g_list_next (item))
+	for (item = anjuta_project_node_get_properties_info (node); item != NULL; item = g_list_next (item))
 	{
-		AmpProperty *prop = (AmpProperty *)item->data;
+		AmpPropertyInfo *info = (AmpPropertyInfo *)item->data;
 
-		if ((prop->token_type == token) && (prop->position == pos))
+		if ((info->token_type == token) && (info->position == pos))
 		{
-			return anjuta_project_node_get_property (node, (AnjutaProjectProperty *)prop);
+			return anjuta_project_node_get_property (node, info->base.id);
 		}
 	}
 
@@ -1285,19 +1336,33 @@ am_node_property_find_flags (AnjutaProjectProperty *prop, const gchar *value, gs
 }
 
 gboolean
-amp_node_property_has_flags (AnjutaProjectNode *node, AnjutaProjectProperty *prop, const gchar *value)
+amp_node_property_has_flags (AnjutaProjectNode *node, const gchar *id, const gchar *value)
 {
-	return am_node_property_find_flags (prop, value, strlen (value)) != NULL ? TRUE : FALSE;
+	AnjutaProjectProperty *prop;
+
+	prop = anjuta_project_node_get_property (node, id);
+	if (prop != NULL)
+	{
+		return am_node_property_find_flags (prop, value, strlen (value)) != NULL ? TRUE : FALSE;
+	}
+	else
+	{
+		return FALSE;
+	}
 }
 
 AnjutaProjectProperty *
-amp_node_property_remove_flags (AnjutaProjectNode *node, AnjutaProjectProperty *prop, const gchar *value)
+amp_node_property_remove_flags (AnjutaProjectNode *node, const gchar *id, const gchar *value)
 {
-	AnjutaProjectProperty *new_prop = NULL;
-	const gchar *found;
+	AnjutaProjectProperty *prop;
+	const gchar *found = NULL;
 	gsize len = strlen (value);
 
-	found = am_node_property_find_flags (prop, value, len);
+	prop = anjuta_project_node_get_property (node, id);
+	if (prop != NULL)
+	{
+		found = am_node_property_find_flags (prop, value, len);
+	}
 
 	if (found != NULL)
 	{
@@ -1324,7 +1389,7 @@ amp_node_property_remove_flags (AnjutaProjectNode *node, AnjutaProjectProperty *
 
 		if (new_len == 0)
 		{
-			new_prop = amp_node_property_set (node, prop, NULL);
+			prop = amp_node_property_set (node, id, NULL);
 		}
 		else
 		{
@@ -1334,33 +1399,34 @@ amp_node_property_remove_flags (AnjutaProjectNode *node, AnjutaProjectProperty *
 
 			if (found != prop->value) memcpy (new_value, prop->value, found - prop->value);
 			memcpy (new_value + (found - prop->value), found + len, new_len + 1 - (found - prop->value));
-			new_prop = amp_node_property_set (node, prop, new_value);
+			prop = amp_node_property_set (node, id, new_value);
 			g_free (new_value);
 		}
 	}
 
-	return new_prop;
+	return prop;
 }
 
 AnjutaProjectProperty *
-amp_node_property_add_flags (AnjutaProjectNode *node, AnjutaProjectProperty *prop, const gchar *value)
+amp_node_property_add_flags (AnjutaProjectNode *node, const gchar *id, const gchar *value)
 {
-	AnjutaProjectProperty *new_prop;
+	AnjutaProjectProperty *prop;
 
-	if (prop->value == NULL)
+	prop = anjuta_project_node_get_property (node, id);
+	if (prop == NULL)
 	{
-		new_prop = amp_node_property_set (node, prop, value);
+		prop = amp_node_property_set (node, id, value);
 	}
 	else
 	{
 		gchar *new_value;
 
-		new_value = g_strconcat (prop->value, " ", value, NULL);
-		new_prop = amp_node_property_set (node, prop, new_value);
+		new_value = prop->value == NULL ? g_strdup (value) : g_strconcat (prop->value, " ", value, NULL);
+		prop = amp_node_property_set (node, id, new_value);
 		g_free (new_value);
 	}
 
-	return new_prop;
+	return prop;
 }
 
 
diff --git a/plugins/am-project/am-properties.h b/plugins/am-project/am-properties.h
index 7836c0a..34c7369 100644
--- a/plugins/am-project/am-properties.h
+++ b/plugins/am-project/am-properties.h
@@ -28,17 +28,22 @@
 
 G_BEGIN_DECLS
 
+AnjutaProjectPropertyInfo *amp_property_info_new (AnjutaTokenType type, gint position);
+void amp_property_info_free (AnjutaProjectPropertyInfo *prop);
+
 AnjutaProjectProperty *amp_property_new (const gchar *name, AnjutaTokenType type, gint position, const gchar *value, AnjutaToken *token);
 void amp_property_free (AnjutaProjectProperty *prop);
 
 gboolean amp_node_property_load (AnjutaProjectNode *target, gint token_type, gint position, const gchar *value, AnjutaToken *token);
 gboolean amp_node_property_add (AnjutaProjectNode *node, AnjutaProjectProperty *prop);
-AnjutaProjectProperty *amp_node_property_set (AnjutaProjectNode *node, AnjutaProjectProperty *prop, const gchar* value);
+AnjutaProjectPropertyInfo *amp_node_get_property_info_from_token (AnjutaProjectNode *node, gint token, gint pos);
 AnjutaProjectProperty *amp_node_get_property_from_token (AnjutaProjectNode *node, gint token, gint pos);
+AnjutaProjectProperty *amp_node_property_set (AnjutaProjectNode *node, const gchar *id, const gchar* value);
+AnjutaProjectProperty *amp_node_map_property_set (AnjutaProjectNode *node, const gchar *id, const gchar *name, const gchar* value);
 
-gboolean amp_node_property_has_flags (AnjutaProjectNode *node, AnjutaProjectProperty *prop, const gchar *value);
-AnjutaProjectProperty *amp_node_property_remove_flags (AnjutaProjectNode *node, AnjutaProjectProperty *prop, const gchar *value);
-AnjutaProjectProperty *amp_node_property_add_flags (AnjutaProjectNode *node, AnjutaProjectProperty *prop, const gchar *value);
+gboolean amp_node_property_has_flags (AnjutaProjectNode *node, const gchar *id, const gchar *value);
+AnjutaProjectProperty *amp_node_property_remove_flags (AnjutaProjectNode *node, const gchar *id, const gchar *value);
+AnjutaProjectProperty *amp_node_property_add_flags (AnjutaProjectNode *node, const gchar *id, const gchar *value);
 
 GList* amp_get_project_property_list (void);
 GList* amp_get_group_property_list (void);
diff --git a/plugins/am-project/am-writer.c b/plugins/am-project/am-writer.c
index 1311055..aada56e 100644
--- a/plugins/am-project/am-writer.c
+++ b/plugins/am-project/am-writer.c
@@ -45,7 +45,7 @@
 /* Types & Constants
   *---------------------------------------------------------------------------*/
 
-const static gchar* AmpStandardDirectory[] = {"bindir", "sbindir", "libdir", "pkglibdir", "libexecdir", "pkglibexecdir", "datadir", "pkgdatadir", "mandir", "infodir", "docdir", NULL}; 
+const static gchar* AmpStandardDirectory[] = {"bindir", "sbindir", "libdir", "pkglibdir", "libexecdir", "pkglibexecdir", "datadir", "pkgdatadir", "mandir", "infodir", "docdir", NULL};
 
 /* Helper functions
  *---------------------------------------------------------------------------*/
@@ -62,9 +62,9 @@ anjuta_token_find_target_property_position (AmpTargetNode *target,
 	GList *list;
 	AmpGroupNode *group;
 	AnjutaToken *makefile;
-	
+
 	group = AMP_GROUP_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (target), ANJUTA_PROJECT_GROUP));
-	
+
 	/* Try to find a better position */
 
 	/* 1. With the other properties of the target */
@@ -108,9 +108,9 @@ anjuta_token_find_target_property_position (AmpTargetNode *target,
 			}
 		}
 		g_list_free (list);
-	}				
+	}
+
 
-	
 	/* 2. With properties of sibling targets */
 	if (pos == NULL)
 	{
@@ -126,7 +126,7 @@ anjuta_token_find_target_property_position (AmpTargetNode *target,
 		{
 			target_list = anjuta_token_list ((AnjutaToken *)link->data);
 		}
-		
+
 		makefile = amp_group_node_get_make_token_file (group);
 
 		if (makefile != NULL)
@@ -180,11 +180,11 @@ anjuta_token_find_target_property_position (AmpTargetNode *target,
 						}
 					}
 				}
-				
+
 				if (list != NULL)
 				{
 					gsize best = 0;
-				
+
 					for (link = list; link != NULL; link = g_list_next (link))
 					{
 						AnjutaToken *token = (AnjutaToken *)link->data;
@@ -195,7 +195,7 @@ anjuta_token_find_target_property_position (AmpTargetNode *target,
 							token = anjuta_token_list (token);
 							if (token != NULL) existing = anjuta_token_get_type (token);
 						}
-						
+
 						if ((existing >= AM_TOKEN_FIRST_ORDERED_TARGET_MACRO) && (existing <= AM_TOKEN_LAST_ORDERED_TARGET_MACRO))
 						{
 							gsize tpos;
@@ -246,9 +246,9 @@ anjuta_token_find_target_property_position (AmpTargetNode *target,
 	if (pos == NULL)
 	{
 		makefile = amp_group_node_get_makefile_token (group);
-		
+
 		for (pos = anjuta_token_first_item (makefile); (pos != NULL) && (anjuta_token_next_item (pos) != NULL); pos = anjuta_token_next_item (pos));
-		
+
 		after = TRUE;
 	}
 
@@ -260,8 +260,8 @@ anjuta_token_find_target_property_position (AmpTargetNode *target,
 		anjuta_token_append_child (makefile, pos);
 		amp_group_node_update_makefile (group, pos);
 	}
-	
-	
+
+
 	/* Find end of line */
 	if (after)
 	{
@@ -273,7 +273,7 @@ anjuta_token_find_target_property_position (AmpTargetNode *target,
 				pos = anjuta_token_insert_token_list (after, pos,
 					ANJUTA_TOKEN_EOL, "\n",
 					NULL);
-				
+
 				break;
 			}
 			pos = anjuta_token_next (pos);
@@ -288,7 +288,7 @@ anjuta_token_find_target_property_position (AmpTargetNode *target,
 		    NULL);
 	amp_group_node_update_makefile (group, pos);
 
-	
+
 	return pos;
 }
 
@@ -301,7 +301,7 @@ anjuta_token_find_group_property_position (AmpGroupNode *group,
 	GList *list;
 	AnjutaToken *makefile;
 
-	
+
 	/* Try to find a better position */
 
 	/* 1. With the other properties of the group */
@@ -345,15 +345,15 @@ anjuta_token_find_group_property_position (AmpGroupNode *group,
 			}
 		}
 		g_list_free (list);
-	}				
+	}
 
 	/* 2. At the end of the file */
 	if (pos == NULL)
 	{
 		makefile = amp_group_node_get_makefile_token (group);
-		
+
 		for (pos = anjuta_token_first_item (makefile); (pos != NULL) && (anjuta_token_next_item (pos) != NULL); pos = anjuta_token_next_item (pos));
-		
+
 		after = TRUE;
 	}
 
@@ -377,7 +377,7 @@ anjuta_token_find_group_property_position (AmpGroupNode *group,
 				pos = anjuta_token_insert_token_list (after, pos,
 					ANJUTA_TOKEN_EOL, "\n",
 					NULL);
-				
+
 				break;
 			}
 			pos = anjuta_token_next (pos);
@@ -392,7 +392,7 @@ anjuta_token_find_group_property_position (AmpGroupNode *group,
 		    NULL);
 	amp_group_node_update_makefile (group, pos);
 
-	
+
 	return pos;
 }
 
@@ -408,18 +408,18 @@ amp_project_write_config_list (AmpProject *project)
 	static gint output_type[] = {AC_TOKEN_AC_OUTPUT, 0};
 	static gint eol_type[] = {ANJUTA_TOKEN_EOL, ANJUTA_TOKEN_SPACE, ANJUTA_TOKEN_COMMENT, 0};
 	AnjutaToken *configure;
-	
+
 	configure = amp_project_get_configure_token (project);
 	pos = anjuta_token_find_type (configure, 0, output_type);
 	if (pos == NULL)
 	{
 		gint other_type[] = {AC_TOKEN_AC_INIT,
 			AC_TOKEN_PKG_CHECK_MODULES,
-			AC_TOKEN_AC_CONFIG_FILES, 
+			AC_TOKEN_AC_CONFIG_FILES,
 			AC_TOKEN_OBSOLETE_AC_OUTPUT,
 			AC_TOKEN_AC_PREREQ,
 			0};
-			
+
 		pos = anjuta_token_find_type (configure, ANJUTA_TOKEN_SEARCH_LAST, other_type);
 		if (pos == NULL)
 		{
@@ -431,7 +431,7 @@ amp_project_write_config_list (AmpProject *project)
 
 			next = anjuta_token_find_type (pos, ANJUTA_TOKEN_SEARCH_NOT, eol_type);
 		}
-		
+
 	}
 
 	token = anjuta_token_insert_token_list (FALSE, pos,
@@ -440,7 +440,7 @@ amp_project_write_config_list (AmpProject *project)
 	    		ANJUTA_TOKEN_LAST, NULL,
 	    		RIGHT_PAREN, ")",
 	    		NULL);
-	
+
 	return token;
 }
 
@@ -462,14 +462,14 @@ amp_project_write_config_file (AmpProject *project, AnjutaToken *list, gboolean
 	}
 	//fprintf (stdout, "Dump config list after insertion:\n");
 	//anjuta_token_dump (list);
-	
+
 	anjuta_token_style_format (project->ac_space_list, list);
-	
+
 	//fprintf (stdout, "Dump config list after format:\n");
 	//anjuta_token_dump (list);
 
 	amp_project_update_configure (project, list);
-	
+
 	return token;
 }
 
@@ -477,7 +477,7 @@ amp_project_write_config_file (AmpProject *project, AnjutaToken *list, gboolean
 /* Target objects
  *---------------------------------------------------------------------------*/
 
-gboolean 
+gboolean
 amp_group_node_create_token (AmpProject  *project, AmpGroupNode *group, GError **error)
 {
 	GFile *directory;
@@ -489,7 +489,7 @@ amp_group_node_create_token (AmpProject  *project, AmpGroupNode *group, GError *
 	AmpGroupNode *parent;
 	gboolean after;
 	const gchar *name;
-	
+
 	/* Get parent target */
 	parent = AMP_GROUP_NODE (anjuta_project_node_parent_type(ANJUTA_PROJECT_NODE (group), ANJUTA_PROJECT_GROUP));
 	name = anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (group));
@@ -510,7 +510,7 @@ amp_group_node_create_token (AmpProject  *project, AmpGroupNode *group, GError *
 		}
 	}
 	if (sibling == NULL) after = TRUE;
-	
+
 	/* Create directory */
 	g_file_make_directory (directory, NULL, NULL);
 
@@ -527,7 +527,7 @@ amp_group_node_create_token (AmpProject  *project, AmpGroupNode *group, GError *
 	}
 	g_file_replace_contents (makefile, "", 0, NULL, FALSE, G_FILE_CREATE_NONE, NULL, NULL, NULL);
 
-	
+
 	/* Add in configure */
 	list = NULL;
 	if (sibling) list = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_CONFIGURE);
@@ -583,7 +583,7 @@ amp_group_node_create_token (AmpProject  *project, AmpGroupNode *group, GError *
 	else
 	{
 		AnjutaToken *prev;
-		
+
 		prev = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_SUBDIRS);
 		list = anjuta_token_list (prev);
 	}
@@ -601,7 +601,7 @@ amp_group_node_create_token (AmpProject  *project, AmpGroupNode *group, GError *
 		{
 			prev = amp_group_node_get_first_token (AMP_GROUP_NODE (sibling), AM_GROUP_TOKEN_SUBDIRS);
 		}
-		
+
 		token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, name);
 		if (after)
 		{
@@ -615,7 +615,7 @@ amp_group_node_create_token (AmpProject  *project, AmpGroupNode *group, GError *
 		/* Try to use the same style than the current group list */
 		anjuta_token_style_format (style, list);
 		anjuta_token_style_free (style);
-		
+
 		amp_group_node_update_makefile (parent, token);
 
 		amp_group_node_add_token (group, token, AM_GROUP_TOKEN_SUBDIRS);
@@ -623,11 +623,11 @@ amp_group_node_create_token (AmpProject  *project, AmpGroupNode *group, GError *
 
 	tfile = amp_group_node_set_makefile (group, makefile, project);
 	amp_project_add_file (project, makefile, tfile);
-	
+
 	return TRUE;
 }
 
-gboolean 
+gboolean
 amp_group_node_delete_token (AmpProject  *project, AmpGroupNode *group, GError **error)
 {
 	GList *item;
@@ -648,7 +648,7 @@ amp_group_node_delete_token (AmpProject  *project, AmpGroupNode *group, GError *
 		/* Try to use the same style than the current target list */
 		style = anjuta_token_style_new_from_base (project->am_space_list);
 		anjuta_token_style_update (style, list);
-		
+
 		anjuta_token_remove_word (token);
 		anjuta_token_style_format (style, list);
 		anjuta_token_style_free (style);
@@ -658,7 +658,7 @@ amp_group_node_delete_token (AmpProject  *project, AmpGroupNode *group, GError *
 		{
 			anjuta_token_remove_list (anjuta_token_list (list));
 		}
-		
+
 		amp_group_node_update_makefile (AMP_GROUP_NODE (parent), list);
 	}
 
@@ -674,15 +674,15 @@ amp_group_node_delete_token (AmpProject  *project, AmpGroupNode *group, GError *
 		/* Try to use the same style than the current group list */
 		style = anjuta_token_style_new_from_base (project->ac_space_list);
 		anjuta_token_style_update (style, args);
-		
+
 		anjuta_token_remove_word (token);
-		
+
 		anjuta_token_style_format (style, args);
 		anjuta_token_style_free (style);
 
 		amp_project_update_configure (project, args);
-	}	
-	
+	}
+
 	return TRUE;
 }
 
@@ -747,15 +747,15 @@ amp_target_add_in_list (AmpProject *project, AnjutaToken *list, AnjutaProjectNod
 	AnjutaTokenStyle *style;
 	AnjutaToken *token;
 	AmpGroupNode *parent;
-	
+
 	g_return_val_if_fail (list != NULL, NULL);
-	
+
 	/* Get parent target */
 	parent = AMP_GROUP_NODE (anjuta_project_node_parent_type (target, ANJUTA_PROJECT_GROUP));
-	
+
 	style = anjuta_token_style_new_from_base (project->am_space_list);
 	anjuta_token_style_update (style, list);
-		
+
 	token = anjuta_token_new_string (ANJUTA_TOKEN_ARGUMENT | ANJUTA_TOKEN_ADDED, anjuta_project_node_get_name (target));
 	if (after)
 	{
@@ -769,16 +769,16 @@ amp_target_add_in_list (AmpProject *project, AnjutaToken *list, AnjutaProjectNod
 	/* Try to use the same style than the current target list */
 	anjuta_token_style_format (style, list);
 	anjuta_token_style_free (style);
-		
+
 	amp_group_node_update_makefile (parent, token);
 
 	amp_target_node_add_token (AMP_TARGET_NODE (target), ANJUTA_TOKEN_ARGUMENT, token);
-	
+
 	return token;
 }
 
 
-gboolean 
+gboolean
 amp_target_node_create_token (AmpProject  *project, AmpTargetNode *target, GError **error)
 {
 	AnjutaToken *args;
@@ -794,7 +794,7 @@ amp_target_node_create_token (AmpProject  *project, AmpTargetNode *target, GErro
 
 	/* Get parent target */
 	parent = AMP_GROUP_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (target), ANJUTA_PROJECT_GROUP));
-	
+
 	info = (AmpNodeInfo *)amp_project_get_type_info (project, anjuta_project_node_get_full_type (ANJUTA_PROJECT_NODE (target)));
 	name = anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (target));
 
@@ -813,7 +813,7 @@ amp_target_node_create_token (AmpProject  *project, AmpTargetNode *target, GErro
 		}
 	}
 	if (sibling == NULL) after = TRUE;
-	
+
 	/* Add in Makefile.am */
 	targetname = g_strconcat (info->install, "_", info->prefix, NULL);
 
@@ -825,7 +825,7 @@ amp_target_node_create_token (AmpProject  *project, AmpTargetNode *target, GErro
 	{
 		last = amp_target_node_get_token (AMP_TARGET_NODE (sibling), ANJUTA_TOKEN_ARGUMENT);
 
-		if (last != NULL) 
+		if (last != NULL)
 		{
 			AnjutaToken *token = (AnjutaToken *)last->data;
 
@@ -841,7 +841,7 @@ amp_target_node_create_token (AmpProject  *project, AmpTargetNode *target, GErro
 					if (token != NULL)
 					{
 						gchar *value;
-						
+
 						value = anjuta_token_evaluate (token);
 
 						if ((value != NULL) && (strcmp (targetname, value) == 0))
@@ -874,7 +874,7 @@ amp_target_node_create_token (AmpProject  *project, AmpTargetNode *target, GErro
 		}
 	}
 
-	
+
 	if (args == NULL)
 	{
 		args = amp_project_write_target (parent, info->token, targetname, FALSE, NULL);
@@ -899,7 +899,7 @@ amp_target_node_create_token (AmpProject  *project, AmpTargetNode *target, GErro
 	return TRUE;
 }
 
-gboolean 
+gboolean
 amp_target_node_delete_token (AmpProject  *project, AmpTargetNode *target, GList *list, GError **error)
 {
 	GList *item;
@@ -925,7 +925,7 @@ amp_target_node_delete_token (AmpProject  *project, AmpTargetNode *target, GList
 			/* Try to use the same style than the current target list */
 			style = anjuta_token_style_new_from_base (project->am_space_list);
 			anjuta_token_style_update (style, list);
-		
+
 			anjuta_token_remove_word (token);
 			anjuta_token_style_format (style, list);
 			anjuta_token_style_free (style);
@@ -951,7 +951,7 @@ amp_target_node_delete_token (AmpProject  *project, AmpTargetNode *target, GList
 			}
 
 			amp_group_node_update_makefile (parent, list);
-				
+
 			break;
 		case AM_TOKEN__SOURCES:
 		case AM_TOKEN__DATA:
@@ -977,7 +977,7 @@ amp_target_node_delete_token (AmpProject  *project, AmpTargetNode *target, GList
         case AM_TOKEN_TARGET_LDADD:
 			anjuta_token_remove_list (token);
 			amp_group_node_update_makefile (parent, token);
-			break;	
+			break;
 		};
 		amp_target_node_remove_token (target, token);
 	}
@@ -996,39 +996,39 @@ amp_target_node_delete_token (AmpProject  *project, AmpTargetNode *target, GList
 			gint flags;
 			gchar *install = NULL;
 			gboolean same;
-				
+
 			value = anjuta_token_evaluate (anjuta_token_first_word (target_list));
 			/* value can be NULL if we have a list can has just been removed */
 			if (value != NULL) split_automake_variable (value, &flags, &install, NULL);
-	
+
 			same = g_strcmp0 (install, dir) == 0;
 			g_free (value);
 
 			if (same)
 			{
 				/* directory use elsewhere */
-				
+
 				g_free (dir);
 				dir = NULL;
 				break;
 			}
 		}
-				
+
 		if (dir != NULL)
 		{
 			/* Directory is not used anymore, remove variable */
 			gchar* install = g_strconcat (dir, "dir", NULL);
 
-			for (list = anjuta_project_node_get_custom_properties (ANJUTA_PROJECT_NODE(parent)); list != NULL; list = g_list_next (list))
+			for (list = anjuta_project_node_get_properties (ANJUTA_PROJECT_NODE(parent)); list != NULL; list = g_list_next (list))
 			{
 				AmpProperty *prop = (AmpProperty *)list->data;
 
-				if ((prop->token_type == AM_TOKEN_DIR) && 
+				if ((((AmpPropertyInfo *)prop->base.info)->token_type == AM_TOKEN_DIR) &&
 				    (g_strcmp0(prop->base.name, install) == 0))
 				{
 					AnjutaProjectProperty *new_prop;
 
-					new_prop = amp_node_property_set (ANJUTA_PROJECT_NODE (parent), (AnjutaProjectProperty *)prop, NULL);
+					new_prop = amp_node_map_property_set (ANJUTA_PROJECT_NODE (parent), prop->base.info->id, prop->base.name, NULL);
 					amp_project_update_am_property (project, ANJUTA_PROJECT_NODE (parent), new_prop);
 				}
 			}
@@ -1037,8 +1037,8 @@ amp_target_node_delete_token (AmpProject  *project, AmpTargetNode *target, GList
 		}
 	}
 	g_list_free (removed_dir);
-		
-	
+
+
 	return TRUE;
 }
 
@@ -1051,7 +1051,7 @@ amp_target_node_delete_token (AmpProject  *project, AmpTargetNode *target, GList
 /* Source objects
  *---------------------------------------------------------------------------*/
 
-gboolean 
+gboolean
 amp_source_node_create_token (AmpProject  *project, AmpSourceNode *source, GError **error)
 {
 	AmpGroupNode *group;
@@ -1066,10 +1066,10 @@ amp_source_node_create_token (AmpProject  *project, AmpSourceNode *source, GErro
 	/* Get parent target */
 	target = AMP_TARGET_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (source), ANJUTA_PROJECT_TARGET));
 	if (target == NULL) return FALSE;
-	
+
 	group = AMP_GROUP_NODE (anjuta_project_node_parent_type (ANJUTA_PROJECT_NODE (target), ANJUTA_PROJECT_GROUP));
 	relative_name = get_relative_path (anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (group)), anjuta_project_node_get_file (ANJUTA_PROJECT_NODE (source)));
-	
+
 	/* Add in Makefile.am */
 	/* Find a sibling if possible */
 	after = TRUE;
@@ -1130,15 +1130,15 @@ amp_source_node_create_token (AmpProject  *project, AmpSourceNode *source, GErro
 				break;
 			}
 		}
-		
+
 	}
-	
+
 	if (args == NULL)
 	{
 		gchar *target_var;
 		gchar *canon_name;
 		AnjutaToken *var;
-		
+
 		canon_name = canonicalize_automake_variable (anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (target)));
 		target_var = g_strconcat (canon_name,  "_SOURCES", NULL);
 
@@ -1158,7 +1158,7 @@ amp_source_node_create_token (AmpProject  *project, AmpSourceNode *source, GErro
 		args = anjuta_token_last_item (args);
 		g_free (target_var);
 	}
-	
+
 	if (args != NULL)
 	{
 		AnjutaTokenStyle *style;
@@ -1181,14 +1181,14 @@ amp_source_node_create_token (AmpProject  *project, AmpSourceNode *source, GErro
 		anjuta_token_style_free (style);
 
 		amp_group_node_update_makefile (group, token);
-		
+
 		amp_source_node_add_token (source, token);
 	}
 
 	return TRUE;
 }
 
-gboolean 
+gboolean
 amp_source_node_delete_token (AmpProject  *project, AmpSourceNode *source, GError **error)
 {
 	AnjutaProjectNode *group;
@@ -1219,7 +1219,7 @@ amp_source_node_delete_token (AmpProject  *project, AmpSourceNode *source, GErro
 		{
 			anjuta_token_remove_list (anjuta_token_list (list));
 		}
-		
+
 		amp_group_node_update_makefile (AMP_GROUP_NODE (group), list);
 	}
 
@@ -1238,7 +1238,7 @@ amp_property_delete_token (AmpProject  *project, AnjutaToken *token)
 	if (token != NULL)
 	{
 		anjuta_token_remove_list (anjuta_token_list (token));
-		
+
 		updated = TRUE;
 	}
 
@@ -1246,32 +1246,32 @@ amp_property_delete_token (AmpProject  *project, AnjutaToken *token)
 }
 
 static AnjutaToken *
-amp_project_write_property_list (AmpGroupNode *group, AnjutaProjectNode *node, AmpProperty *property)
+amp_project_write_property_list (AmpGroupNode *group, AnjutaProjectNode *node, AmpPropertyInfo *info)
 {
 	AnjutaToken *pos;
 	gchar *name;
-	
+
 	if (anjuta_project_node_get_node_type (node) == ANJUTA_PROJECT_GROUP)
 	{
 		/* Group property */
-		name = g_strdup (property->suffix);
+		name = g_strdup (info->suffix);
 
-		pos = anjuta_token_find_group_property_position (AMP_GROUP_NODE (node), property->token_type);
+		pos = anjuta_token_find_group_property_position (AMP_GROUP_NODE (node), info->token_type);
 	}
 	else
 	{
 		/* Target property */
 		gchar *canon_name;
-		
+
 		canon_name = canonicalize_automake_variable (anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (node)));
-		name = g_strconcat (canon_name, property->suffix, NULL);
+		name = g_strconcat (canon_name, info->suffix, NULL);
 		g_free (canon_name);
-	
-		pos = anjuta_token_find_target_property_position (AMP_TARGET_NODE (node), property->token_type);
+
+		pos = anjuta_token_find_target_property_position (AMP_TARGET_NODE (node), info->token_type);
 	}
-	
+
 	pos = anjuta_token_insert_token_list (FALSE, pos,
-	    		property->token_type, NULL,
+	    		info->token_type, NULL,
 	    		ANJUTA_TOKEN_NAME, name,
 	    		ANJUTA_TOKEN_SPACE, " ",
 	    		ANJUTA_TOKEN_OPERATOR, "=",
@@ -1279,7 +1279,7 @@ amp_project_write_property_list (AmpGroupNode *group, AnjutaProjectNode *node, A
 	    		ANJUTA_TOKEN_LIST, NULL,
 	            ANJUTA_TOKEN_SPACE, " ",
 	    		NULL);
-	
+
 	g_free (name);
 
 	return anjuta_token_last_item (pos);
@@ -1288,14 +1288,14 @@ amp_project_write_property_list (AmpGroupNode *group, AnjutaProjectNode *node, A
 static gint
 compare_property_position (gconstpointer a, gconstpointer b)
 {
-	return ((const AmpProperty *)a)->position - ((const AmpProperty *)b)->position;
+	return ((const AmpPropertyInfo *)a)->position - ((const AmpPropertyInfo *)b)->position;
 }
 
 static AnjutaToken *
 amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 {
 	AnjutaProjectNode *group;
-	GList *props;
+	GList *infos;
 	GList *item;
 	GString *new_name;
 	AmpNodeInfo *info;
@@ -1310,66 +1310,66 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 	group = anjuta_project_node_parent_type (node, ANJUTA_PROJECT_GROUP);
 
 	/* Find all program properties */
-	props = NULL;
-	for (item = anjuta_project_node_get_native_properties (node); item != NULL; item = g_list_next (item))
+	infos = NULL;
+	for (item = anjuta_project_node_get_properties_info (node); item != NULL; item = g_list_next (item))
 	{
-		AmpProperty *prop = (AmpProperty *)item->data;
+		AmpPropertyInfo *info = (AmpPropertyInfo *)item->data;
 
-		if (prop->token_type == AM_TOKEN__PROGRAMS)
+		if (info->token_type == AM_TOKEN__PROGRAMS)
 		{
-			props = g_list_insert_sorted (props, prop, compare_property_position);
+			infos = g_list_insert_sorted (infos, info, compare_property_position);
 		}
 	}
 
 	/* Create new name */
 	new_name = g_string_new (NULL);
-	for (item = props; item != NULL; item = g_list_next (item))
+	for (item = infos; item != NULL; item = g_list_next (item))
 	{
-		AmpProperty *nat_prop = (AmpProperty *)item->data;
-		AmpProperty *cust_prop;
+		AmpPropertyInfo *info = (AmpPropertyInfo *)item->data;
+		AmpProperty *prop;
 
 		/* Check if property is enabled by another property */
-		if (nat_prop->link != NULL)
+		if (info->link != NULL)
 		{
 			AnjutaProjectProperty *en_prop;
 
-			en_prop = anjuta_project_node_get_property (node, (AnjutaProjectProperty *)nat_prop->link);
+			en_prop = anjuta_project_node_get_property (node, info->link->id);
 
 			if ((en_prop->value != NULL) && (*en_prop->value == '1')) continue;
 		}
-		
-		cust_prop = (AmpProperty *)anjuta_project_node_get_property (node, (AnjutaProjectProperty *)nat_prop);
-		if ((cust_prop == nat_prop) || (g_strcmp0 (cust_prop->base.value, nat_prop->base.value) == 0))
+
+		prop = (AmpProperty *)anjuta_project_node_get_property (node, info->base.id);
+		if ((prop == (AmpProperty *)info->base.property) || (g_strcmp0 (prop->base.value, info->base.property->value) == 0))
 		{
 			/* Default value, add only string properties */
-			if (nat_prop->base.type == ANJUTA_PROJECT_PROPERTY_STRING)
+			if (info->base.type == ANJUTA_PROJECT_PROPERTY_STRING)
 			{
-				g_string_append (new_name, nat_prop->suffix);
+				g_string_append (new_name, info->suffix);
 				g_string_append_c (new_name, '_');
 			}
 		}
 		else
 		{
-			switch (nat_prop->base.type)
+			switch (info->base.type)
 			{
 			case ANJUTA_PROJECT_PROPERTY_STRING:
-				if ((nat_prop->flags & AM_PROPERTY_DIRECTORY) &&
-				    (strlen (cust_prop->base.value) > 4) &&
-				    (strcmp (cust_prop->base.value + strlen (cust_prop->base.value) - 3, "dir") == 0))
+				if ((info->flags & AM_PROPERTY_DIRECTORY) &&
+				    (strlen (prop->base.value) > 4) &&
+				    (strcmp (prop->base.value + strlen (prop->base.value) - 3, "dir") == 0))
 				{
 					/* Remove "dir" suffix */
-					g_string_append_len (new_name, cust_prop->base.value, strlen (cust_prop->base.value) - 3);
+					g_string_append_len (new_name, prop->base.value, strlen (prop->base.value) - 3);
 				}
 				else
 				{
-					g_string_append (new_name, cust_prop->base.value);
+					g_string_append (new_name, prop->base.value);
 				}
 				g_string_append_c (new_name, '_');
 				break;
 			case ANJUTA_PROJECT_PROPERTY_BOOLEAN:
-				if ((cust_prop->base.value != NULL) && (g_strcmp0 (cust_prop->base.value, nat_prop->base.value) != 0))
+				if ((prop->base.value != NULL) && (g_strcmp0 (prop->base.value, info->base.property->value) != 0))
 				{
-					g_string_append (new_name, nat_prop->suffix);
+					g_string_append (new_name, info->suffix);
 				}
 				break;
 			default:
@@ -1383,7 +1383,7 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 
 
     // Check if the target already exist.
-	after = TRUE; 
+	after = TRUE;
 	for (item = amp_group_node_get_token (AMP_GROUP_NODE (group), AM_GROUP_TARGET); item != NULL; item = g_list_next (item))
 	{
 		existing_target_list = (AnjutaToken *)item->data;
@@ -1397,7 +1397,7 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 		{
 			GList *list;
 			GList *item;
-			
+
 			list = amp_target_node_get_token (AMP_TARGET_NODE (node), ANJUTA_TOKEN_ARGUMENT);
 			for (item = g_list_first (list); item != NULL; item = g_list_next (item))
 			{
@@ -1416,7 +1416,7 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 				}
 			}
 		}
-		
+
 		if (same)
 		{
 			existing_target_list = anjuta_token_last_item (existing_target_list);
@@ -1434,7 +1434,7 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 
 		/* Add target in already existing list */
 		amp_target_add_in_list (project, existing_target_list, node, after, NULL);
-		
+
 		/* Remove old token */
 		amp_target_node_delete_token (project, AMP_TARGET_NODE (node), token_list, NULL);
 		g_list_free (token_list);
@@ -1480,7 +1480,7 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 				AnjutaToken *sibling = NULL;
 				AnjutaTokenStyle *style;
 				AnjutaToken *token;
-			
+
 				old_target = anjuta_token_evaluate (arg);
 
 				/* Find sibling target */
@@ -1497,11 +1497,11 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 					}
 					after = TRUE;
 				}
-			
+
 				/* More than one target, remove target in list */
 				arg = anjuta_token_remove_word (arg);
 				if (arg != NULL) amp_group_node_update_makefile (AMP_GROUP_NODE (group), arg);
-		
+
 
 				/* Add target in new list */
 				style = anjuta_token_style_new_from_base (project->am_space_list);
@@ -1516,10 +1516,10 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 				/* Try to use the same style than the current target list */
 				anjuta_token_style_format (style, target_list);
 				anjuta_token_style_free (style);
-		
+
 				amp_group_node_update_makefile (AMP_GROUP_NODE (group), token);
 				amp_target_node_add_token (AMP_TARGET_NODE (node), ANJUTA_TOKEN_ARGUMENT, token);
-			
+
 				g_free (old_target);
 
 				update = anjuta_token_list (target_list);
@@ -1530,21 +1530,18 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 
 	/* Add directory variable if needed */
 	target_dir = NULL;
-	for (item = anjuta_project_node_get_custom_properties (node); item != NULL; item = g_list_next (item))
+	for (item = anjuta_project_node_get_properties (node); item != NULL; item = g_list_next (item))
 	{
 		AmpProperty *prop = (AmpProperty *)item->data;
 
-		if ((prop->token_type == AM_TOKEN__PROGRAMS) && (((AmpProperty *)prop->base.native)->flags & AM_PROPERTY_DIRECTORY))
+		if ((((AmpPropertyInfo *)prop->base.info)->token_type == AM_TOKEN__PROGRAMS) && (((AmpPropertyInfo *)prop->base.info)->flags & AM_PROPERTY_DIRECTORY))
 		{
 			target_dir = prop->base.value;
 			if ((strlen (target_dir) <= 3) || (strcmp (target_dir + strlen(target_dir) - 3, "dir") != 0))
 			{
 				target_dir = g_strconcat (target_dir, "dir", NULL);
-				if ((prop->base.native != NULL) && (prop->base.value != prop->base.native->value))
-				{
-					g_free (prop->base.value);
-					prop->base.value = target_dir;
-				}
+				g_free (prop->base.value);
+				prop->base.value = target_dir;
 			}
 			break;
 		}
@@ -1564,14 +1561,14 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
 			}
 		}
 	}
-	
+
 	if (target_dir != NULL)
 	{
-		for (item = anjuta_project_node_get_custom_properties (group); item != NULL; item = g_list_next (item))
+		for (item = anjuta_project_node_get_properties (group); item != NULL; item = g_list_next (item))
 		{
 			AmpProperty *prop = (AmpProperty *)item->data;
 
-			if ((prop->token_type == AM_TOKEN_DIR) && (g_strcmp0 (prop->base.name, target_dir) == 0))
+			if ((((AmpPropertyInfo *)prop->base.info)->token_type == AM_TOKEN_DIR) && (g_strcmp0 (prop->base.name, target_dir) == 0))
 			{
 				/* Find already existing directory variable */
 				target_dir = NULL;
@@ -1590,13 +1587,13 @@ amp_property_rename_target (AmpProject *project, AnjutaProjectNode *node)
         			ANJUTA_TOKEN_SPACE, " ",
     				ANJUTA_TOKEN_LIST, NULL,
         			ANJUTA_TOKEN_SPACE, " ",
-					ANJUTA_TOKEN_EOL, "\n",		                                     	   
+					ANJUTA_TOKEN_EOL, "\n",
     				NULL);
 	}
-	
+
 	g_string_free (new_name, TRUE);
 
-	
+
 	return update;
 }
 
@@ -1605,8 +1602,6 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 	AnjutaProjectNode *group;
 	AnjutaToken *args;
 
-	g_return_val_if_fail (property->native != NULL, FALSE);
-
 	/* Find group  of the property */
 	if (anjuta_project_node_get_node_type (node) == ANJUTA_PROJECT_GROUP)
 	{
@@ -1617,11 +1612,11 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 		group = anjuta_project_node_parent_type (node, ANJUTA_PROJECT_GROUP);
 	}
 
-	if (((property->native->value == NULL) && ((property->value == NULL) || (*property->value == '\0'))) ||
-	    (g_strcmp0 (property->native->value, property->value) == 0))
+	if ((property->value == NULL) ||
+	    (g_strcmp0 (property->info->property->value, property->value) == 0))
 	{
 		/* Remove property */
-		if (((AmpProperty *)property)->token_type == AM_TOKEN__PROGRAMS)
+		if (((AmpPropertyInfo *)property->info)->token_type == AM_TOKEN__PROGRAMS)
 		{
 			/* Properties added in the target name */
 			args = amp_property_rename_target (project, node);
@@ -1631,12 +1626,12 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 			/* Other properties having their own variable */
 			args = amp_property_delete_token (project, ((AmpProperty *)property)->token);
 		}
-		
+
 		anjuta_project_node_remove_property (node, property);
 	}
 	else
 	{
-		if (((AmpProperty *)property)->token_type == AM_TOKEN__PROGRAMS)
+		if (((AmpPropertyInfo *)property->info)->token_type == AM_TOKEN__PROGRAMS)
 		{
 			/* Properties added in the target name */
 			args = amp_property_rename_target (project, node);
@@ -1651,18 +1646,18 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 			AnjutaTokenStyle *style;
 
 			args = ((AmpProperty *)property)->token;
-		
+
 			/* Try to use the same style than the current target list */
 			style = anjuta_token_style_new_from_base (project->am_space_list);
 			anjuta_token_style_update (style, args);
 
 			if (args == NULL)
 			{
-				args = amp_project_write_property_list (AMP_GROUP_NODE (group), node, (AmpProperty *)property->native);
+				args = amp_project_write_property_list (AMP_GROUP_NODE (group), node, (AmpPropertyInfo *)property->info);
 				((AmpProperty *)property)->token = args;
 			}
 
-			switch (property->native->type)
+			switch (property->info->type)
 			{
 			case ANJUTA_PROJECT_PROPERTY_LIST:
 				new_value = g_string_new (property->value);
@@ -1678,7 +1673,7 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 					if (*value == '\0')
 					{
 						AnjutaToken *next;
-					
+
 						next = anjuta_token_next_word (arg);
 						anjuta_token_remove_word (arg);
 						arg = next;
@@ -1687,7 +1682,7 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 					{
 						const gchar *end;
 						gchar *name;
-					
+
 						for (end = value; !isspace (*end) && (*end != '\0'); end++);
 						name = g_strndup (value, end - value);
 
@@ -1695,7 +1690,7 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 						{
 							/* New argument in property list */
 							AnjutaToken *token;
-						
+
 							token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, name);
 							anjuta_token_insert_word_before (args, arg, token);
 						}
@@ -1704,7 +1699,7 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 							arg = anjuta_token_next_word (arg);
 						}
 						value = end;
-					
+
 						if (arg_value != NULL)
 						{
 							if (new_value->len != 0) g_string_append_c (new_value, ' ');
@@ -1719,7 +1714,7 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 					AnjutaToken *token;
 					const gchar *end;
 					gchar *name;
-				
+
 					while (isspace (*value)) value++;
 					if (*value == '\0') break;
 
@@ -1729,18 +1724,18 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 					token = anjuta_token_new_string (ANJUTA_TOKEN_NAME | ANJUTA_TOKEN_ADDED, name);
 
 					anjuta_token_insert_word_before (args, NULL, token);
-				
+
 					if (new_value->len != 0) g_string_append_c (new_value, ' ');
 					g_string_append (new_value, name);
-				
+
 					g_free (name);
 					value = end;
 				}
-					
+
 				anjuta_token_style_format (style, args);
 				anjuta_token_style_free (style);
 
-				if (property->value != property->native->value) g_free (property->value);
+				g_free (property->value);
 				property->value = g_string_free (new_value, FALSE);
 
 				break;
@@ -1754,13 +1749,13 @@ gboolean amp_project_update_am_property (AmpProject *project, AnjutaProjectNode
 					anjuta_token_remove_word (token);
 				}
 				break;
-			default:				
+			default:
 				break;
 			}
 		}
 	}
 
 	if (args != NULL) amp_group_node_update_makefile (AMP_GROUP_NODE (group), args);
-	
+
 	return args != NULL ? TRUE : FALSE;
 }
diff --git a/plugins/am-project/amp-group.c b/plugins/am-project/amp-group.c
index 1e077b7..55aeef5 100644
--- a/plugins/am-project/amp-group.c
+++ b/plugins/am-project/amp-group.c
@@ -641,7 +641,7 @@ static void
 amp_group_node_init (AmpGroupNode *node)
 {
 	node->base.type = ANJUTA_PROJECT_GROUP;
-	node->base.native_properties = amp_get_group_property_list();
+	node->base.properties_info = amp_get_group_property_list();
 	node->base.state = ANJUTA_PROJECT_CAN_ADD_GROUP |
 						ANJUTA_PROJECT_CAN_ADD_TARGET |
 						ANJUTA_PROJECT_CAN_REMOVE |
@@ -671,7 +671,7 @@ amp_group_node_finalize (GObject *object)
 	AmpGroupNode *node = AMP_GROUP_NODE (object);
 	gint i;
 
-	g_list_foreach (node->base.custom_properties, (GFunc)amp_property_free, NULL);
+	g_list_foreach (node->base.properties, (GFunc)amp_property_free, NULL);
 	if (node->tfile) anjuta_token_file_free (node->tfile);
 	if (node->makefile) g_object_unref (node->makefile);
 
diff --git a/plugins/am-project/amp-module.c b/plugins/am-project/amp-module.c
index 877e197..e248d54 100644
--- a/plugins/am-project/amp-module.c
+++ b/plugins/am-project/amp-module.c
@@ -59,7 +59,7 @@ void
 amp_module_node_add_token (AmpModuleNode *module, AnjutaToken *token)
 {
 	gchar *name;
-	
+
 	module->module = token;
 	name = anjuta_token_evaluate (anjuta_token_first_item (token));
 	if (name != NULL)
@@ -125,45 +125,45 @@ amp_module_node_write (AmpNode *node, AmpNode *amp_parent, AmpProject *project,
 	if ((parent != NULL) && (anjuta_project_node_get_node_type (parent) == ANJUTA_PROJECT_TARGET))
 	{
 		AnjutaProjectNode *group = anjuta_project_node_parent (parent);
-		AnjutaProjectProperty *group_cpp;
-		AnjutaProjectProperty *target_cpp;
-		AnjutaProjectProperty *target_lib;
+		AnjutaProjectPropertyInfo *group_cpp;
+		AnjutaProjectPropertyInfo *target_cpp;
+		AnjutaProjectPropertyInfo *target_lib;
 		gchar *lib_flags;
 		gchar *cpp_flags;
 		gint type;
-				
-		group_cpp = amp_node_get_property_from_token (group, AM_TOKEN__CPPFLAGS, 0); 
-					
+
+		group_cpp = amp_node_get_property_info_from_token (group, AM_TOKEN__CPPFLAGS, 0);
+
 		type = anjuta_project_node_get_full_type (parent) & (ANJUTA_PROJECT_ID_MASK | ANJUTA_PROJECT_TYPE_MASK);
 		switch (type)
 		{
 		case ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_PROGRAM:
-			target_lib = amp_node_get_property_from_token (parent, AM_TOKEN_TARGET_LDADD, 0);
+			target_lib = amp_node_get_property_info_from_token (parent, AM_TOKEN_TARGET_LDADD, 0);
 			break;
 		case ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_STATICLIB:
 		case ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_SHAREDLIB:
-			target_lib = amp_node_get_property_from_token (parent, AM_TOKEN_TARGET_LIBADD, 0);
+			target_lib = amp_node_get_property_info_from_token (parent, AM_TOKEN_TARGET_LIBADD, 0);
 			break;
 		default:
 			break;
 		}
-		target_cpp = amp_node_get_property_from_token (parent, AM_TOKEN_TARGET_CPPFLAGS, 0);
+		target_cpp = amp_node_get_property_info_from_token (parent, AM_TOKEN_TARGET_CPPFLAGS, 0);
 
 		lib_flags = g_strconcat ("$(", anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (node)), "_LIBS)", NULL);
 		cpp_flags = g_strconcat ("$(", anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (node)), "_CFLAGS)", NULL);
 
-		if (!amp_node_property_has_flags (group, group_cpp, cpp_flags) && !amp_node_property_has_flags (ANJUTA_PROJECT_NODE (parent), target_cpp, cpp_flags))
+		if (!amp_node_property_has_flags (group, group_cpp->id, cpp_flags) && !amp_node_property_has_flags (ANJUTA_PROJECT_NODE (parent), target_cpp->id, cpp_flags))
 		{
 			AnjutaProjectProperty *prop;
-			prop = amp_node_property_add_flags (group, group_cpp, cpp_flags);
-			amp_project_update_am_property (project, group, prop);				
+			prop = amp_node_property_add_flags (group, group_cpp->id, cpp_flags);
+			amp_project_update_am_property (project, group, prop);
 		}
-					
-		if (!amp_node_property_has_flags (parent, target_lib, lib_flags))
+
+		if (!amp_node_property_has_flags (parent, target_lib->id, lib_flags))
 		{
 			AnjutaProjectProperty *prop;
-			prop = amp_node_property_add_flags (parent, target_lib, lib_flags);
-			amp_project_update_am_property (project, parent, prop);				
+			prop = amp_node_property_add_flags (parent, target_lib->id, lib_flags);
+			amp_project_update_am_property (project, parent, prop);
 		}
 
 		g_free (lib_flags);
@@ -186,23 +186,23 @@ amp_module_node_erase (AmpNode *node, AmpNode *amp_parent, AmpProject *project,
 	{
 		AnjutaProjectNode *group = anjuta_project_node_parent (parent);
 		AnjutaProjectProperty *prop;
-		AnjutaProjectProperty *group_cpp;
-		AnjutaProjectProperty *target_cpp;
-		AnjutaProjectProperty *target_lib;
+		AnjutaProjectPropertyInfo *group_cpp;
+		AnjutaProjectPropertyInfo *target_cpp;
+		AnjutaProjectPropertyInfo *target_lib;
 		gchar *lib_flags;
 		gchar *cpp_flags;
 		gint type;
 
 		lib_flags = g_strconcat ("$(", anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (node)), "_LIBS)", NULL);
 		cpp_flags = g_strconcat ("$(", anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (node)), "_CFLAGS)", NULL);
-				
-		group_cpp = amp_node_get_property_from_token (group, AM_TOKEN__CPPFLAGS, 0); 
-		if (amp_node_property_has_flags (group, group_cpp, cpp_flags))
+
+		group_cpp = amp_node_get_property_info_from_token (group, AM_TOKEN__CPPFLAGS, 0);
+		if (amp_node_property_has_flags (group, group_cpp->id, cpp_flags))
 		{
 			/* Remove flags in group variable if not more target has this module */
 			gboolean used = FALSE;
 			AnjutaProjectNode *target;
-					
+
 			for (target = anjuta_project_node_first_child (ANJUTA_PROJECT_NODE (group)); target != NULL; target = anjuta_project_node_next_sibling (target))
 			{
 				if (anjuta_project_node_get_node_type (target) == ANJUTA_PROJECT_TARGET)
@@ -227,30 +227,30 @@ amp_module_node_erase (AmpNode *node, AmpNode *amp_parent, AmpProject *project,
 			{
 				AnjutaProjectProperty *prop;
 
-				prop = amp_node_property_remove_flags (group, group_cpp, cpp_flags);
+				prop = amp_node_property_remove_flags (group, group_cpp->id, cpp_flags);
 				if (prop != NULL) amp_project_update_am_property (project, group, prop);
 			}
 		}
-					
+
 		type = anjuta_project_node_get_full_type (ANJUTA_PROJECT_NODE (parent)) & (ANJUTA_PROJECT_ID_MASK | ANJUTA_PROJECT_TYPE_MASK);
 		switch (type)
 		{
 		case ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_PROGRAM:
-			target_lib = amp_node_get_property_from_token (parent, AM_TOKEN_TARGET_LDADD, 0);
+			target_lib = amp_node_get_property_info_from_token (parent, AM_TOKEN_TARGET_LDADD, 0);
 			break;
 		case ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_STATICLIB:
 		case ANJUTA_PROJECT_TARGET | ANJUTA_PROJECT_SHAREDLIB:
-			target_lib = amp_node_get_property_from_token (parent, AM_TOKEN_TARGET_LIBADD, 0);
+			target_lib = amp_node_get_property_info_from_token (parent, AM_TOKEN_TARGET_LIBADD, 0);
 			break;
 		default:
 			target_lib = NULL;
 			break;
 		}
-		target_cpp = amp_node_get_property_from_token (parent, AM_TOKEN_TARGET_CPPFLAGS, 0);
+		target_cpp = amp_node_get_property_info_from_token (parent, AM_TOKEN_TARGET_CPPFLAGS, 0);
 
-		prop = amp_node_property_remove_flags (parent, target_cpp, cpp_flags);
+		prop = amp_node_property_remove_flags (parent, target_cpp->id, cpp_flags);
 		if (prop != NULL) amp_project_update_am_property (project, parent, prop);
-		prop = amp_node_property_remove_flags (parent, target_lib, lib_flags);
+		prop = amp_node_property_remove_flags (parent, target_lib->id, lib_flags);
 		if (prop != NULL) amp_project_update_am_property (project, parent, prop);
 
 		g_free (lib_flags);
@@ -281,7 +281,7 @@ static void
 amp_module_node_init (AmpModuleNode *node)
 {
 	node->base.type = ANJUTA_PROJECT_MODULE;
-	node->base.native_properties = amp_get_module_property_list();
+	node->base.properties_info = amp_get_module_property_list();
 	node->base.state = ANJUTA_PROJECT_CAN_ADD_PACKAGE |
 						ANJUTA_PROJECT_CAN_REMOVE;
 	node->module = NULL;
@@ -292,8 +292,8 @@ amp_module_node_finalize (GObject *object)
 {
 	AmpModuleNode *module = AMP_MODULE_NODE (object);
 
-	g_list_foreach (module->base.custom_properties, (GFunc)amp_property_free, NULL);
-	
+	g_list_foreach (module->base.properties, (GFunc)amp_property_free, NULL);
+
 	G_OBJECT_CLASS (amp_module_node_parent_class)->finalize (object);
 }
 
@@ -302,7 +302,7 @@ amp_module_node_class_init (AmpModuleNodeClass *klass)
 {
 	GObjectClass* object_class = G_OBJECT_CLASS (klass);
 	AmpNodeClass* node_class;
-	
+
 	object_class->finalize = amp_module_node_finalize;
 
 	node_class = AMP_NODE_CLASS (klass);
diff --git a/plugins/am-project/amp-object.c b/plugins/am-project/amp-object.c
index 0476ce7..9eeb6dc 100644
--- a/plugins/am-project/amp-object.c
+++ b/plugins/am-project/amp-object.c
@@ -119,7 +119,7 @@ static void
 amp_object_node_init (AmpObjectNode *node)
 {
 	node->base.type = ANJUTA_PROJECT_OBJECT;
-	node->base.native_properties = NULL;
+	node->base.properties_info = NULL;
 	node->base.state = 0;
 }
 
diff --git a/plugins/am-project/amp-package.c b/plugins/am-project/amp-package.c
index 059f550..c7873f1 100644
--- a/plugins/am-project/amp-package.c
+++ b/plugins/am-project/amp-package.c
@@ -105,7 +105,7 @@ amp_package_node_add_token (AmpPackageNode *node, AnjutaToken *token)
 void
 amp_package_node_update_node (AmpPackageNode *node, AmpPackageNode *new_node)
 {
-	g_return_if_fail (new_node != NULL);	
+	g_return_if_fail (new_node != NULL);
 
 	node->token = new_node->token;
 	g_free (node->version);
@@ -122,7 +122,7 @@ amp_package_node_load (AmpNode *node, AmpNode *parent, AmpProject *project, GErr
 	GList* deps;
 	GList* dep;
 	GList* include_dirs = NULL;
-	
+
 	deps = anjuta_pkg_config_list_dependencies (anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (node)),
 	                                            error);
 	for (dep = deps; dep != NULL; dep = g_list_next (dep))
@@ -141,12 +141,12 @@ amp_package_node_load (AmpNode *node, AmpNode *parent, AmpProject *project, GErr
 		g_error_free (*error);
 		*error = NULL;
 	}
-	
+
 	if ((include_dirs = anjuta_pkg_config_get_directories (anjuta_project_node_get_name (ANJUTA_PROJECT_NODE (node)),
 	                                                       TRUE, error)))
 	{
 		GList* include_dir;
-		
+
 		for (include_dir = include_dirs; include_dir != NULL; include_dir = g_list_next (include_dir))
 		{
 			GList* children = NULL;
@@ -168,7 +168,7 @@ amp_package_node_load (AmpNode *node, AmpNode *parent, AmpProject *project, GErr
 		}
 	}
 	anjuta_util_glist_strings_free (include_dirs);
-	
+
 	return TRUE;
 }
 
@@ -208,7 +208,7 @@ static void
 amp_package_node_init (AmpPackageNode *node)
 {
 	node->base.type = ANJUTA_PROJECT_PACKAGE;
-	node->base.native_properties = amp_get_package_property_list();
+	node->base.properties_info = amp_get_package_property_list();
 	node->base.state =  ANJUTA_PROJECT_CAN_REMOVE;
 	node->version = NULL;
 }
@@ -218,8 +218,8 @@ amp_package_node_finalize (GObject *object)
 {
 	AmpPackageNode *node = AMP_PACKAGE_NODE (object);
 
-	g_list_foreach (node->base.custom_properties, (GFunc)amp_property_free, NULL);
-	
+	g_list_foreach (node->base.properties, (GFunc)amp_property_free, NULL);
+
 	G_OBJECT_CLASS (amp_package_node_parent_class)->finalize (object);
 }
 
@@ -228,9 +228,9 @@ amp_package_node_class_init (AmpPackageNodeClass *klass)
 {
 	GObjectClass* object_class = G_OBJECT_CLASS (klass);
 	AmpNodeClass* node_class;
-	
+
 	object_class->finalize = amp_package_node_finalize;
-	
+
 	node_class = AMP_NODE_CLASS (klass);
 	node_class->load = amp_package_node_load;
 	node_class->update = amp_package_node_update;
diff --git a/plugins/am-project/amp-root.c b/plugins/am-project/amp-root.c
index 40c0f03..cebe05d 100644
--- a/plugins/am-project/amp-root.c
+++ b/plugins/am-project/amp-root.c
@@ -85,7 +85,7 @@ static void
 amp_root_node_init (AmpRootNode *node)
 {
 	node->base.base.type = ANJUTA_PROJECT_GROUP;
-	node->base.base.native_properties = amp_get_project_property_list();
+	node->base.base.properties_info = amp_get_project_property_list();
 	node->base.base.state = ANJUTA_PROJECT_CAN_ADD_GROUP |
 						ANJUTA_PROJECT_CAN_ADD_PACKAGE,
 						ANJUTA_PROJECT_CAN_SAVE;
diff --git a/plugins/am-project/amp-source.c b/plugins/am-project/amp-source.c
index e9f3b6e..de3b55c 100644
--- a/plugins/am-project/amp-source.c
+++ b/plugins/am-project/amp-source.c
@@ -148,7 +148,7 @@ static void
 amp_source_node_init (AmpSourceNode *node)
 {
 	node->base.type = ANJUTA_PROJECT_SOURCE;
-	node->base.native_properties = amp_get_source_property_list();
+	node->base.properties_info = amp_get_source_property_list();
 	node->base.state = ANJUTA_PROJECT_CAN_REMOVE;
 	node->token = NULL;
 }
@@ -158,7 +158,7 @@ amp_source_node_finalize (GObject *object)
 {
 	AmpSourceNode *node = AMP_SOURCE_NODE (object);
 
-	g_list_foreach (node->base.custom_properties, (GFunc)amp_property_free, NULL);
+	g_list_foreach (node->base.properties, (GFunc)amp_property_free, NULL);
 	G_OBJECT_CLASS (amp_source_node_parent_class)->finalize (object);
 }
 
diff --git a/plugins/am-project/amp-target.c b/plugins/am-project/amp-target.c
index b3027a6..51987d2 100644
--- a/plugins/am-project/amp-target.c
+++ b/plugins/am-project/amp-target.c
@@ -207,7 +207,7 @@ void
 amp_target_node_set_type (AmpTargetNode *target, AmTokenType type)
 {
 	target->base.type = ANJUTA_PROJECT_TARGET | type;
-	target->base.native_properties = amp_get_target_property_list(type);
+	target->base.properties_info = amp_get_target_property_list(type);
 }
 
 void
@@ -273,11 +273,11 @@ amp_target_changed (AmpTargetNode *node)
 	GList *item;
 	gboolean custom = FALSE;
 
-	for (item = ANJUTA_PROJECT_NODE (node)->custom_properties; item != NULL; item = g_list_next (item))
+	for (item = ANJUTA_PROJECT_NODE (node)->properties; item != NULL; item = g_list_next (item))
 	{
 		AmpProperty *prop = (AmpProperty *)item->data;
 
-		custom = ((AmpProperty *)prop->base.native)->flags & AM_PROPERTY_COMPILATION_FLAG;
+		custom = ((AmpPropertyInfo *)prop->base.info)->flags & AM_PROPERTY_COMPILATION_FLAG;
 		if (custom) break;
 	}
 
@@ -467,11 +467,11 @@ amp_target_node_erase (AmpNode *target, AmpNode *parent, AmpProject *project, GE
 		{
 			GList *item;
 
-			for (item = ANJUTA_PROJECT_NODE (parent)->custom_properties; item != NULL; item = g_list_next (item))
+			for (item = anjuta_project_node_get_properties (ANJUTA_PROJECT_NODE (parent)); item != NULL; item = g_list_next (item))
 			{
 				AmpProperty *prop = (AmpProperty *)item->data;
 
-				if ((prop->token_type == AM_TOKEN_DIR) && (g_strcmp0 (prop->base.name, installdir) == 0))
+				if ((((AmpPropertyInfo *)prop->base.info)->token_type == AM_TOKEN_DIR) && (g_strcmp0 (prop->base.name, installdir) == 0))
 				{
 					/* Remove directory variable */
 					anjuta_token_remove_list (anjuta_token_list (prop->token));
@@ -515,7 +515,7 @@ amp_target_node_finalize (GObject *object)
 {
 	AmpTargetNode *node = AMP_TARGET_NODE (object);
 
-	g_list_foreach (node->base.custom_properties, (GFunc)amp_property_free, NULL);
+	g_list_foreach (node->base.properties, (GFunc)amp_property_free, NULL);
 	tagged_token_list_free (node->tokens);
 	node->tokens = NULL;
 
diff --git a/plugins/am-project/projectparser.c b/plugins/am-project/projectparser.c
index e968c1e..52c8fb8 100644
--- a/plugins/am-project/projectparser.c
+++ b/plugins/am-project/projectparser.c
@@ -80,16 +80,20 @@ list_property (IAnjutaProject *project, AnjutaProjectNode *parent, gint indent)
 
 	value = g_string_new (NULL);
 
-	for (item = anjuta_project_node_get_custom_properties (parent); item != NULL; item = g_list_next (item))
+	for (item = anjuta_project_node_get_properties (parent); item != NULL; item = g_list_next (item))
 	{
 		AnjutaProjectProperty *prop;
-		AnjutaProjectProperty *native;
+		AnjutaProjectPropertyInfo *info;
 		GList *list;
+		gchar *name;
 
 		prop = (AnjutaProjectProperty *)item->data;
-		native = prop->native;
+		info = prop->info;
 
-		switch (prop->type)
+		/* Default property */
+		if (info->property == prop) continue;
+
+		switch (info->type)
 		{
 		case ANJUTA_PROJECT_PROPERTY_STRING:
 		case ANJUTA_PROJECT_PROPERTY_LIST:
@@ -100,11 +104,11 @@ list_property (IAnjutaProject *project, AnjutaProjectNode *parent, gint indent)
 				break;
 		case ANJUTA_PROJECT_PROPERTY_MAP:
 				g_string_assign (value, "");
-				for (list = anjuta_project_node_get_custom_properties (parent); list != NULL; list = g_list_next (list))
+				for (list = anjuta_project_node_get_properties (parent); list != NULL; list = g_list_next (list))
 				{
 					AnjutaProjectProperty *list_prop = (AnjutaProjectProperty *)list->data;
 
-					if (list_prop->native == native)
+					if (list_prop->info == info)
 					{
 						if ((value->len == 0) && (list_prop != prop))
 						{
@@ -116,21 +120,17 @@ list_property (IAnjutaProject *project, AnjutaProjectNode *parent, gint indent)
 						g_string_append_printf (value, "%s = %s", list_prop->name == NULL ? "?" : list_prop->name, list_prop->value == NULL ? "" : list_prop->value);
 					}
 				}
+				if (value->len == 0) continue;
 				break;
 		}
 
-		if (value->len != 0)
+		name = g_strdup (info->name);
+		if (*(name + strlen (name) - 1) == ':')
 		{
-			gchar *name;
-
-			name = g_strdup (native->name);
-			if (*(name + strlen (name) - 1) == ':')
-			{
-				*(name + strlen (name) - 1) = '\0';
-			}
-			print ("%*sPROPERTY (%s): %s", indent * INDENT, "", name, value->str);
-			g_free (name);
+			*(name + strlen (name) - 1) = '\0';
 		}
+		print ("%*sPROPERTY (%s): %s", indent * INDENT, "", name, value->str);
+		g_free (name);
 	}
 
 	g_string_free (value, TRUE);
@@ -360,34 +360,34 @@ compare_name (const gchar *id, const gchar *name)
 		return (*id == '\0') ? miss : -1;
 }
 
-static AnjutaProjectProperty *
+static AnjutaProjectPropertyInfo *
 get_project_property (IAnjutaProject *project, AnjutaProjectNode *parent, const gchar *id)
 {
 	GList *item;
-	AnjutaProjectProperty *prop = NULL;
+	AnjutaProjectPropertyInfo *info = NULL;
 	gint best = G_MAXINT;
 
-	for (item = anjuta_project_node_get_native_properties (parent); item != NULL; item = g_list_next (item))
+	for (item = anjuta_project_node_get_properties_info (parent); item != NULL; item = g_list_next (item))
 	{
 		gint miss;
 
 		/* Find property based on their id */
-		if (strcmp (id, ((AnjutaProjectProperty *)item->data)->id) == 0)
+		if (strcmp (id, ((AnjutaProjectPropertyInfo *)item->data)->id) == 0)
 		{
-			prop = ((AnjutaProjectProperty *)item->data);
+			info = ((AnjutaProjectPropertyInfo *)item->data);
 			break;
 		}
 
 		/* Else use the best name */
-		miss = compare_name (id, ((AnjutaProjectProperty *)item->data)->name);
+		miss = compare_name (id, ((AnjutaProjectPropertyInfo *)item->data)->name);
 		if ((miss >= 0) && (miss < best))
 		{
 			best = miss;
-			prop =  ((AnjutaProjectProperty *)item->data);
+			info =  ((AnjutaProjectPropertyInfo *)item->data);
 		}
 	}
 
-	return prop;
+	return info;
 }
 
 static AnjutaProjectNodeType
@@ -704,14 +704,14 @@ main(int argc, char *argv[])
 		{
 			if (AMP_IS_PROJECT (project))
 			{
-				AnjutaProjectProperty *item;
+				AnjutaProjectPropertyInfo *info;
 
 				node = get_node (project, root, command[1]);
-				item = get_project_property (project, node, command[2]);
-				if (item != NULL)
+				info = get_project_property (project, node, command[2]);
+				if (info != NULL)
 				{
 					gchar *value = g_shell_unquote (command[3], NULL);
-					ianjuta_project_set_property (project, node, item, value, NULL);
+					ianjuta_project_set_property (project, node, info->id, NULL, value, NULL);
 					g_free (value);
 				}
 			}
@@ -721,13 +721,13 @@ main(int argc, char *argv[])
 		{
 			if (AMP_IS_PROJECT (project))
 			{
-				AnjutaProjectProperty *item;
+				AnjutaProjectPropertyInfo *info;
 
 				node = get_node (project, root, command[1]);
-				item = get_project_property (project, node, command[2]);
-				if (item != NULL)
+				info = get_project_property (project, node, command[2]);
+				if (info != NULL)
 				{
-					ianjuta_project_remove_property (project, node, item, NULL);
+					ianjuta_project_remove_property (project, node, info->id, NULL, NULL);
 				}
 			}
 			command += 2;
diff --git a/plugins/am-project/tests/anjuta.lst b/plugins/am-project/tests/anjuta.lst
index ccc4562..9a04f10 100644
--- a/plugins/am-project/tests/anjuta.lst
+++ b/plugins/am-project/tests/anjuta.lst
@@ -1,5 +1,5 @@
 ROOT (): anjuta
-    PROPERTY (Name): anjuta
+    PROPERTY (Name): Anjuta
     PROPERTY (Version): anjuta_version
     PROPERTY (Bug report URL): http://bugzilla.gnome.org/enter_bug.cgi?product=anjuta
     PROPERTY (Package name): anjuta
diff --git a/plugins/am-project/tests/nemiver.lst b/plugins/am-project/tests/nemiver.lst
index 6915425..872fc72 100644
--- a/plugins/am-project/tests/nemiver.lst
+++ b/plugins/am-project/tests/nemiver.lst
@@ -453,6 +453,7 @@ ROOT (): nemiver
             SOURCE (): tests/pointer-deref.cc
         TARGET (): fooprog
             PROPERTY (Do not install): true
+            PROPERTY (Libraries): 
             SOURCE (): tests/fooprog.cc
         TARGET (): templatedvar
             PROPERTY (Do not install): true
diff --git a/plugins/dir-project/dir-node.c b/plugins/dir-project/dir-node.c
index 9c76d71..14f2f4d 100644
--- a/plugins/dir-project/dir-node.c
+++ b/plugins/dir-project/dir-node.c
@@ -45,8 +45,8 @@ dir_root_node_new (GFile *file)
 
 	root = g_object_new (ANJUTA_TYPE_DIR_ROOT_NODE, NULL);
 	root->base.type = ANJUTA_PROJECT_ROOT;
-	root->base.custom_properties = NULL;
-	root->base.native_properties = NULL;
+	root->base.properties = NULL;
+	root->base.properties_info = NULL;
 	root->base.file = g_file_dup (file);
 	root->base.name = NULL;
 
@@ -110,8 +110,8 @@ dir_group_node_new (GFile *file, GObject *emitter)
 
 	group = g_object_new (ANJUTA_TYPE_DIR_GROUP_NODE, NULL);
 	group->base.type = ANJUTA_PROJECT_GROUP;
-	group->base.native_properties = NULL;
-	group->base.custom_properties = NULL;
+	group->base.properties = NULL;
+	group->base.properties_info = NULL;
 	group->base.file = g_object_ref (file);
 	group->base.name = NULL;
 	group->base.state = ANJUTA_PROJECT_CAN_ADD_GROUP |
@@ -158,9 +158,9 @@ static void
 anjuta_dir_group_node_finalize (GObject *object)
 {
 	AnjutaDirGroupNode *node = ANJUTA_DIR_GROUP_NODE (object);
-	
+
 	if (node->monitor != NULL) g_file_monitor_cancel (node->monitor);
-	
+
 	G_OBJECT_CLASS (anjuta_dir_group_node_parent_class)->finalize (object);
 }
 
@@ -168,7 +168,7 @@ static void
 anjuta_dir_group_node_class_init (AnjutaDirGroupNodeClass *klass)
 {
 	GObjectClass* object_class = G_OBJECT_CLASS (klass);
-	
+
 	object_class->finalize = anjuta_dir_group_node_finalize;
 }
 
@@ -187,8 +187,8 @@ dir_object_node_new (GFile *file)
 
 	node = g_object_new (ANJUTA_TYPE_DIR_OBJECT_NODE, NULL);
 	node->base.type = ANJUTA_PROJECT_OBJECT;
-	node->base.native_properties = NULL;
-	node->base.custom_properties = NULL;
+	node->base.properties = NULL;
+	node->base.properties_info = NULL;
 	node->base.name = NULL;
 	node->base.file = g_file_dup (file);
 	node->base.state = ANJUTA_PROJECT_CAN_REMOVE |
@@ -235,8 +235,8 @@ dir_source_node_new (GFile *file)
 
 	source = g_object_new (ANJUTA_TYPE_DIR_SOURCE_NODE, NULL);
 	source->base.type = ANJUTA_PROJECT_SOURCE;
-	source->base.native_properties = NULL;
-	source->base.custom_properties = NULL;
+	source->base.properties = NULL;
+	source->base.properties_info = NULL;
 	source->base.name = NULL;
 	source->base.file = g_file_dup (file);
 	source->base.state = ANJUTA_PROJECT_CAN_REMOVE |
diff --git a/plugins/dir-project/dir-project.c b/plugins/dir-project/dir-project.c
index 535064a..2dfc9e0 100644
--- a/plugins/dir-project/dir-project.c
+++ b/plugins/dir-project/dir-project.c
@@ -53,7 +53,7 @@ struct _DirProject {
 
 	/* shortcut hash tables, mapping id -> GNode from the tree above */
 	GHashTable		*groups;
-	
+
 	/* project files monitors */
 	GHashTable      *monitors;
 
@@ -121,21 +121,21 @@ static AnjutaProjectNode *
 project_node_new (DirProject *project, AnjutaProjectNode *parent, AnjutaProjectNodeType type, GFile *file, const gchar *name, GError **error)
 {
 	AnjutaProjectNode *node = NULL;
-	
+
 	switch (type & ANJUTA_PROJECT_TYPE_MASK) {
 		case ANJUTA_PROJECT_GROUP:
 			if (file == NULL)
 			{
 				if (name == NULL)
 				{
-					g_set_error (error, IANJUTA_PROJECT_ERROR, 
+					g_set_error (error, IANJUTA_PROJECT_ERROR,
 							IANJUTA_PROJECT_ERROR_VALIDATION_FAILED,
 							_("Missing name"));
 				}
 				else
 				{
 					GFile *group_file;
-					
+
 					group_file = g_file_get_child (anjuta_project_node_get_file (parent), name);
 					node = dir_group_node_new (group_file, G_OBJECT (project));
 					g_object_unref (group_file);
@@ -151,14 +151,14 @@ project_node_new (DirProject *project, AnjutaProjectNode *parent, AnjutaProjectN
 			{
 				if (name == NULL)
 				{
-					g_set_error (error, IANJUTA_PROJECT_ERROR, 
+					g_set_error (error, IANJUTA_PROJECT_ERROR,
 							IANJUTA_PROJECT_ERROR_VALIDATION_FAILED,
 							_("Missing name"));
 				}
 				else
 				{
 					GFile *object_file;
-					
+
 					object_file = g_file_get_child (anjuta_project_node_get_file (parent), name);
 					node = dir_object_node_new (object_file);
 					g_object_unref (object_file);
@@ -174,14 +174,14 @@ project_node_new (DirProject *project, AnjutaProjectNode *parent, AnjutaProjectN
 			{
 				if (name == NULL)
 				{
-					g_set_error (error, IANJUTA_PROJECT_ERROR, 
+					g_set_error (error, IANJUTA_PROJECT_ERROR,
 							IANJUTA_PROJECT_ERROR_VALIDATION_FAILED,
 							_("Missing name"));
 				}
 				else
 				{
 					GFile *source_file;
-					
+
 					source_file = g_file_get_child (anjuta_project_node_get_file (parent), name);
 					node = dir_source_node_new (source_file);
 					g_object_unref (source_file);
@@ -204,7 +204,7 @@ project_node_new (DirProject *project, AnjutaProjectNode *parent, AnjutaProjectN
 		node->type = type;
 		node->parent = parent;
 	}
-	
+
 	return node;
 }
 
@@ -217,12 +217,12 @@ dir_pattern_free (DirPattern *pat)
 {
 	if (pat->source != NULL) g_regex_unref (pat->source);
 	g_free (pat->object);
-	
+
     g_slice_free (DirPattern, pat);
 }
 
 /* Create a new pattern matching a directory of a file name in a path */
- 
+
 static DirPattern*
 dir_pattern_new (const gchar *pattern, gboolean reverse)
 {
@@ -241,7 +241,7 @@ dir_pattern_new (const gchar *pattern, gboolean reverse)
 	{
 		pat->match = reverse ? FALSE : TRUE;
 	}
-	
+
 	/* Check if the pattern is local */
 	if (*ptr == '/')
 	{
@@ -252,7 +252,7 @@ dir_pattern_new (const gchar *pattern, gboolean reverse)
 	{
 		g_string_append (regex, "(?:^|\\" G_DIR_SEPARATOR_S ")");
 	}
-	                 
+
 
 	while (*ptr != '\0')
 	{
@@ -365,7 +365,7 @@ dir_pattern_new (const gchar *pattern, gboolean reverse)
 }
 
 /* Read a file containing pattern, the syntax is similar to .gitignore file.
- * 
+ *
  * It is not a regular expression, only * and ? are used as joker.
  * If the name end with / it will match only a directory.
  * If the name starts with / it must be relative to the project directory, so
@@ -402,7 +402,7 @@ dir_push_pattern_list (GList *stack, GFile *dir, GFile *file, gboolean ignore, G
 	for (ptr = content; *ptr != '\0';)
 	{
 		gchar *next;
-		
+
 		next = strchr (ptr, '\n');
 		if (next != NULL) *next = '\0';
 		line++;
@@ -435,7 +435,7 @@ dir_push_pattern_list (GList *stack, GFile *dir, GFile *file, gboolean ignore, G
 	g_free (content);
 
 	list->pattern = g_list_reverse (list->pattern);
-	
+
 	return g_list_prepend (stack, list);
 }
 
@@ -464,7 +464,7 @@ dir_pattern_stack_is_match (GFile *root, GList *stack, GFile *file)
 
 	/* Create name from file */
 	filename = g_file_get_relative_path (root, file);
-	
+
 	directory = g_file_query_file_type (file, G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS, NULL) == G_FILE_TYPE_DIRECTORY;
 	/* Include directories by default */
 	match = directory;
@@ -474,7 +474,7 @@ dir_pattern_stack_is_match (GFile *root, GList *stack, GFile *file)
 	{
 		DirPatternList *pat_list = (DirPatternList *)list->data;
 		GList *node;
-		
+
 		for (node = g_list_first (pat_list->pattern); node != NULL; node = g_list_next (node))
 		{
 			DirPattern *pat = (DirPattern *)node->data;
@@ -502,16 +502,16 @@ dir_pattern_find_file_object (GFile *root, GList *stack, GFile *file)
 	{
 		GList *list;
 		gchar *filename;
-		
+
 		/* Create name from file */
 		filename = g_file_get_relative_path (root, file);
-	
+
 		/* Check all valid patterns */
 		for (list = g_list_last (stack); list != NULL; list = g_list_previous (list))
 		{
 			DirPatternList *pat_list = (DirPatternList *)list->data;
 			GList *node;
-		
+
 			for (node = g_list_first (pat_list->pattern); node != NULL; node = g_list_next (node))
 			{
 				DirPattern *pat = (DirPattern *)node->data;
@@ -522,7 +522,7 @@ dir_pattern_find_file_object (GFile *root, GList *stack, GFile *file)
 				if (g_regex_match (pat->source, filename,  0, NULL))
 				{
 					gchar *objname;
-					
+
 					objname = g_regex_replace (pat->source, filename, -1, 0, pat->object, 0, NULL);
 					object = g_file_get_child (root, objname);
 					g_free (objname);
@@ -614,7 +614,7 @@ dir_project_load_directory_callback (GObject      *source_object,
 
 		/* Check if file is a source */
 		if (!dir_pattern_stack_is_match (root, data->proj->sources, file)) continue;
-		
+
 		if (g_file_query_file_type (file, G_FILE_QUERY_INFO_NONE, NULL) == G_FILE_TYPE_DIRECTORY)
 		{
 			AnjutaProjectNode *group;
@@ -670,7 +670,7 @@ dir_project_load_directory_callback (GObject      *source_object,
 				{
 					parent = data->parent;
 				}
-				
+
 				/* Create a source for files */
 				source = project_node_new (data->proj, NULL, ANJUTA_PROJECT_SOURCE | ANJUTA_PROJECT_PROJECT, file, NULL, NULL);
 				anjuta_project_node_append (parent, source);
@@ -721,7 +721,7 @@ dir_project_load_directory (DirProject *project, AnjutaProjectNode *parent, GErr
 }
 
 static AnjutaProjectNode *
-dir_project_load_root (DirProject *project, GError **error) 
+dir_project_load_root (DirProject *project, GError **error)
 {
 	GFile *source_file;
 	GFile *root_file;
@@ -742,7 +742,7 @@ dir_project_load_root (DirProject *project, GError **error)
 
 	if (g_file_query_file_type (root_file, G_FILE_QUERY_INFO_NONE, NULL) != G_FILE_TYPE_DIRECTORY)
 	{
-		g_set_error (error, IANJUTA_PROJECT_ERROR, 
+		g_set_error (error, IANJUTA_PROJECT_ERROR,
 		             IANJUTA_PROJECT_ERROR_DOESNT_EXIST,
 			   _("Project doesn't exist or invalid path"));
 
@@ -757,14 +757,14 @@ dir_project_load_root (DirProject *project, GError **error)
 	source_file = g_file_new_for_path (SOURCES_FILE);
 	project->sources = dir_push_pattern_list (NULL, g_object_ref (root_file), source_file, FALSE, NULL);
 	g_object_unref (source_file);
-	
+
 	dir_project_load_directory (project, group, NULL);
 
 	return project->root;
 }
 
 AnjutaProjectNode *
-dir_project_load_node (DirProject *project, AnjutaProjectNode *node, GError **error) 
+dir_project_load_node (DirProject *project, AnjutaProjectNode *node, GError **error)
 {
 	if (node == NULL) node = project->root;
 	switch (anjuta_project_node_get_node_type (node))
@@ -785,7 +785,7 @@ foreach_node_save (AnjutaProjectNode *node,
 	gint state = anjuta_project_node_get_state (node);
 	GError *err = NULL;
 	gboolean ret;
-	
+
 	if (state & ANJUTA_PROJECT_MODIFIED)
 	{
 		switch (anjuta_project_node_get_node_type (node))
@@ -821,7 +821,7 @@ dir_project_save_node (DirProject *project, AnjutaProjectNode *node, GError **er
 {
 	/* Save children */
 	anjuta_project_node_foreach (node, G_POST_ORDER, foreach_node_save, project);
-	
+
 	return node;
 }
 
@@ -855,7 +855,7 @@ dir_project_probe (GFile *file,
 	probe = g_file_query_file_type (file, G_FILE_QUERY_INFO_NONE, NULL) == G_FILE_TYPE_DIRECTORY;
 	if (!probe)
 	{
-		g_set_error (error, IANJUTA_PROJECT_ERROR, 
+		g_set_error (error, IANJUTA_PROJECT_ERROR,
 		             IANJUTA_PROJECT_ERROR_DOESNT_EXIST,
 			   _("Project doesn't exist or invalid path"));
 	}
@@ -881,7 +881,7 @@ dir_project_get_node_info (DirProject *project, GError **error)
 	if (info_list == NULL)
 	{
 		AnjutaProjectNodeInfo *node;
-		
+
 		for (node = node_info; node->type != 0; node++)
 		{
 			info_list = g_list_prepend (info_list, node);
@@ -889,7 +889,7 @@ dir_project_get_node_info (DirProject *project, GError **error)
 
 		info_list = g_list_reverse (info_list);
 	}
-	
+
 	return info_list;
 }
 
@@ -898,12 +898,12 @@ find_not_loaded_node (gpointer key, gpointer value, gpointer user_data)
 {
 	AnjutaProjectNode *node = (AnjutaProjectNode *)value;
 	gboolean found;
-	
+
 	found = anjuta_project_node_get_state (node) & (ANJUTA_PROJECT_LOADING | ANJUTA_PROJECT_INCOMPLETE);
 
 	return found;
 }
- 
+
 static gboolean
 dir_project_is_loaded (DirProject *project)
 {
@@ -917,7 +917,7 @@ DirProject *
 dir_project_new (GFile *directory, GError **error)
 {
 	DirProject *project;
-	
+
 	project = DIR_PROJECT (g_object_new (DIR_TYPE_PROJECT, NULL));
 	project->root = dir_root_node_new (directory);
 
@@ -949,7 +949,7 @@ static AnjutaProjectNode *
 iproject_add_node_before (IAnjutaProject *obj, AnjutaProjectNode *parent, AnjutaProjectNode *sibling, AnjutaProjectNodeType type, GFile *file, const gchar *name, GError **error)
 {
 	AnjutaProjectNode *node;
-	
+
 	node = project_node_new (DIR_PROJECT (obj), parent, type, file, name, error);
 	anjuta_project_node_set_state (node, ANJUTA_PROJECT_MODIFIED);
 	anjuta_project_node_insert_before (parent, sibling, node);
@@ -963,7 +963,7 @@ static AnjutaProjectNode *
 iproject_add_node_after (IAnjutaProject *obj, AnjutaProjectNode *parent, AnjutaProjectNode *sibling, AnjutaProjectNodeType type, GFile *file, const gchar *name, GError **error)
 {
 	AnjutaProjectNode *node;
-	
+
 	node = project_node_new (DIR_PROJECT (obj), parent, type, file, name, error);
 	anjuta_project_node_set_state (node, ANJUTA_PROJECT_MODIFIED);
 	anjuta_project_node_insert_after (parent, sibling, node);
@@ -983,22 +983,22 @@ iproject_remove_node (IAnjutaProject *obj, AnjutaProjectNode *node, GError **err
 }
 
 static AnjutaProjectProperty*
-iproject_set_property (IAnjutaProject *obj, AnjutaProjectNode *node, AnjutaProjectProperty *property, const gchar *value, GError **error)
+iproject_set_property (IAnjutaProject *obj, AnjutaProjectNode *node, const gchar *id, const gchar *name, const gchar *value, GError **error)
 {
-	g_set_error (error, IANJUTA_PROJECT_ERROR, 
+	g_set_error (error, IANJUTA_PROJECT_ERROR,
 				IANJUTA_PROJECT_ERROR_NOT_SUPPORTED,
 		_("Project doesn't allow to set properties"));
-		
+
 	return NULL;
 }
 
 static gboolean
-iproject_remove_property (IAnjutaProject *obj, AnjutaProjectNode *node, AnjutaProjectProperty *property, GError **error)
+iproject_remove_property (IAnjutaProject *obj, AnjutaProjectNode *node, const gchar *id, const gchar *name, GError **error)
 {
-	g_set_error (error, IANJUTA_PROJECT_ERROR, 
+	g_set_error (error, IANJUTA_PROJECT_ERROR,
 				IANJUTA_PROJECT_ERROR_NOT_SUPPORTED,
 		_("Project doesn't allow to set properties"));
-		
+
 	return FALSE;
 }
 
@@ -1008,7 +1008,7 @@ iproject_get_root (IAnjutaProject *obj, GError **error)
 	return DIR_PROJECT (obj)->root;
 }
 
-static const GList* 
+static const GList*
 iproject_get_node_info (IAnjutaProject *obj, GError **err)
 {
 	return dir_project_get_node_info (DIR_PROJECT (obj), err);
@@ -1045,7 +1045,7 @@ dir_project_dispose (GObject *object)
 
 	dir_project_unload (DIR_PROJECT (object));
 
-	G_OBJECT_CLASS (parent_class)->dispose (object);	
+	G_OBJECT_CLASS (parent_class)->dispose (object);
 }
 
 static void
@@ -1053,7 +1053,7 @@ dir_project_instance_init (DirProject *project)
 {
 	g_return_if_fail (project != NULL);
 	g_return_if_fail (DIR_IS_PROJECT (project));
-	
+
 	/* project data */
 	project->root = NULL;
 	//project->root_node = NULL;
@@ -1068,7 +1068,7 @@ static void
 dir_project_class_init (DirProjectClass *klass)
 {
 	GObjectClass *object_class;
-	
+
 	parent_class = g_type_class_peek_parent (klass);
 
 	object_class = G_OBJECT_CLASS (klass);
diff --git a/plugins/mk-project/mk-project.c b/plugins/mk-project/mk-project.c
index 27a09cf..eab1c21 100644
--- a/plugins/mk-project/mk-project.c
+++ b/plugins/mk-project/mk-project.c
@@ -206,8 +206,8 @@ mkp_group_new (GFile *file)
 	group->base.file = g_object_ref (file);
 
 	group->base.type = ANJUTA_PROJECT_GROUP;
-	group->base.native_properties = NULL;
-	group->base.custom_properties = NULL;
+	group->base.properties = NULL;
+	group->base.properties_info = NULL;
 	group->base.name = NULL;
 	group->base.state = 0;
 
@@ -314,8 +314,8 @@ mkp_source_new (GFile *file)
 	source = g_object_new (MKP_TYPE_SOURCE, NULL);
 	source->base.file = g_object_ref (file);
 	source->base.type = ANJUTA_PROJECT_SOURCE;
-	source->base.native_properties = NULL;
-	source->base.custom_properties = NULL;
+	source->base.properties = NULL;
+	source->base.properties_info = NULL;
 	source->base.name = NULL;
 	source->base.state = 0;
 
@@ -826,7 +826,7 @@ void
 mkp_project_unload (MkpProject *project)
 {
 	AnjutaProjectNode *node;
-	
+
 	monitors_remove (project);
 
 	/* project data */
@@ -838,7 +838,7 @@ mkp_project_unload (MkpProject *project)
 	{
 		g_object_unref (node);
 	}
-	
+
 	/* shortcut hash tables */
 	if (project->groups) g_hash_table_destroy (project->groups);
 	project->groups = NULL;
@@ -1010,7 +1010,7 @@ iproject_save_node (IAnjutaProject *obj, AnjutaProjectNode *node, GError **err)
 }
 
 static AnjutaProjectProperty *
-iproject_set_property (IAnjutaProject *obj, AnjutaProjectNode *node, AnjutaProjectProperty *property, const gchar *value, GError **error)
+iproject_set_property (IAnjutaProject *obj, AnjutaProjectNode *node, const gchar *id, const gchar *name, const gchar *value, GError **error)
 {
 	g_set_error (error, IANJUTA_PROJECT_ERROR,
 				IANJUTA_PROJECT_ERROR_NOT_SUPPORTED,
@@ -1020,7 +1020,7 @@ iproject_set_property (IAnjutaProject *obj, AnjutaProjectNode *node, AnjutaProje
 }
 
 static gboolean
-iproject_remove_property (IAnjutaProject *obj, AnjutaProjectNode *node, AnjutaProjectProperty *property, GError **error)
+iproject_remove_property (IAnjutaProject *obj, AnjutaProjectNode *node, const gchar *id, const gchar *name, GError **error)
 {
 	g_set_error (error, IANJUTA_PROJECT_ERROR,
 				IANJUTA_PROJECT_ERROR_NOT_SUPPORTED,
diff --git a/plugins/mk-project/mk-rule.c b/plugins/mk-project/mk-rule.c
index 86ee6b6..d5cb751 100644
--- a/plugins/mk-project/mk-rule.c
+++ b/plugins/mk-project/mk-rule.c
@@ -47,8 +47,8 @@ mkp_rule_new (gchar *name, AnjutaToken *token)
     MkpRule *rule = NULL;
 
 	g_return_val_if_fail (name != NULL, NULL);
-	
-	rule = g_slice_new0(MkpRule); 
+
+	rule = g_slice_new0(MkpRule);
 	rule->name = g_strdup (name);
 	rule->rule = token;
 
@@ -61,7 +61,7 @@ mkp_rule_free (MkpRule *rule)
 	g_free (rule->name);
 	g_list_foreach (rule->prerequisite, (GFunc)g_free, NULL);
 	g_list_free (rule->prerequisite);
-	
+
     g_slice_free (MkpRule, rule);
 }
 
@@ -89,9 +89,9 @@ mkp_project_find_dependencies (MkpProject *project, gchar *target, AnjutaProject
 			{
 				gchar *source;
 				GList *dependencies;
-				
+
 				if (rule->part == NULL)
-				{	
+				{
 					/* simple suffix rule */
 					source = g_strconcat (target, rule->name, NULL);
 				}
@@ -113,7 +113,7 @@ mkp_project_find_dependencies (MkpProject *project, gchar *target, AnjutaProject
 						continue;
 					}
 				}
-					
+
 				dependencies = mkp_project_find_dependencies (project, source, parent, backtrack + 1);
 				if (dependencies != NULL)
 				{
@@ -123,7 +123,7 @@ mkp_project_find_dependencies (MkpProject *project, gchar *target, AnjutaProject
 			}
 		}
 	}
-		
+
 	child = g_file_get_child (anjuta_project_node_get_file (parent), target);
 	exist = g_file_query_exists (child, NULL);
 	//g_message ("target =%s= filename =%s=", target, g_file_get_parse_name (child));
@@ -153,7 +153,7 @@ mkp_project_add_rule (MkpProject *project, AnjutaToken *group)
 
 	//fprintf(stdout, "add rule\n");
 	//anjuta_token_dump (group);
-	
+
 	targ = anjuta_token_first_item (group);
 	arg = anjuta_token_next_word (targ);
 	if (anjuta_token_get_type (arg) == MK_TOKEN_DOUBLE_COLON) double_colon = TRUE;
@@ -174,7 +174,7 @@ mkp_project_add_rule (MkpProject *project, AnjutaToken *group)
 				if (anjuta_token_get_type (src) != MK_TOKEN_ORDER)
 				{
 					target = anjuta_token_evaluate (src);
-					
+
 					rule = g_hash_table_lookup (project->rules, target);
 					if (rule == NULL)
 					{
@@ -182,7 +182,7 @@ mkp_project_add_rule (MkpProject *project, AnjutaToken *group)
 						g_hash_table_insert (project->rules, rule->name, rule);
 					}
 					rule->phony = TRUE;
-					
+
 					//g_message ("    with target %s", target);
 					if (target != NULL) g_free (target);
 				}
@@ -224,9 +224,9 @@ mkp_project_add_rule (MkpProject *project, AnjutaToken *group)
 			break;
 		default:
 			target = g_strstrip (anjuta_token_evaluate (arg));
-			if (*target == '\0') break;	
+			if (*target == '\0') break;
 			//g_message ("add rule =%s=", target);
-				
+
 			rule = g_hash_table_lookup (project->rules, target);
 			if (rule == NULL)
 			{
@@ -237,7 +237,7 @@ mkp_project_add_rule (MkpProject *project, AnjutaToken *group)
 			{
 				rule->rule = group;
 			}
-				
+
 			for (src = anjuta_token_first_word (dep); src != NULL; src = anjuta_token_next_word (src))
 			{
 				gchar *src_name = anjuta_token_evaluate (src);
@@ -284,10 +284,10 @@ mkp_project_enumerate_targets (MkpProject *project, AnjutaProjectNode *parent)
 			GString *pattern = g_string_sized_new (16);
 			GList *suffix;
 			GList *src;
-			
+
 			/* Check double suffix rule */
 			suffix = g_hash_table_get_keys (project->suffix);
-			
+
 			for (src = g_list_first (suffix); src != NULL; src = g_list_next (src))
 			{
 				GList *obj;
@@ -321,7 +321,7 @@ mkp_project_enumerate_targets (MkpProject *project, AnjutaProjectNode *parent)
 
 		//g_message ("rule =%s=", rule->name);
 		if (rule->phony || rule->pattern) continue;
-		
+
 		/* Create target */
 		target = MKP_TARGET(mkp_target_new (rule->name, ANJUTA_PROJECT_UNKNOWN));
 		mkp_target_add_token (target, rule->rule);
@@ -331,7 +331,7 @@ mkp_project_enumerate_targets (MkpProject *project, AnjutaProjectNode *parent)
 		prerequisite = anjuta_token_first_word (rule->rule);
 		if (prerequisite != NULL) prerequisite = anjuta_token_next_word (prerequisite);
 		if (prerequisite != NULL) prerequisite = anjuta_token_next_word (prerequisite);
-		
+
 		/* Add prerequisite */
 		for (arg = anjuta_token_first_word (prerequisite); arg != NULL; arg = anjuta_token_next_word (arg))
 		{
@@ -356,8 +356,8 @@ mkp_project_enumerate_targets (MkpProject *project, AnjutaProjectNode *parent)
 				{
 					GFile *src_file;
 					gchar *name;
-					
-					AnjutaProjectNode *parent = target;
+
+					AnjutaProjectNode *parent = (AnjutaProjectNode *)target;
 					while (g_list_next (dependencies) != NULL)
 					{
 						/* Create object nodes */
@@ -385,14 +385,14 @@ mkp_project_enumerate_targets (MkpProject *project, AnjutaProjectNode *parent)
 	}
 }
 
-void 
+void
 mkp_project_init_rules (MkpProject *project)
 {
 	project->rules = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify)mkp_rule_free);
 	project->suffix = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, NULL);
 }
 
-void 
+void
 mkp_project_free_rules (MkpProject *project)
 {
 	if (project->rules) g_hash_table_destroy (project->rules);
diff --git a/plugins/project-manager/dialogs.c b/plugins/project-manager/dialogs.c
index 5dfd2b5..f251c4d 100644
--- a/plugins/project-manager/dialogs.c
+++ b/plugins/project-manager/dialogs.c
@@ -60,7 +60,7 @@ typedef struct _PropertiesTable
 typedef struct _PropertyEntry
 {
 	GtkWidget *entry;
-	AnjutaProjectProperty *property;
+	AnjutaProjectPropertyInfo *info;
 } PropertyEntry;
 
 typedef struct _PropertyValue
@@ -130,13 +130,13 @@ error_dialog (GtkWindow *parent, const gchar *summary, const gchar *msg, ...)
  *---------------------------------------------------------------------------*/
 
 static PropertyEntry*
-pm_property_entry_new (GtkWidget *entry, AnjutaProjectProperty *property)
+pm_property_entry_new (GtkWidget *entry, AnjutaProjectPropertyInfo *info)
 {
 	PropertyEntry *prop;
 
 	prop = g_slice_new0(PropertyEntry);
 	prop->entry = entry;
-	prop->property = property;
+	prop->info = info;
 
 	return prop;
 }
@@ -418,26 +418,19 @@ add_entry (IAnjutaProject *project, AnjutaProjectNode *node, AnjutaProjectProper
 	gchar *tooltip = NULL;
 	gboolean editable = TRUE;
 
-	if (prop->native != NULL)
-	{
-		label = gtk_label_new (_(prop->native->name));
-	}
-	else
-	{
-		label = gtk_label_new (_(prop->name));
-	}
+	label = gtk_label_new (_(prop->info->name));
 
-	editable = prop->flags & ANJUTA_PROJECT_PROPERTY_READ_ONLY ? FALSE : TRUE;
+	editable = prop->info->flags & ANJUTA_PROJECT_PROPERTY_READ_ONLY ? FALSE : TRUE;
 
-	if (prop->detail != NULL)
+	if (prop->info->description != NULL)
 	{
 		if (!editable)
 		{
-			tooltip = g_strconcat (_(prop->detail), _(" This property is not modifiable."), NULL);
+			tooltip = g_strconcat (_(prop->info->description), _(" This property is not modifiable."), NULL);
 		}
 		else
 		{
-			tooltip = g_strdup (_(prop->detail));
+			tooltip = g_strdup (_(prop->info->description));
 		}
 	}
 
@@ -450,7 +443,7 @@ add_entry (IAnjutaProject *project, AnjutaProjectNode *node, AnjutaProjectProper
 	gtk_table_attach (GTK_TABLE (table), label, 0, 1, *position, *position+1,
 			  GTK_FILL, GTK_FILL, 5, 3);
 
-	switch (prop->type)
+	switch (prop->info->type)
 	{
 	case ANJUTA_PROJECT_PROPERTY_STRING:
 	case ANJUTA_PROJECT_PROPERTY_LIST:
@@ -473,13 +466,11 @@ add_entry (IAnjutaProject *project, AnjutaProjectNode *node, AnjutaProjectProper
 	case ANJUTA_PROJECT_PROPERTY_MAP:
 			model = GTK_TREE_MODEL (gtk_list_store_newv (LIST_COLUMNS_NB, column_type));
 
-			if (prop->native != NULL) prop = prop->native;
-
-			for (item = anjuta_project_node_get_custom_properties (node); item != NULL; item = g_list_next (item))
+			for (item = anjuta_project_node_get_properties (node); item != NULL; item = g_list_next (item))
 			{
 				AnjutaProjectProperty *cust_prop = (AnjutaProjectProperty *)item->data;
 
-				if (cust_prop->native == prop)
+				if (cust_prop->info == prop->info)
 				{
 					gtk_list_store_append (GTK_LIST_STORE (model), &iter);
 					gtk_list_store_set (GTK_LIST_STORE (model), &iter,
@@ -680,17 +671,17 @@ update_properties (PropertiesTable *table)
 	/* Display other node properties */
 	single = FALSE;
 
-	for (item = anjuta_project_node_get_native_properties (table->node); item != NULL; item = g_list_next (item))
+	for (item = anjuta_project_node_get_properties_info (table->node); item != NULL; item = g_list_next (item))
 	{
-		AnjutaProjectProperty *valid_prop = (AnjutaProjectProperty *)item->data;
+		AnjutaProjectPropertyInfo *info = (AnjutaProjectPropertyInfo *)item->data;
 
-		if (!(valid_prop->flags & ANJUTA_PROJECT_PROPERTY_HIDDEN))
+		if (!(info->flags & ANJUTA_PROJECT_PROPERTY_HIDDEN))
 		{
 			AnjutaProjectProperty *prop;
 			GtkWidget *entry;
 
-			prop = anjuta_project_node_get_property (table->node, valid_prop);
-			if (prop->native != NULL)
+			prop = anjuta_project_node_get_property (table->node, info->id);
+			if (prop != prop->info->property)
 			{
 				/* This property has been set, display it in the main part */
 				entry = add_entry (table->project->project, table->node, prop, table->main, &main_pos);
@@ -698,14 +689,14 @@ update_properties (PropertiesTable *table)
 			else
 			{
 				/* This property has not been set, hide it by default */
-				entry = add_entry (table->project->project, table->node, valid_prop, table->extra, &extra_pos);
+				entry = add_entry (table->project->project, table->node, info->property, table->extra, &extra_pos);
 				single = TRUE;
 			}
 
 			if (entry != NULL)
 			{
 				table->properties = g_list_prepend (table->properties,
-						pm_property_entry_new (entry, valid_prop));
+						pm_property_entry_new (entry, info));
 			}
 		}
 	}
@@ -740,10 +731,9 @@ on_properties_dialog_response (GtkWidget *dialog,
 			GtkTreeModel *model;
 
 			/* Get property value in node */
-			prop = anjuta_project_node_get_property (table->node, entry->property);
-			if (prop == NULL) prop = entry->property;
+			prop = anjuta_project_node_get_property (table->node, entry->info->id);
 
-			switch (prop->type)
+			switch (prop->info->type)
 			{
 			case ANJUTA_PROJECT_PROPERTY_STRING:
 			case ANJUTA_PROJECT_PROPERTY_LIST:
@@ -755,7 +745,7 @@ on_properties_dialog_response (GtkWidget *dialog,
 						if ((prop->value != NULL) && (*prop->value != '\0'))
 						{
 							/* Remove */
-							ianjuta_project_set_property (table->project->project, table->node, prop, NULL, NULL);
+							ianjuta_project_set_property (table->project->project, table->node, entry->info->id, NULL, NULL, NULL);
 						}
 					}
 					else
@@ -763,7 +753,7 @@ on_properties_dialog_response (GtkWidget *dialog,
 						if (g_strcmp0 (prop->value, text) != 0)
 						{
 							/* Modified */
-							ianjuta_project_set_property (table->project->project, table->node, prop, text, NULL);
+							ianjuta_project_set_property (table->project->project, table->node, entry->info->id, NULL, text, NULL);
 						}
 					}
 				}
@@ -775,7 +765,7 @@ on_properties_dialog_response (GtkWidget *dialog,
 				if (active != (*text == '1'))
 				{
 					/* Modified */
-					ianjuta_project_set_property (table->project->project, table->node, prop, text, NULL);
+					ianjuta_project_set_property (table->project->project, table->node, entry->info->id, NULL, text, NULL);
 				}
 				break;
 			case ANJUTA_PROJECT_PROPERTY_MAP:
@@ -791,7 +781,7 @@ on_properties_dialog_response (GtkWidget *dialog,
 					if ((cust_prop != NULL) && (g_strcmp0 (cust_prop->value, value) != 0))
 					{
 						/* Modified */
-						ianjuta_project_set_property (table->project->project, table->node, cust_prop, value, NULL);
+						ianjuta_project_set_property (table->project->project, table->node, entry->info->id, cust_prop->name, value, NULL);
 					}
 					g_free (value);
 				}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]