diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/DBEntities.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/DBEntities.java
index 4d560f6..975cbe8 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/DBEntities.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/DBEntities.java
@@ -33,6 +33,7 @@
 import org.eclipse.om2m.commons.entities.FlexContainerAnncEntity;
 import org.eclipse.om2m.commons.entities.FlexContainerEntity;
 import org.eclipse.om2m.commons.entities.LabelEntity;
+import org.eclipse.om2m.commons.entities.MgmtObjEntity;
 import org.eclipse.om2m.commons.entities.PollingChannelEntity;
 import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
 import org.eclipse.om2m.commons.entities.SubscriptionEntity;
@@ -432,13 +433,28 @@
 	public static final String LOCAL_RESOURCE_ID = "LOCAL_RESOURCE_ID";
 	public static final String ANNOUNCE_CSE_ID = "ANNOUNCE_CSE_ID";
 
-//	// RegularResource-AccessControlPolicies
-//	public static final String REGULARRESOURCE_ACP_JOIN = "REGULARRESOURCE_ACP_JOIN";
-//	public static final String REGULARRESOURCE_JOINID = "REGULARRESOURCE_JOINID";
-//
-//	// AnnouncedResource-AccessControlPolicies
-//	public static final String ANNOUNCEDRESOURCE_ACP_JOIN = "REGULARRESOURCE_ACP_JOIN";
-//	public static final String ANNOUNCEDRESOURCE_JOINID = "REGULARRESOURCE_JOINID";
+	// Announced MGMT OBJ
+	// AreaNetworkAnncInfo
+	public static final String ANIA_ACP_JOIN = "ANIA_ACP_JOIN";
+	public static final String ANIA_DAC_JOIN = "ANIA_DAC_JOIN";
+	public static final String ANIA_JOIN_ID = "ANIA_JOIN_ID";
+	public static final String ANIA_SUB_JOIN = "ANIA_SUB_JOIN";
+	public static final String ANIA_NOD_JOIN = "ANIA_NOD_JOIN";
+	public static final String ANIA_NODANNC_JOIN = "ANIA_NODANNC_JOIN";
+	// AreaNetworkAnncDeviceInfo
+	public static final String ANDIA_ACP_JOIN = "ANDIA_ACP_JOIN";
+	public static final String ANDIA_DAC_JOIN = "ANDIA_DAC_JOIN";
+	public static final String ANDIA_JOIN_ID = "ANDIA_JOIN_ID";
+	public static final String ANDIA_SUB_JOIN = "ANDIA_SUB_JOIN";
+	public static final String ANDIA_NOD_JOIN = "ANDIA_NOD_JOIN";
+	public static final String ANDIA_NODANNC_JOIN = "ANDIA_NODANNC_JOIN";
+	// AnncDeviceInfo
+	public static final String DVIA_ACP_JOIN = "DVIA_ACP_JOIN";
+	public static final String DVIA_DAC_JOIN = "DVIA_DAC_JOIN";
+	public static final String DVIA_JOIN_ID = "DVIA_JOIN_ID";
+	public static final String DVIA_SUB_JOIN = "DVIA_SUB_JOIN";
+	public static final String DVIA_NOD_JOIN = "DVIA_NOD_JOIN";
+	public static final String DVIA_NODANNC_JOIN = "DVIA_NODANNC_JOIN";
 
 	// DynamicAuthorisationConsultation DAC
 	public static final String DAC_JOINID = "DAC_JOINID";
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/ShortName.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/ShortName.java
index 008f302..37f91d6 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/ShortName.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/constants/ShortName.java
@@ -379,7 +379,7 @@
 	// Attributes for Node
 	public static final String NODE_ID = "ni";
 	public static final String HOSTED_CSE_LINK = "hcl";
-	public static final String HOSTED_APP_LINK = "hapl";
+	public static final String HOSTED_SRV_LINK = "hsl";
 	
 	// Short names for mgmt objects generic attributes
 	public static final String DESCRIPTION = "des";
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkDeviceInfoAnncEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkDeviceInfoAnncEntity.java
new file mode 100644
index 0000000..3bec573
--- /dev/null
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkDeviceInfoAnncEntity.java
@@ -0,0 +1,283 @@
+/*******************************************************************************
+ * Copyright (c) 2013-2016 LAAS-CNRS (www.laas.fr)
+ * 7 Colonel Roche 31077 Toulouse - France
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Initial Contributors:
+ *     Thierry Monteil : Project manager, technical co-manager
+ *     Mahdi Ben Alaya : Technical co-manager
+ *     Samir Medjiah : Technical co-manager
+ *     Khalil Drira : Strategy expert
+ *     Guillaume Garzone : Developer
+ *     François Aïssaoui : Developer
+ *
+ * New contributors :
+ *******************************************************************************/
+package org.eclipse.om2m.commons.entities;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+import org.eclipse.om2m.commons.constants.DBEntities;
+import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
+import org.eclipse.om2m.commons.constants.ShortName;
+import org.eclipse.om2m.commons.resource.AnnouncedMgmtResource;
+import org.eclipse.om2m.commons.resource.AreaNwkDeviceInfoAnnc;
+
+/**
+ * Area Nwk Device Info entity - Specialization of MgmtObj
+ *
+ */
+@Entity(name = ShortName.AREA_NWK_DEVICE_INFO_ANNC)
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class AreaNwkDeviceInfoAnncEntity extends MgmtObjAnncEntity {
+
+	@Column(name = ShortName.DEV_ID)
+	protected String devID;
+	@Column(name = ShortName.DEV_TYPE)
+	protected String devType;
+	@Column(name = ShortName.AREA_NWK_ID)
+	protected String areaNwkId;
+	@Column(name = ShortName.SLEEP_INTERVAL)
+	protected BigInteger sleepInterval;
+	@Column(name = ShortName.SLEEP_DURATION)
+	protected BigInteger sleepDuration;
+	@Column(name = ShortName.STATUS)
+	protected String status;
+	@Column(name = ShortName.LIST_OF_NEIGHBORS)	
+	protected List<String> listOfNeighbors;
+	
+	/** AccessControlPolicies linked to the MgmtObj */
+	@ManyToMany(fetch=FetchType.LAZY)
+	@JoinTable(
+			name = DBEntities.ANDIA_ACP_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.ANDIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.ACP_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<AccessControlPolicyEntity> accessControlPolicies;
+	
+	/** List of DynamicAuthorizationConsultations*/
+	@ManyToMany(fetch=FetchType.LAZY, mappedBy="linkedAreaNwkDeviceInfoEntities")
+	@JoinTable(
+			name = DBEntities.ANDIA_DAC_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.ANDIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.DAC_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<DynamicAuthorizationConsultationEntity> dynamicAuthorizationConsultations;
+	
+	
+	// Database link to Subscriptions
+	@OneToMany(fetch = FetchType.LAZY, targetEntity = SubscriptionEntity.class, mappedBy="parentAndi")
+	@JoinTable(
+			name = DBEntities.ANDIA_SUB_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.ANDIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.SUB_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<SubscriptionEntity> subscriptions;	
+	
+	// Database link to Node
+	@ManyToOne(fetch = FetchType.LAZY, targetEntity = NodeEntity.class)
+	@JoinTable(
+			name = DBEntities.ANDIA_NOD_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.ANDIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.NOD_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected NodeAnncEntity parentNode;
+
+	public AreaNwkDeviceInfoAnncEntity() {
+		this.mgmtDefinition = MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO;
+	}
+	
+	/**
+	 * @return the devID
+	 */
+	public String getDevID() {
+		return devID;
+	}
+
+	/**
+	 * @param devID the devID to set
+	 */
+	public void setDevID(String devID) {
+		this.devID = devID;
+	}
+
+	/**
+	 * @return the devType
+	 */
+	public String getDevType() {
+		return devType;
+	}
+
+	/**
+	 * @param devType the devType to set
+	 */
+	public void setDevType(String devType) {
+		this.devType = devType;
+	}
+
+	/**
+	 * @return the areaNwkId
+	 */
+	public String getAreaNwkId() {
+		return areaNwkId;
+	}
+
+	/**
+	 * @param areaNwkId the areaNwkId to set
+	 */
+	public void setAreaNwkId(String areaNwkId) {
+		this.areaNwkId = areaNwkId;
+	}
+
+	/**
+	 * @return the sleepInterval
+	 */
+	public BigInteger getSleepInterval() {
+		return sleepInterval;
+	}
+
+	/**
+	 * @param sleepInterval the sleepInterval to set
+	 */
+	public void setSleepInterval(BigInteger sleepInterval) {
+		this.sleepInterval = sleepInterval;
+	}
+
+	/**
+	 * @return the sleepDuration
+	 */
+	public BigInteger getSleepDuration() {
+		return sleepDuration;
+	}
+
+	/**
+	 * @param sleepDuration the sleepDuration to set
+	 */
+	public void setSleepDuration(BigInteger sleepDuration) {
+		this.sleepDuration = sleepDuration;
+	}
+
+	/**
+	 * @return the status
+	 */
+	public String getStatus() {
+		return status;
+	}
+
+	/**
+	 * @param status the status to set
+	 */
+	public void setStatus(String status) {
+		this.status = status;
+	}
+
+	/**
+	 * @return the listOfNeighbors
+	 */
+	public List<String> getListOfNeighbors() {
+		if (this.listOfNeighbors == null) {
+			this.listOfNeighbors = new ArrayList<>();
+		}
+		return listOfNeighbors;
+	}
+
+	/**
+	 * @param listOfNeighbors the listOfNeighbors to set
+	 */
+	public void setListOfNeighbors(List<String> listOfNeighbors) {
+		this.listOfNeighbors = listOfNeighbors;
+	}
+
+	/**
+	 * @return the subscriptions
+	 */
+	public List<SubscriptionEntity> getSubscriptions() {
+		if (this.subscriptions == null) {
+			this.subscriptions = new ArrayList<>();
+		}
+		return subscriptions;
+	}
+
+	/**
+	 * @param subscriptions the subscriptions to set
+	 */
+	public void setSubscriptions(List<SubscriptionEntity> subscriptions) {
+		this.subscriptions = subscriptions;
+	}
+
+	/**
+	 * @return the parentNode
+	 */
+	public NodeAnncEntity getParentNode() {
+		return parentNode;
+	}
+
+	/**
+	 * @param parentNode the parentNode to set
+	 */
+	public void setParentNode(NodeAnncEntity parentNode) {
+		this.parentNode = parentNode;
+	}
+	
+	/**
+	 * @return the acps
+	 */
+	public List<AccessControlPolicyEntity> getAccessControlPolicies() {
+		if (this.accessControlPolicies == null) {
+			this.accessControlPolicies = new ArrayList<>();
+		}
+		return accessControlPolicies;
+	}
+
+	/**
+	 * @param acps the acps to set
+	 */
+	public void setAccessControlPolicies(List<AccessControlPolicyEntity> acps) {
+		this.accessControlPolicies = acps;
+	}	
+	
+	
+	@Override
+	public List<DynamicAuthorizationConsultationEntity> getDynamicAuthorizationConsultations() {
+		if (this.dynamicAuthorizationConsultations == null) {
+			this.dynamicAuthorizationConsultations = new ArrayList<>();
+		}
+		return dynamicAuthorizationConsultations;
+	}
+	
+	@Override
+	public void setDynamicAuthorizationConsultations(List<DynamicAuthorizationConsultationEntity> list) {
+		this.dynamicAuthorizationConsultations = list;
+	}
+
+	@Override
+	public void fillFrom(AnnouncedMgmtResource mgmtObj) {
+		super.fillFrom(mgmtObj);
+		AreaNwkDeviceInfoAnnc andi = (AreaNwkDeviceInfoAnnc) mgmtObj;
+		this.devID = andi.getDevID();
+		this.devType = andi.getDevType();
+		this.areaNwkId = andi.getAreaNwkId();
+		this.sleepDuration = andi.getSleepDuration();
+		this.sleepInterval = andi.getSleepInterval();
+		this.status = andi.getStatus();
+		this.listOfNeighbors = andi.getListOfNeighbors();
+	}
+	
+}
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkInfoAnncEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkInfoAnncEntity.java
new file mode 100644
index 0000000..9a3fd28
--- /dev/null
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/AreaNwkInfoAnncEntity.java
@@ -0,0 +1,185 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2017 Orange.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.om2m.commons.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+import org.eclipse.om2m.commons.constants.DBEntities;
+import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
+import org.eclipse.om2m.commons.constants.ShortName;
+import org.eclipse.om2m.commons.resource.AnnouncedMgmtResource;
+import org.eclipse.om2m.commons.resource.AreaNwkInfoAnnc;
+
+/**
+ * Area Network Info Entity - Specialization of MgmtObj
+ *
+ */
+@Entity(name = ShortName.AREA_NWK_INFO_ANNC)
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class AreaNwkInfoAnncEntity extends MgmtObjAnncEntity {
+	
+	@Column(name = ShortName.AREA_NWK_TYPE)
+	protected String areaNwkType;
+	@Column(name = ShortName.LIST_DEVICES)
+	protected List<String> listOfDevices;
+
+	// link to acp
+	// Database link to ACP
+	@ManyToMany(fetch = FetchType.LAZY, targetEntity = AccessControlPolicyEntity.class)
+	@JoinTable(
+			name = DBEntities.ANIA_ACP_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.ANIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.ACP_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<AccessControlPolicyEntity> accessControlPolicies;
+	
+	/** List of DynamicAuthorizationConsultations*/
+	@ManyToMany(fetch=FetchType.LAZY, mappedBy="linkedAreaNwkInfoAnncEntities")
+	@JoinTable(
+			name = DBEntities.ANIA_DAC_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.ANIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.DAC_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<DynamicAuthorizationConsultationEntity> dynamicAuthorizationConsultations;
+
+	// Database link to Subscriptions
+	@OneToMany(fetch = FetchType.LAZY, targetEntity = SubscriptionEntity.class, mappedBy="parentAni")
+	@JoinTable(
+			name = DBEntities.ANIA_SUB_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.ANIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.SUB_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<SubscriptionEntity> subscriptions;
+
+	// Database link to Node
+	@ManyToOne(fetch = FetchType.LAZY, targetEntity = NodeEntity.class)
+	@JoinTable(
+			name = DBEntities.ANIA_NOD_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.ANIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.NOD_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected NodeAnncEntity parentNode;
+
+	/**
+	 * Constructor
+	 */
+	public AreaNwkInfoAnncEntity() {
+		this.mgmtDefinition = MgmtDefinitionTypes.AREA_NWK_INFO;
+	}
+	
+	/**
+	 * @return the areaNwkType
+	 */
+	public String getAreaNwkType() {
+		return areaNwkType;
+	}
+
+	/**
+	 * @param areaNwkType the areaNwkType to set
+	 */
+	public void setAreaNwkType(String areaNwkType) {
+		this.areaNwkType = areaNwkType;
+	}
+
+	/**
+	 * @return the listOfDevices
+	 */
+	public List<String> getListOfDevices() {
+		return listOfDevices;
+	}
+
+	/**
+	 * @param listOfDevices the listOfDevices to set
+	 */
+	public void setListOfDevices(List<String> listOfDevices) {
+		this.listOfDevices = listOfDevices;
+	}
+	
+	/**
+	 * @return the acps
+	 */
+	public List<AccessControlPolicyEntity> getAccessControlPolicies() {
+		if (this.accessControlPolicies == null) {
+			this.accessControlPolicies = new ArrayList<>();
+		}
+		return accessControlPolicies;
+	}
+
+	/**
+	 * @param acps the acps to set
+	 */
+	public void setAccessControlPolicies(List<AccessControlPolicyEntity> acps) {
+		this.accessControlPolicies = acps;
+	}
+
+	/**
+	 * @return the parentNode
+	 */
+	public NodeAnncEntity getParentNode() {
+		return parentNode;
+	}
+
+	/**
+	 * @param parentNode the parentNode to set
+	 */
+	public void setParentNode(NodeAnncEntity parentNode) {
+		this.parentNode = parentNode;
+	}
+
+	/**
+	 * @return the subscriptions
+	 */
+	public List<SubscriptionEntity> getSubscriptions() {
+		if (this.subscriptions == null) {
+			this.subscriptions = new ArrayList<>();
+		}
+		return subscriptions;
+	}
+
+	/**
+	 * @param subscriptions the subscriptions to set
+	 */
+	public void setSubscriptions(List<SubscriptionEntity> subscriptions) {
+		this.subscriptions = subscriptions;
+	}
+	
+
+	@Override
+	public List<DynamicAuthorizationConsultationEntity> getDynamicAuthorizationConsultations() {
+		if (dynamicAuthorizationConsultations == null) {
+			dynamicAuthorizationConsultations = new ArrayList<>();
+		}
+		return dynamicAuthorizationConsultations;
+	}
+	
+	@Override
+	public void setDynamicAuthorizationConsultations(List<DynamicAuthorizationConsultationEntity> list) {
+		this.dynamicAuthorizationConsultations = list;
+	}
+
+	@Override
+	public void fillFrom(AnnouncedMgmtResource mgmtObj) {
+		super.fillFrom(mgmtObj);
+		AreaNwkInfoAnnc ani = (AreaNwkInfoAnnc) mgmtObj;
+		this.areaNwkType = ani.getAreaNwkType();
+		this.listOfDevices = ani.getListOfDevices();
+	}
+	
+}
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/CSEBaseEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/CSEBaseEntity.java
index c4edc98..cd633a8 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/CSEBaseEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/CSEBaseEntity.java
@@ -76,9 +76,8 @@
 	protected String nodeLink;
 
 	
-	
 	/** List of Nodes */
-	@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
+	@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL}, mappedBy="parentCsb")
 	@JoinTable(
 			name=DBEntities.CSB_NOD_CH_JOIN,
 			joinColumns={@JoinColumn(name=DBEntities.CSEB_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
@@ -86,6 +85,15 @@
 			)
 	protected List<NodeEntity> childNodes;
 	
+	/** List of Nodes */
+	@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL}, mappedBy="parentCsb")
+	@JoinTable(
+			name=DBEntities.CSB_NODANNC_CH_JOIN,
+			joinColumns={@JoinColumn(name=DBEntities.CSEB_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
+			inverseJoinColumns={@JoinColumn(name=DBEntities.NODANNC_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)}
+			)
+	protected List<NodeAnncEntity> childAnncNodes;
+	
 	
 	// TODO list of mgmtCmd
 	// TODO list of location policy
@@ -446,6 +454,23 @@
 	public void setChildNodes(List<NodeEntity> childNodes) {
 		this.childNodes = childNodes;
 	}
+	
+	/**
+	 * @return the childNodes
+	 */
+	public List<NodeAnncEntity> getChildAnncNodes() {
+		if (childAnncNodes == null) {
+			childAnncNodes = new ArrayList<NodeAnncEntity>();
+		}
+		return childAnncNodes;
+	}
+
+	/**
+	 * @param childNodes the childNodes to set
+	 */
+	public void setChildAnncNodes(List<NodeAnncEntity> childNodes) {
+		this.childAnncNodes = childNodes;
+	}
 
 	
 	public List<DynamicAuthorizationConsultationEntity> getChildDynamicAuthorizationConsultation() {
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/DeviceInfoAnncEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/DeviceInfoAnncEntity.java
new file mode 100644
index 0000000..e80a73d
--- /dev/null
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/DeviceInfoAnncEntity.java
@@ -0,0 +1,457 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2017 Orange.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.om2m.commons.entities;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+import org.eclipse.om2m.commons.constants.DBEntities;
+import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
+import org.eclipse.om2m.commons.constants.ShortName;
+import org.eclipse.om2m.commons.resource.AnnouncedMgmtResource;
+import org.eclipse.om2m.commons.resource.DeviceInfoAnnc;
+
+/**
+ * Device Info entity - Specialization of MgmtObj
+ *
+ */
+@Entity(name = ShortName.DEVICE_INFO_ANNC)
+@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class DeviceInfoAnncEntity extends MgmtObjAnncEntity {
+
+	@Column(name = ShortName.DEVICE_LABEL)
+	protected String deviceLabel;
+	@Column(name = ShortName.DEVICE_TYPE)
+	protected String deviceType;
+	@Column(name = ShortName.DEVICE_MODEL)
+	protected String model;
+	@Column(name = ShortName.MANUFACTURER)
+	protected String manufacturer;
+
+	@Column(name = ShortName.FW_VERSION)
+	protected String fwVersion;
+	@Column(name = ShortName.SW_VERSION)
+	protected String swVersion;
+	@Column(name = ShortName.HW_VERSION)
+	protected String hwVersion;
+	@Column(name = ShortName.OS_VERSION)
+	protected String osVersion;
+	@Column(name = ShortName.MANUF_DET_LINKS)
+	protected String manufacturerDetailsLink;
+	@Column(name = ShortName.MANUF_DATE)
+	protected String manufacturingDate;
+	@Column(name = ShortName.DEVICE_SUB_MODEL)
+	protected String subModel;
+	@Column(name = ShortName.DEVICE_NAME)
+	protected String deviceName;
+	@Column(name = ShortName.COUNTRY)
+	protected String country;
+	@Column(name = ShortName.LOCATION)
+	protected String location;
+	@Column(name = ShortName.SYS_TIME)
+	protected String systemTime;
+	@Column(name = ShortName.SUPPORT_URL)
+	protected String supportURL;
+	@Column(name = ShortName.PRES_URL)
+	protected String presentationURL;
+	@Column(name = ShortName.PROTOCOL)
+	protected String protocol;
+
+	/** AccessControlPolicies linked to the MgmtObj */
+	@ManyToMany(fetch=FetchType.LAZY)
+	@JoinTable(
+			name = DBEntities.DVIA_ACP_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.DVIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.ACP_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<AccessControlPolicyEntity> accessControlPolicies;
+	
+	/** List of DynamicAuthorizationConsultations*/
+	@ManyToMany(fetch=FetchType.LAZY, mappedBy="linkedDeviceInfoEntities")
+	@JoinTable(
+			name = DBEntities.DVIA_DAC_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.DVIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.DAC_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<DynamicAuthorizationConsultationEntity> dynamicAuthorizationConsultations;
+	
+	// Database link to Subscriptions
+	@OneToMany(fetch = FetchType.LAZY, targetEntity = SubscriptionEntity.class, mappedBy="parentDvi")
+	@JoinTable(
+			name = DBEntities.DVIA_SUB_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.DVIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.SUB_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<SubscriptionEntity> subscriptions;	
+	
+	// Database link to Node
+	@ManyToOne(fetch = FetchType.LAZY, targetEntity = NodeEntity.class)
+	@JoinTable(
+			name = DBEntities.DVIA_NOD_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.DVIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.NOD_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected NodeAnncEntity parentNode;
+
+	public DeviceInfoAnncEntity() {
+		this.mgmtDefinition = MgmtDefinitionTypes.DEVICE_INFO;
+	}
+
+	/**
+	 * @return the subscriptions
+	 */
+	@Override
+	public List<SubscriptionEntity> getSubscriptions() {
+		if (this.subscriptions == null) {
+			this.subscriptions = new ArrayList<>();
+		}
+		return subscriptions;
+	}
+
+	/**
+	 * @param subscriptions the subscriptions to set
+	 */
+	public void setSubscriptions(List<SubscriptionEntity> subscriptions) {
+		this.subscriptions = subscriptions;
+	}
+
+	/**
+	 * @return the parentNode
+	 */
+	@Override
+	public NodeAnncEntity getParentNode() {
+		return parentNode;
+	}
+
+	/**
+	 * @param parentNode the parentNode to set
+	 */
+	@Override
+	public void setParentNode(NodeAnncEntity parentNode) {
+		this.parentNode = parentNode;
+	}
+	
+	/**
+	 * @return the acps
+	 */
+	public List<AccessControlPolicyEntity> getAccessControlPolicies() {
+		if (this.accessControlPolicies == null) {
+			this.accessControlPolicies = new ArrayList<>();
+		}
+		return accessControlPolicies;
+	}
+
+	/**
+	 * @param acps the acps to set
+	 */
+	public void setAccessControlPolicies(List<AccessControlPolicyEntity> acps) {
+		this.accessControlPolicies = acps;
+	}	
+	
+	
+	@Override
+	public List<DynamicAuthorizationConsultationEntity> getDynamicAuthorizationConsultations() {
+		if (this.dynamicAuthorizationConsultations == null) {
+			this.dynamicAuthorizationConsultations = new ArrayList<>();
+		}
+		return dynamicAuthorizationConsultations;
+	}
+	
+	@Override
+	public void setDynamicAuthorizationConsultations(List<DynamicAuthorizationConsultationEntity> list) {
+		this.dynamicAuthorizationConsultations = list;
+	}
+
+	/**
+	 * @return the deviceLabel
+	 */
+	public String getDeviceLabel() {
+		return deviceLabel;
+	}
+
+	/**
+	 * @param deviceLabel the deviceLabel to set
+	 */
+	public void setDeviceLabel(String deviceLabel) {
+		this.deviceLabel = deviceLabel;
+	}
+
+	/**
+	 * @return the deviceType
+	 */
+	public String getDeviceType() {
+		return deviceType;
+	}
+
+	/**
+	 * @param deviceType the deviceType to set
+	 */
+	public void setDeviceType(String deviceType) {
+		this.deviceType = deviceType;
+	}
+
+	/**
+	 * @return the model
+	 */
+	public String getModel() {
+		return model;
+	}
+
+	/**
+	 * @param model the model to set
+	 */
+	public void setModel(String model) {
+		this.model = model;
+	}
+
+	/**
+	 * @return the manufacturer
+	 */
+	public String getManufacturer() {
+		return manufacturer;
+	}
+
+	/**
+	 * @param manufacturer the manufacturer to set
+	 */
+	public void setManufacturer(String manufacturer) {
+		this.manufacturer = manufacturer;
+	}
+
+	/**
+	 * @return the fwVersion
+	 */
+	public String getFwVersion() {
+		return fwVersion;
+	}
+
+	/**
+	 * @param fwVersion the fwVersion to set
+	 */
+	public void setFwVersion(String fwVersion) {
+		this.fwVersion = fwVersion;
+	}
+
+	/**
+	 * @return the swVersion
+	 */
+	public String getSwVersion() {
+		return swVersion;
+	}
+
+	/**
+	 * @param swVersion the swVersion to set
+	 */
+	public void setSwVersion(String swVersion) {
+		this.swVersion = swVersion;
+	}
+
+	/**
+	 * @return the hwVersion
+	 */
+	public String getHwVersion() {
+		return hwVersion;
+	}
+
+	/**
+	 * @param hwVersion the hwVersion to set
+	 */
+	public void setHwVersion(String hwVersion) {
+		this.hwVersion = hwVersion;
+	}
+
+	/**
+	 * @return the osVersion
+	 */
+	public String getOsVersion() {
+		return osVersion;
+	}
+
+	/**
+	 * @param osVersion the osVersion to set
+	 */
+	public void setOsVersion(String osVersion) {
+		this.osVersion = osVersion;
+	}
+
+	/**
+	 * @return the manufacturerDetailsLink
+	 */
+	public String getManufacturerDetailsLink() {
+		return manufacturerDetailsLink;
+	}
+
+	/**
+	 * @param manufacturerDetailsLink the manufacturerDetailsLink to set
+	 */
+	public void setManufacturerDetailsLink(String manufacturerDetailsLink) {
+		this.manufacturerDetailsLink = manufacturerDetailsLink;
+	}
+
+	/**
+	 * @return the manufacturingDate
+	 */
+	public String getManufacturingDate() {
+		return manufacturingDate;
+	}
+
+	/**
+	 * @param manufacturingDate the manufacturingDate to set
+	 */
+	public void setManufacturingDate(String manufacturingDate) {
+		this.manufacturingDate = manufacturingDate;
+	}
+
+	/**
+	 * @return the subModel
+	 */
+	public String getSubModel() {
+		return subModel;
+	}
+
+	/**
+	 * @param subModel the subModel to set
+	 */
+	public void setSubModel(String subModel) {
+		this.subModel = subModel;
+	}
+
+	/**
+	 * @return the deviceName
+	 */
+	public String getDeviceName() {
+		return deviceName;
+	}
+
+	/**
+	 * @param deviceName the deviceName to set
+	 */
+	public void setDeviceName(String deviceName) {
+		this.deviceName = deviceName;
+	}
+
+	/**
+	 * @return the country
+	 */
+	public String getCountry() {
+		return country;
+	}
+
+	/**
+	 * @param country the country to set
+	 */
+	public void setCountry(String country) {
+		this.country = country;
+	}
+
+	/**
+	 * @return the location
+	 */
+	public String getLocation() {
+		return location;
+	}
+
+	/**
+	 * @param location the location to set
+	 */
+	public void setLocation(String location) {
+		this.location = location;
+	}
+
+	/**
+	 * @return the systemTime
+	 */
+	public String getSystemTime() {
+		return systemTime;
+	}
+
+	/**
+	 * @param systemTime the systemTime to set
+	 */
+	public void setSystemTime(String systemTime) {
+		this.systemTime = systemTime;
+	}
+
+	/**
+	 * @return the supportURL
+	 */
+	public String getSupportURL() {
+		return supportURL;
+	}
+
+	/**
+	 * @param supportURL the supportURL to set
+	 */
+	public void setSupportURL(String supportURL) {
+		this.supportURL = supportURL;
+	}
+
+	/**
+	 * @return the presentationURL
+	 */
+	public String getPresentationURL() {
+		return presentationURL;
+	}
+
+	/**
+	 * @param presentationURL the presentationURL to set
+	 */
+	public void setPresentationURL(String presentationURL) {
+		this.presentationURL = presentationURL;
+	}
+
+	/**
+	 * @return the protocol
+	 */
+	public String getProtocol() {
+		return protocol;
+	}
+
+	/**
+	 * @param protocol the protocol to set
+	 */
+	public void setProtocol(String protocol) {
+		this.protocol = protocol;
+	}
+
+	@Override
+	public void fillFrom(AnnouncedMgmtResource mgmtObj) {
+		super.fillFrom(mgmtObj);
+		DeviceInfoAnnc di = (DeviceInfoAnnc) mgmtObj;
+		this.deviceLabel = di.getDeviceLabel();
+		this.deviceType = di.getDeviceType();
+		this.model = di.getModel();
+		this.manufacturer = di.getManufacturer();
+		this.fwVersion = di.getFwVersion();
+		this.swVersion = di.getSwVersion();
+		this.hwVersion = di.getHwVersion();
+		this.osVersion = di.getOsVersion();
+		this.manufacturerDetailsLink = di.getManufacturerDetailsLink();
+		this.manufacturingDate = di.getManufacturingDate();
+		this.subModel = di.getSubModel();
+		this.deviceName = di.getDeviceName();
+		this.country = di.getCountry();
+		this.location = di.getLocation();
+		this.systemTime = di.getSystemTime();
+		this.supportURL = di.getSupportURL();
+		this.presentationURL = di.getPresentationURL();
+		this.protocol = di.getProtocol();
+	}
+	
+}
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/DynamicAuthorizationConsultationEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/DynamicAuthorizationConsultationEntity.java
index 615640a..b64b56b 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/DynamicAuthorizationConsultationEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/DynamicAuthorizationConsultationEntity.java
@@ -222,6 +222,38 @@
 			)
 	private List<AeAnncEntity> linkedAeAnncEntities;
 	
+	@ManyToMany(fetch=FetchType.LAZY)
+	@JoinTable(
+			name = DBEntities.ANDIA_DAC_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.DAC_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.ANDIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	private List<AreaNwkDeviceInfoAnncEntity> linkedAreaNwkDeviceInfoAnncEntities;
+	
+	@ManyToMany(fetch=FetchType.LAZY)
+	@JoinTable(
+			name = DBEntities.ANIA_DAC_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.DAC_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.ANIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	private List<AreaNwkInfoAnncEntity> linkedAreaNwkInfoAnncEntities;
+
+	@ManyToMany(fetch=FetchType.LAZY)
+	@JoinTable(
+			name = DBEntities.DVIA_DAC_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.DAC_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.DVIA_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	private List<DeviceInfoAnncEntity> linkedDeviceInfoAnncEntities;
+	
+	@ManyToMany(fetch=FetchType.LAZY)
+	@JoinTable(
+			name = DBEntities.NODANNC_DAC_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.DAC_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.NODANNC_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	private List<NodeAnncEntity> linkedNodeAnncEntities;
+
 	
 	public List<AccessControlPolicyEntity> getAccessControlPolicies() {
 		if (accessControlPolicyIDs == null) {
@@ -457,12 +489,55 @@
 		this.linkedDeviceInfoEntities = linkedMgmtObjEntities;
 	}
 
-	public List<MgmtObjEntity> getMgmtObjEntities() {
-		List<MgmtObjEntity> ret = new ArrayList<MgmtObjEntity>();
-		ret.addAll(getLinkedAreaNwkInfoEntities());
-		ret.addAll(getLinkedAreaNwkDeviceInfoEntities());
-		ret.addAll(getLinkedDeviceInfoEntities());
-		return ret;
+	/**
+	 * @return the linkedMgmtObjEntities
+	 */
+	public List<AreaNwkDeviceInfoAnncEntity> getLinkedAreaNwkDeviceInfoAnncEntities() {
+		if (linkedAreaNwkDeviceInfoAnncEntities == null) {
+			linkedAreaNwkDeviceInfoAnncEntities = new ArrayList<>();
+		}
+		return linkedAreaNwkDeviceInfoAnncEntities;
+	}
+
+	/**
+	 * @param linkedMgmtObjEntities the linkedMgmtObjEntities to set
+	 */
+	public void setLinkedAreaNwkDeviceInfoAnncEntities(List<AreaNwkDeviceInfoAnncEntity> linkedMgmtObjEntities) {
+		this.linkedAreaNwkDeviceInfoAnncEntities = linkedMgmtObjEntities;
+	}
+
+	/**
+	 * @return the linkedAreaNwkInfoEntities
+	 */
+	public List<AreaNwkInfoAnncEntity> getLinkedAreaNwkInfoAnncEntities() {
+		if(linkedAreaNwkInfoAnncEntities == null) {
+			linkedAreaNwkInfoAnncEntities = new ArrayList<>();
+		}
+		return linkedAreaNwkInfoAnncEntities;
+	}
+
+	/**
+	 * @param linkedAreaNwkInfoEntities the linkedAreaNwkInfoEntities to set
+	 */
+	public void setLinkedAreaNwkInfoAnncEntities(List<AreaNwkInfoAnncEntity> linkedAreaNwkInfoEntities) {
+		this.linkedAreaNwkInfoAnncEntities = linkedAreaNwkInfoEntities;
+	}
+
+	/**
+	 * @return the linkedMgmtObjEntities
+	 */
+	public List<DeviceInfoAnncEntity> getLinkedDeviceInfoAnncEntities() {
+		if (linkedDeviceInfoAnncEntities == null) {
+			linkedDeviceInfoAnncEntities = new ArrayList<>();
+		}
+		return linkedDeviceInfoAnncEntities;
+	}
+
+	/**
+	 * @param linkedMgmtObjEntities the linkedMgmtObjEntities to set
+	 */
+	public void setLinkedDeviceInfoAnncEntities(List<DeviceInfoAnncEntity> linkedMgmtObjEntities) {
+		this.linkedDeviceInfoAnncEntities = linkedMgmtObjEntities;
 	}
 
 	/**
@@ -483,6 +558,23 @@
 	}
 
 	/**
+	 * @return the linkedNodeAnncEntities
+	 */
+	public List<NodeAnncEntity> getLinkedNodeAnncEntities() {
+		if (linkedNodeAnncEntities == null) {
+			linkedNodeAnncEntities = new ArrayList<>();
+		}
+		return linkedNodeAnncEntities;
+	}
+
+	/**
+	 * @param linkedNodeEntities the linkedNodeAnncEntities to set
+	 */
+	public void setLinkedNodeAnncEntities(List<NodeAnncEntity> linkedNodeEntities) {
+		this.linkedNodeAnncEntities = linkedNodeEntities;
+	}
+
+	/**
 	 * @return the linkedRemoteCSEEntities
 	 */
 	public List<RemoteCSEEntity> getLinkedRemoteCSEEntities() {
@@ -586,5 +678,41 @@
 		else if (mgmtDef.equals(MgmtDefinitionTypes.DEVICE_INFO))
 			getLinkedDeviceInfoEntities().remove((DeviceInfoEntity) mgmtObjEntity);
 	}
+
+	public void addMgmtObj(MgmtObjAnncEntity mgmtObjEntity) {
+		BigInteger mgmtDef = mgmtObjEntity.getMgmtDefinition();
+		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
+			getLinkedAreaNwkInfoAnncEntities().add((AreaNwkInfoAnncEntity) mgmtObjEntity);
+		else if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
+			getLinkedAreaNwkDeviceInfoAnncEntities().add((AreaNwkDeviceInfoAnncEntity) mgmtObjEntity);
+		else if (mgmtDef.equals(MgmtDefinitionTypes.DEVICE_INFO))
+			getLinkedDeviceInfoAnncEntities().add((DeviceInfoAnncEntity) mgmtObjEntity);
+	}
+
+	public void removeMgmtObj(MgmtObjAnncEntity mgmtObjEntity) {
+		BigInteger mgmtDef = mgmtObjEntity.getMgmtDefinition();
+		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
+			getLinkedAreaNwkInfoAnncEntities().remove((AreaNwkInfoAnncEntity) mgmtObjEntity);
+		else if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
+			getLinkedAreaNwkDeviceInfoAnncEntities().remove((AreaNwkDeviceInfoAnncEntity) mgmtObjEntity);
+		else if (mgmtDef.equals(MgmtDefinitionTypes.DEVICE_INFO))
+			getLinkedDeviceInfoAnncEntities().remove((DeviceInfoAnncEntity) mgmtObjEntity);
+	}
+
+	public List<MgmtObjEntity> getMgmtObjEntities() {
+		List<MgmtObjEntity> ret = new ArrayList<MgmtObjEntity>();
+		ret.addAll(getLinkedAreaNwkDeviceInfoEntities());
+		ret.addAll(getLinkedAreaNwkInfoEntities());
+		ret.addAll(getLinkedDeviceInfoEntities());
+		return ret;
+	}
+
+	public List<MgmtObjAnncEntity> getMgmtObjAnncEntities() {
+		List<MgmtObjAnncEntity> ret = new ArrayList<MgmtObjAnncEntity>();
+		ret.addAll(getLinkedAreaNwkDeviceInfoAnncEntities());
+		ret.addAll(getLinkedAreaNwkInfoAnncEntities());
+		ret.addAll(getLinkedDeviceInfoAnncEntities());
+		return ret;
+	}
 	
 }
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/FlexContainerAnncEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/FlexContainerAnncEntity.java
index fcc9dcb..42c492f 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/FlexContainerAnncEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/FlexContainerAnncEntity.java
@@ -34,7 +34,6 @@
 	@Column(name="shortName")
 	protected String shortName;
 	
-
 	@Column(name = ShortName.STATETAG)
 	protected BigInteger stateTag;
 	@Column(name = ShortName.CREATOR)
@@ -43,7 +42,9 @@
 	protected String ontologyRef;
 	@Column(name = ShortName.CONTAINER_DEFINITION)
 	protected String containerDefinition;
-	
+	@Column(name=ShortName.NODE_LINK)
+	protected String nodeLink;
+
 	/** List of DynamicAuthorizationConsultations*/
 	@ManyToMany(fetch=FetchType.LAZY, mappedBy="linkedFlexContainerAnncEntities")
 	@JoinTable(
@@ -263,6 +264,12 @@
 		this.parentAeAnnc = parentAeAnnc;
 	}
 
-	
+	public String getNodeLink() {
+		return nodeLink;		
+	}
+
+	public void setNodeLink(String nodeLink) {
+		this.nodeLink = nodeLink;
+	}
 	
 }
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/LabelEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/LabelEntity.java
index 6bbb6db..385cdca 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/LabelEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/LabelEntity.java
@@ -84,15 +84,27 @@
 	@ManyToMany(targetEntity = NodeEntity.class, mappedBy = "labelsEntities")
 	protected List<NodeEntity> linkedNodes;
 	
+	@ManyToMany(targetEntity = NodeAnncEntity.class, mappedBy = "labelsEntities")
+	protected List<NodeAnncEntity> linkedNodesA;
+	
 	@ManyToMany(targetEntity = AreaNwkInfoEntity.class, mappedBy = "labelsEntities")
 	protected List<AreaNwkInfoEntity> linkedAni;
 	
+	@ManyToMany(targetEntity = AreaNwkInfoAnncEntity.class, mappedBy = "labelsEntities")
+	protected List<AreaNwkInfoAnncEntity> linkedAniA;
+	
 	@ManyToMany(targetEntity = AreaNwkDeviceInfoEntity.class, mappedBy = "labelsEntities")
 	protected List<AreaNwkDeviceInfoEntity> linkedAndi;
 	
+	@ManyToMany(targetEntity = AreaNwkDeviceInfoAnncEntity.class, mappedBy = "labelsEntities")
+	protected List<AreaNwkDeviceInfoAnncEntity> linkedAndiA;
+	
 	@ManyToMany(targetEntity = DeviceInfoEntity.class, mappedBy = "labelsEntities")
 	protected List<DeviceInfoEntity> linkedDvi;
 	
+	@ManyToMany(targetEntity = DeviceInfoAnncEntity.class, mappedBy = "labelsEntities")
+	protected List<DeviceInfoAnncEntity> linkedDviA;
+	
 	/**
 	 * @return the linkedSub
 	 */
@@ -323,9 +335,6 @@
 		this.linkedPch = linkedPch;
 	}
 	
-	
-	
-
 	/**
 	 * @return the linkedNode
 	 */
@@ -342,6 +351,23 @@
 	public void setLinkedNodes(List<NodeEntity> linkedNode) {
 		this.linkedNodes = linkedNode;
 	}
+	
+	/**
+	 * @return the linkedNode
+	 */
+	public List<NodeAnncEntity> getLinkedNodesA() {
+		if (this.linkedNodesA == null) {
+			this.linkedNodesA = new ArrayList<>();
+		}
+		return linkedNodesA;
+	}
+
+	/**
+	 * @param linkedNode the linkedNode to set
+	 */
+	public void setLinkedNodesA(List<NodeAnncEntity> linkedNode) {
+		this.linkedNodesA = linkedNode;
+	}
 
 	/**
 	 * @return the linkedAni
@@ -361,6 +387,23 @@
 	}
 
 	/**
+	 * @return the linkedAni
+	 */
+	public List<AreaNwkInfoAnncEntity> getLinkedAniA() {
+		if (this.linkedAniA == null) {
+			this.linkedAniA = new ArrayList<>();
+		}
+		return linkedAniA;
+	}
+
+	/**
+	 * @param linkedAni the linkedAni to set
+	 */
+	public void setLinkedAniA(List<AreaNwkInfoAnncEntity> linkedAni) {
+		this.linkedAniA = linkedAni;
+	}
+
+	/**
 	 * @return the linkedAndi
 	 */
 	public List<AreaNwkDeviceInfoEntity> getLinkedAndi() {
@@ -378,6 +421,23 @@
 	}
 
 	/**
+	 * @return the linkedAndi
+	 */
+	public List<AreaNwkDeviceInfoAnncEntity> getLinkedAndiA() {
+		if (this.linkedAndiA == null) {
+			this.linkedAndiA = new ArrayList<>();
+		}
+		return linkedAndiA;
+	}
+
+	/**
+	 * @param linkedAndi the linkedAndi to set
+	 */
+	public void setLinkedAndiA(List<AreaNwkDeviceInfoAnncEntity> linkedAndi) {
+		this.linkedAndiA = linkedAndi;
+	}
+
+	/**
 	 * @return the linkedDvi
 	 */
 	public List<DeviceInfoEntity> getLinkedDvi() {
@@ -394,6 +454,23 @@
 		this.linkedDvi = linkedDvi;
 	}
 
+	/**
+	 * @return the linkedDvi
+	 */
+	public List<DeviceInfoAnncEntity> getLinkedDviA() {
+		if (this.linkedDviA == null) {
+			this.linkedDviA = new ArrayList<>();
+		}
+		return linkedDviA;
+	}
+
+	/**
+	 * @param linkedDvi the linkedDvi to set
+	 */
+	public void setLinkedDviA(List<DeviceInfoAnncEntity> linkedDvi) {
+		this.linkedDviA = linkedDvi;
+	}
+
 	public void addMgmtObj(MgmtObjEntity mgmtObjEntity) {
 		BigInteger mgmtDef = mgmtObjEntity.getMgmtDefinition();
 		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
@@ -404,6 +481,16 @@
 			getLinkedDvi().add((DeviceInfoEntity) mgmtObjEntity);
 	}
 
+	public void addMgmtObjA(MgmtObjAnncEntity mgmtObjAnncEntity) {
+		BigInteger mgmtDef = mgmtObjAnncEntity.getMgmtDefinition();
+		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
+			getLinkedAniA().add((AreaNwkInfoAnncEntity) mgmtObjAnncEntity);
+		else if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
+			getLinkedAndiA().add((AreaNwkDeviceInfoAnncEntity) mgmtObjAnncEntity);
+		else if (mgmtDef.equals(MgmtDefinitionTypes.DEVICE_INFO))
+			getLinkedDviA().add((DeviceInfoAnncEntity) mgmtObjAnncEntity);
+	}
+
 	@Override
 	public boolean equals(Object obj) {
 		if (this == obj){
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/MgmtObjAnncEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/MgmtObjAnncEntity.java
index e1a4c81..54c9c6a 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/MgmtObjAnncEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/MgmtObjAnncEntity.java
@@ -30,7 +30,6 @@
 import org.eclipse.om2m.commons.constants.ShortName;
 import org.eclipse.om2m.commons.exceptions.BadRequestException;
 import org.eclipse.om2m.commons.resource.AnnouncedMgmtResource;
-import org.eclipse.om2m.commons.resource.MgmtObj;
 
 /**
  * Generic common attributes for management objects entities
@@ -122,18 +121,17 @@
 	}
 
 	public static MgmtObjAnncEntity create(BigInteger mgmtDef) {
-		// TODO
-//		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
-//			return new AreaNwkInfoEntity();
-//		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
-//			return new AreaNwkDeviceInfoEntity();
-//		if (mgmtDef.equals(MgmtDefinitionTypes.DEVICE_INFO))
-//			return new DeviceInfoEntity();
+		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
+			return new AreaNwkInfoAnncEntity();
+		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
+			return new AreaNwkDeviceInfoAnncEntity();
+		if (mgmtDef.equals(MgmtDefinitionTypes.DEVICE_INFO))
+			return new DeviceInfoAnncEntity();
 		throw new BadRequestException("Not implemented");
 	}
 
-	abstract public NodeEntity getParentNode();
-	abstract public void setParentNode(NodeEntity parentNode);
+	abstract public NodeAnncEntity getParentNode();
+	abstract public void setParentNode(NodeAnncEntity parentNode);
 	abstract public List<AccessControlPolicyEntity> getAccessControlPolicies();
 	abstract public List<SubscriptionEntity> getSubscriptions();
 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/NodeAnncEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/NodeAnncEntity.java
new file mode 100644
index 0000000..f654151
--- /dev/null
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/NodeAnncEntity.java
@@ -0,0 +1,314 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2017 Orange.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.om2m.commons.entities;
+
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+import org.eclipse.om2m.commons.constants.DBEntities;
+import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
+import org.eclipse.om2m.commons.constants.ShortName;
+
+@Inheritance(strategy = InheritanceType.JOINED)
+@Entity(name = DBEntities.NODE_ANNC_ENTITY)
+public class NodeAnncEntity extends AnnouncedResourceEntity {
+
+	// linked ACP
+	@ManyToMany(fetch=FetchType.LAZY)
+	@JoinTable(
+			name = DBEntities.ACP_NODANNC_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.NODANNC_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.ACP_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<AccessControlPolicyEntity> linkedAcps;
+	
+	/** List of DynamicAuthorizationConsultations*/
+	@ManyToMany(fetch=FetchType.LAZY, mappedBy="linkedNodeAnncEntities")
+	@JoinTable(
+			name = DBEntities.NODANNC_DAC_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.NODANNC_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.DAC_JOINID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<DynamicAuthorizationConsultationEntity> dynamicAuthorizationConsultations;
+
+	// node id
+	@Column(name = ShortName.NODE_ID)
+	protected String nodeID;
+
+	// hosted CSE LINK
+	@Column(name = ShortName.HOSTED_CSE_LINK)
+	protected String hostedCSELink;
+
+	// hosted APP LINK
+	@Column(name = ShortName.HOSTED_SRV_LINK)
+	protected String hostedServiceLinks;
+
+	@ManyToOne(fetch = FetchType.LAZY)
+	@JoinTable(
+			name = DBEntities.CSB_NODANNC_CH_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.NODANNC_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.CSEB_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected CSEBaseEntity parentCsb;
+
+	@ManyToOne(fetch = FetchType.LAZY)
+	@JoinTable(
+			name = DBEntities.CSR_NODANNC_CH_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.NODANNC_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.CSR_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected RemoteCSEEntity parentCsr;
+
+	@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
+	@JoinTable(
+			name = DBEntities.NODANNC_SUB_JOIN,
+			joinColumns = { @JoinColumn(name = DBEntities.NODANNC_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.SUB_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<SubscriptionEntity> childSubscriptions;
+
+	// Database link to AreaNwkInfo Entity
+	@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
+	@JoinTable(
+			name = DBEntities.ANI_NODANNC_JOIN,
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.ANI_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			joinColumns = { @JoinColumn(name = DBEntities.NODANNC_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<AreaNwkInfoAnncEntity> childAreaNwkInfoEntities;
+	
+	// Database link to AreaNwkDeviceInfo entity
+	@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
+	@JoinTable(
+			name = DBEntities.ANDI_NODANNC_JOIN,
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.ANDI_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			joinColumns = { @JoinColumn(name = DBEntities.NODANNC_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<AreaNwkDeviceInfoAnncEntity> childAreaNwkDeviceInfoEntities;
+	
+	// Database link to DeviceInfo entity
+	@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
+	@JoinTable(
+			name = DBEntities.DVI_NODANNC_JOIN,
+			inverseJoinColumns = { @JoinColumn(name = DBEntities.DVI_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
+			joinColumns = { @JoinColumn(name = DBEntities.NODANNC_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
+			)
+	protected List<DeviceInfoAnncEntity> childDeviceInfoEntities;
+
+	/**
+	 * @return the accessControlPolicies
+	 */
+	public List<AccessControlPolicyEntity> getAccessControlPolicies() {
+		if (this.linkedAcps == null) {
+			this.linkedAcps = new ArrayList<>();
+		}
+		return linkedAcps;
+	}
+	
+	/**
+	 * @param accessControlPolicies the accessControlPolicies to set
+	 */
+	public void setAccessControlPolicies(List<AccessControlPolicyEntity> accessControlPolicies) {
+		this.linkedAcps = accessControlPolicies;
+	}
+	
+	/**
+	 * @return the nodeID
+	 */
+	public String getNodeID() {
+		return nodeID;
+	}
+	
+	/**
+	 * @param nodeID the nodeID to set
+	 */
+	public void setNodeID(String nodeID) {
+		this.nodeID = nodeID;
+	}
+	
+	/**
+	 * @return the hostedCSELink
+	 */
+	public String getHostedCSELink() {
+		return hostedCSELink;
+	}
+	
+	/**
+	 * @param hostedCSELink the hostedCSELink to set
+	 */
+	public void setHostedCSELink(String hostedCSELink) {
+		this.hostedCSELink = hostedCSELink;
+	}
+	
+	/**
+	 * @return the hostedAppLink
+	 */
+	public String getHostedServiceLinks() {
+		return hostedServiceLinks;
+	}
+	
+	/**
+	 * @param hostedCSELink the hostedAppLink to set
+	 */
+	public void setHostedServiceLinks(String hostedServiceLinks) {
+		this.hostedServiceLinks = hostedServiceLinks;
+	}
+	
+	/**
+	 * @return the parentCsb
+	 */
+	public CSEBaseEntity getParentCsb() {
+		return parentCsb;
+	}
+	
+	/**
+	 * @param parentCsb the parentCsb to set
+	 */
+	public void setParentCsb(CSEBaseEntity parentCsb) {
+		this.parentCsb = parentCsb;
+	}
+	
+	/**
+	 * @return the parentCsr
+	 */
+	public RemoteCSEEntity getParentCsr() {
+		return parentCsr;
+	}
+	
+	/**
+	 * @param parentCsr the parentCsr to set
+	 */
+	public void setParentCsr(RemoteCSEEntity parentCsr) {
+		this.parentCsr = parentCsr;
+	}
+	
+	/**
+	 * @return the childSubscriptions
+	 */
+	public List<SubscriptionEntity> getChildSubscriptions() {
+		return childSubscriptions;
+	}
+	
+	/**
+	 * @param childSubscriptions the childSubscriptions to set
+	 */
+	public void setChildSubscriptions(List<SubscriptionEntity> childSubscriptions) {
+		this.childSubscriptions = childSubscriptions;
+	}
+	
+	/**
+	 * @return the childAreaNwkInfoEntities
+	 */
+	public List<AreaNwkInfoAnncEntity> getChildAreaNwkInfoEntities() {
+		if (this.childAreaNwkInfoEntities == null) {
+			this.childAreaNwkInfoEntities = new ArrayList<>();
+		}
+		return childAreaNwkInfoEntities;
+	}
+	
+	/**
+	 * @param childAreaNwkInfoEntities the childAreaNwkInfoEntities to set
+	 */
+	public void setChildAreaNwkInfoAnncEntities(List<AreaNwkInfoAnncEntity> childAreaNwkInfoEntities) {
+		this.childAreaNwkInfoEntities = childAreaNwkInfoEntities;
+	}
+	
+	/**
+	 * @return the childAreaNwkDeviceInfoEntities
+	 */
+	public List<AreaNwkDeviceInfoAnncEntity> getChildAreaNwkDeviceInfoEntities() {
+		if (this.childAreaNwkDeviceInfoEntities == null) {
+			this.childAreaNwkDeviceInfoEntities = new ArrayList<>();
+		}
+		return childAreaNwkDeviceInfoEntities;
+	}
+	
+	/**
+	 * @param childAreaNwkDeviceInfoEntities the childAreaNwkDeviceInfoEntities to set
+	 */
+	public void setChildAreaNwkDeviceInfoAnncEntities(List<AreaNwkDeviceInfoAnncEntity> childAreaNwkDeviceInfoEntities) {
+		this.childAreaNwkDeviceInfoEntities = childAreaNwkDeviceInfoEntities;
+	}
+	
+	/**
+	 * @return the childDeviceInfoEntities
+	 */
+	public List<DeviceInfoAnncEntity> getChildDeviceInfoEntities() {
+		if (this.childDeviceInfoEntities == null) {
+			this.childDeviceInfoEntities = new ArrayList<>();
+		}
+		return childDeviceInfoEntities;
+	}
+	
+	/**
+	 * @param childDeviceInfoEntities the childDeviceInfoEntities to set
+	 */
+	public void setChildDeviceInfoAnncEntities(List<DeviceInfoAnncEntity> childDeviceInfoEntities) {
+		this.childDeviceInfoEntities = childDeviceInfoEntities;
+	}
+	
+	@Override
+	/**
+	 * Retrieve linked dynamicAuthorizationConsultations
+	 */
+	public List<DynamicAuthorizationConsultationEntity> getDynamicAuthorizationConsultations() {
+		if (dynamicAuthorizationConsultations == null) {
+			dynamicAuthorizationConsultations = new ArrayList<>();
+		}
+		return dynamicAuthorizationConsultations;
+	}
+	
+	@Override
+	/**
+	 * Set linked dynamicAuthorizationConsultations
+	 */
+	public void setDynamicAuthorizationConsultations(List<DynamicAuthorizationConsultationEntity> list) {
+		this.dynamicAuthorizationConsultations = list;
+	}
+
+	public List<MgmtObjAnncEntity> getMgmtObjEntities() {
+		List<MgmtObjAnncEntity> ret = new ArrayList<MgmtObjAnncEntity>();
+		ret.addAll(getChildAreaNwkInfoEntities());
+		ret.addAll(getChildAreaNwkDeviceInfoEntities());
+		ret.addAll(getChildDeviceInfoEntities());
+		return ret;
+	}
+
+	public void addMgmtObj(MgmtObjAnncEntity mgmtObj) {
+		BigInteger mgmtDef = mgmtObj.getMgmtDefinition();
+		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
+			getChildAreaNwkInfoEntities().add((AreaNwkInfoAnncEntity) mgmtObj);
+		else if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
+			getChildAreaNwkDeviceInfoEntities().add((AreaNwkDeviceInfoAnncEntity) mgmtObj);
+		else if (mgmtDef.equals(MgmtDefinitionTypes.DEVICE_INFO))
+			getChildDeviceInfoEntities().add((DeviceInfoAnncEntity) mgmtObj);
+	}
+
+	public void removeMgmtObj(MgmtObjAnncEntity mgmtObj) {
+		BigInteger mgmtDef = mgmtObj.getMgmtDefinition();
+		if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
+			getChildAreaNwkInfoEntities().remove((AreaNwkInfoAnncEntity) mgmtObj);
+		else if (mgmtDef.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
+			getChildAreaNwkDeviceInfoEntities().remove((AreaNwkDeviceInfoAnncEntity) mgmtObj);
+		else if (mgmtDef.equals(MgmtDefinitionTypes.DEVICE_INFO))
+			getChildDeviceInfoEntities().remove((DeviceInfoAnncEntity) mgmtObj);
+	}
+
+}
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/NodeEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/NodeEntity.java
index fff23af..da172c6 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/NodeEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/NodeEntity.java
@@ -70,10 +70,10 @@
 	protected String hostedCSELink;
 
 	// hosted APP LINK
-	@Column(name = ShortName.HOSTED_APP_LINK)
-	protected String hostedAppLink;
+	@Column(name = ShortName.HOSTED_SRV_LINK)
+	protected String hostedServiceLinks;
 
-	@ManyToOne(fetch = FetchType.LAZY)
+	@ManyToOne(fetch=FetchType.LAZY, targetEntity=CSEBaseEntity.class)
 	@JoinTable(
 			name = DBEntities.CSB_NOD_CH_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.NOD_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
@@ -81,13 +81,13 @@
 			)
 	protected CSEBaseEntity parentCsb;
 
-	@ManyToOne(fetch = FetchType.LAZY)
+	@ManyToOne(fetch=FetchType.LAZY, targetEntity=RemoteCSEEntity.class)
 	@JoinTable(
 			name = DBEntities.CSR_NOD_CH_JOIN,
 			joinColumns = { @JoinColumn(name = DBEntities.NOD_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
 			inverseJoinColumns = { @JoinColumn(name = DBEntities.CSR_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }
 			)
-	protected CSEBaseEntity parentCsr;
+	protected RemoteCSEEntity parentCsr;
 
 	@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
 	@JoinTable(
@@ -116,7 +116,7 @@
 	protected List<AreaNwkDeviceInfoEntity> childAreaNwkDeviceInfoEntities;
 	
 	// Database link to DeviceInfo entity
-	@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
+	@OneToMany(fetch = FetchType.LAZY, cascade = {CascadeType.ALL}, mappedBy="parentNode")
 	@JoinTable(
 			name = DBEntities.DVI_NOD_JOIN,
 			inverseJoinColumns = { @JoinColumn(name = DBEntities.DVI_JOIN_ID, referencedColumnName = ShortName.RESOURCE_ID) }, 
@@ -173,15 +173,15 @@
 	/**
 	 * @return the hostedAppLink
 	 */
-	public String getHostedAppLink() {
-		return hostedAppLink;
+	public String getHostedServiceLinks() {
+		return hostedServiceLinks;
 	}
 	
 	/**
 	 * @param hostedCSELink the hostedAppLink to set
 	 */
-	public void setHostedAppLink(String hostedAppLink) {
-		this.hostedAppLink = hostedAppLink;
+	public void setHostedServiceLinks(String hostedServiceLinks) {
+		this.hostedServiceLinks = hostedServiceLinks;
 	}
 	
 	/**
@@ -201,14 +201,14 @@
 	/**
 	 * @return the parentCsr
 	 */
-	public CSEBaseEntity getParentCsr() {
+	public RemoteCSEEntity getParentCsr() {
 		return parentCsr;
 	}
 	
 	/**
 	 * @param parentCsr the parentCsr to set
 	 */
-	public void setParentCsr(CSEBaseEntity parentCsr) {
+	public void setParentCsr(RemoteCSEEntity parentCsr) {
 		this.parentCsr = parentCsr;
 	}
 	
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/RemoteCSEEntity.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/RemoteCSEEntity.java
index 7596093..a76f0e4 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/RemoteCSEEntity.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/entities/RemoteCSEEntity.java
@@ -175,13 +175,22 @@
 	protected ScheduleEntity linkedSchedule;
 	
 	/** List of Nodes */
-	@OneToMany(fetch=FetchType.LAZY, cascade={CascadeType.ALL})
+	@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="parentCsr")
 	@JoinTable(
 			name=DBEntities.CSR_NOD_CH_JOIN,
 			joinColumns={@JoinColumn(name=DBEntities.CSR_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
 			inverseJoinColumns={@JoinColumn(name=DBEntities.NOD_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)}
 			)
 	protected List<NodeEntity> childNodes;
+
+	/** List of announced Nodes */
+	@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy="parentCsr")
+	@JoinTable(
+			name=DBEntities.CSR_NODANNC_CH_JOIN,
+			joinColumns={@JoinColumn(name=DBEntities.CSR_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)},
+			inverseJoinColumns={@JoinColumn(name=DBEntities.NODANNC_JOIN_ID, referencedColumnName=ShortName.RESOURCE_ID)}
+			)
+	protected List<NodeAnncEntity> childAnncNodes;
 	
 	@OneToMany(fetch=FetchType.LAZY, cascade=CascadeType.ALL,mappedBy="parentRemoteCse")
 	@JoinTable(
@@ -494,6 +503,9 @@
 	 * @return the childNodes
 	 */
 	public List<NodeEntity> getChildNodes() {
+		if (this.childNodes == null) {
+			this.childNodes = new ArrayList<>();
+		}
 		return childNodes;
 	}
 
@@ -505,6 +517,23 @@
 	}
 
 	/**
+	 * @return the childNodes
+	 */
+	public List<NodeAnncEntity> getChildAnncNodes() {
+		if (this.childAnncNodes == null) {
+			this.childAnncNodes = new ArrayList<>();
+		}
+		return childAnncNodes;
+	}
+
+	/**
+	 * @param childNodes the childNodes to set
+	 */
+	public void setChildAnncNodes(List<NodeAnncEntity> childNodes) {
+		this.childAnncNodes = childNodes;
+	}
+
+	/**
 	 * @return the generatedAcp
 	 */
 	public AccessControlPolicyEntity getGeneratedAcp() {
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/AbstractFlexContainerAnnc.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/AbstractFlexContainerAnnc.java
index 2f2d7ad..8e2c705 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/AbstractFlexContainerAnnc.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/AbstractFlexContainerAnnc.java
@@ -41,6 +41,9 @@
 	@XmlSchemaType(name = "anyURI")
 	@XmlElement(name = ShortName.CONTAINER_DEFINITION, namespace="")
 	protected String containerDefinition;
+	@XmlSchemaType(name = "anyURI")
+	@XmlElement(name = ShortName.NODE_LINK, required = false, namespace="")
+	protected String nodeLink;
 	@XmlElement(name = ShortName.CHILD_RESOURCE, namespace="")
 	protected List<ChildResourceRef> childResource;
 	@XmlElements({
@@ -258,7 +261,28 @@
 		}
 		return this.flexContainerOrContainerOrSubscription;
 	}
-	
+
+	/**
+	 * Gets the value of the nodeLink property.
+	 * 
+	 * @return possible object is {@link String }
+	 * 
+	 */
+	public String getNodeLink() {
+		return nodeLink;
+	}
+
+	/**
+	 * Sets the value of the nodeLink property.
+	 * 
+	 * @param value
+	 *            allowed object is {@link String }
+	 * 
+	 */
+	public void setNodeLink(String value) {
+		this.nodeLink = value;
+	}
+
 	public void finalizeSerialization() {
 		// do nothing
 		// should be overwrote 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/AnnouncedMgmtResource.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/AnnouncedMgmtResource.java
index f19d843..804705c 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/AnnouncedMgmtResource.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/AnnouncedMgmtResource.java
@@ -65,7 +65,8 @@
  * 
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "announcedMgmtResource")
+@XmlType(name = "announcedMgmtResource", propOrder = { "mgmtDefinition",
+		"objectIDs", "objectPaths", "description", "subscriptions", "childResource" })
 @XmlSeeAlso({ EventLogAnnc.class, RebootAnnc.class, DeviceCapabilityAnnc.class,
 		DeviceInfoAnnc.class, SoftwareAnnc.class, FirmwareAnnc.class,
 		AreaNwkDeviceInfoAnnc.class, AreaNwkInfoAnnc.class, BatteryAnnc.class,
@@ -73,16 +74,16 @@
 public class AnnouncedMgmtResource extends AnnouncedResource {
 
 	@XmlElement(name = ShortName.MGMT_DEF, required = true, namespace="")
- 	protected BigInteger mgmtDefinition;
-
- 	@XmlList
+	protected BigInteger mgmtDefinition;
+	
+	@XmlList
 	@XmlElement(name = ShortName.OBJ_IDS, namespace="")
 	protected List<String> objectIDs;
-
- 	@XmlList
+	
+	@XmlList
 	@XmlElement(name = ShortName.OBJ_PATHS, namespace="")
 	protected List<String> objectPaths;
-
+	
 	@XmlElement(name = ShortName.DESCRIPTION, namespace="")
 	protected String description;
 	
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/BatteryAnnc.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/BatteryAnnc.java
index 409d87e..93399fd 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/BatteryAnnc.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/BatteryAnnc.java
@@ -34,6 +34,7 @@
 import javax.xml.bind.annotation.XmlSchemaType;
 import javax.xml.bind.annotation.XmlType;
 
+import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
 import org.eclipse.om2m.commons.constants.ShortName;
 
 /**
@@ -66,12 +67,17 @@
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "")
 @XmlRootElement(name = ShortName.BATTERY_ANNC)
-public class BatteryAnnc extends AnnouncedMgmtResource {
+public class BatteryAnnc extends MgmtObjAnncWithChildren {
 
 	@XmlSchemaType(name = "unsignedInt")
 	protected Long batteryLevel;
-
 	protected BigInteger batteryStatus;
+	
+	
+	public BatteryAnnc() {
+		super();
+		setMgmtDefinition(MgmtDefinitionTypes.BATTERY);
+	}
 
 	/**
 	 * Gets the value of the batteryLevel property.
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/CSEBase.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/CSEBase.java
index a7869ff..c9b0369 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/CSEBase.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/CSEBase.java
@@ -124,7 +124,7 @@
 
 	@XmlElements({
 			@XmlElement(name = ShortName.REMOTE_CSE, namespace = "http://www.onem2m.org/xml/protocols", type = RemoteCSE.class),
-			@XmlElement(name = "node", namespace = "http://www.onem2m.org/xml/protocols", type = Node.class),
+			@XmlElement(name = ShortName.NODE, namespace = "http://www.onem2m.org/xml/protocols", type = Node.class),
 			@XmlElement(name = ShortName.AE, namespace = "http://www.onem2m.org/xml/protocols", type = AE.class),
 			@XmlElement(name = ShortName.CNT, namespace = "http://www.onem2m.org/xml/protocols", type = Container.class),
 			@XmlElement(name = ShortName.GROUP, namespace = "http://www.onem2m.org/xml/protocols", type = Group.class),
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceCapability.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceCapability.java
index c3ac172..7b9d803 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceCapability.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceCapability.java
@@ -79,7 +79,7 @@
 	protected boolean currentState;
 	protected Boolean enable;
 	protected Boolean disable;
-
+	
 	
 	public DeviceCapability() {
 		super();
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceCapabilityAnnc.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceCapabilityAnnc.java
index 03e66e7..7d904d4 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceCapabilityAnnc.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceCapabilityAnnc.java
@@ -68,7 +68,7 @@
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "")
 @XmlRootElement(name = ShortName.DEVICE_CAPABILITY_ANNC)
-public class DeviceCapabilityAnnc extends AnnouncedMgmtResource {
+public class DeviceCapabilityAnnc extends MgmtObjAnncWithChildren {
 
 	protected String capabilityName;
 	protected Boolean attached;
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceInfoAnnc.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceInfoAnnc.java
index 734a8a3..177c711 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceInfoAnnc.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/DeviceInfoAnnc.java
@@ -55,6 +55,17 @@
  *         &lt;element name="fwVersion" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
  *         &lt;element name="swVersion" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
  *         &lt;element name="hwVersion" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/>
+ *         &lt;element name="manufacturerDetailsLink" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="manufacturingDate" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="subModel" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="deviceName" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="osVersion" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="country" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="location" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="systemTime" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="supportURL" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="presentationURL" type="{http://www.w3.org/2001/XMLSchema}string"/>
+ *         &lt;element name="protocol" type="{http://www.w3.org/2001/XMLSchema}string"/>
  *         &lt;choice minOccurs="0">
  *           &lt;element name="childResource" type="{http://www.onem2m.org/xml/protocols}childResourceRef" maxOccurs="unbounded"/>
  *           &lt;element ref="{http://www.onem2m.org/xml/protocols}subscription" maxOccurs="unbounded"/>
@@ -70,7 +81,7 @@
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "")
 @XmlRootElement(name = ShortName.DEVICE_INFO_ANNC)
-public class DeviceInfoAnnc extends AnnouncedMgmtResource {
+public class DeviceInfoAnnc extends MgmtObjAnncWithChildren {
 
 	@XmlElement(required = true, name = ShortName.DEVICE_LABEL, namespace="")
 	protected String deviceLabel;
@@ -109,13 +120,13 @@
 	protected String presentationURL;
 	@XmlElement(name = ShortName.PROTOCOL, namespace="")
 	protected String protocol;
-
+	
 	
 	public DeviceInfoAnnc() {
 		super();
 		setMgmtDefinition(MgmtDefinitionTypes.DEVICE_INFO);
 	}
-	
+
 	/**
 	 * Gets the value of the deviceLabel property.
 	 * 
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/EventLog.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/EventLog.java
index f0d0ee5..f209dd8 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/EventLog.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/EventLog.java
@@ -27,8 +27,6 @@
 package org.eclipse.om2m.commons.resource;
 
 import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
 
 import javax.xml.bind.annotation.XmlAccessType;
 import javax.xml.bind.annotation.XmlAccessorType;
@@ -82,8 +80,6 @@
 	protected BigInteger logStatus;
 	protected boolean logStart;
 	protected boolean logStop;
-	@XmlElement(namespace = "http://www.onem2m.org/xml/protocols")
-	protected List<Subscription> subscription;
 	
 	
 	public EventLog() {
@@ -186,34 +182,4 @@
 		this.logStop = value;
 	}
 
-	/**
-	 * Gets the value of the subscription property.
-	 * 
-	 * <p>
-	 * This accessor method returns a reference to the live list, not a
-	 * snapshot. Therefore any modification you make to the returned list will
-	 * be present inside the JAXB object. This is why there is not a
-	 * <CODE>set</CODE> method for the subscription property.
-	 * 
-	 * <p>
-	 * For example, to add a new item, do as follows:
-	 * 
-	 * <pre>
-	 * getSubscription().add(newItem);
-	 * </pre>
-	 * 
-	 * 
-	 * <p>
-	 * Objects of the following type(s) are allowed in the list
-	 * {@link Subscription }
-	 * 
-	 * 
-	 */
-	public List<Subscription> getSubscription() {
-		if (subscription == null) {
-			subscription = new ArrayList<Subscription>();
-		}
-		return this.subscription;
-	}
-
 }
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/EventLogAnnc.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/EventLogAnnc.java
index 813f85c..1c6659c 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/EventLogAnnc.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/EventLogAnnc.java
@@ -69,7 +69,7 @@
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "")
 @XmlRootElement(name = ShortName.EVENT_LOG_ANNC)
-public class EventLogAnnc extends AnnouncedMgmtResource {
+public class EventLogAnnc extends MgmtObjAnncWithChildren {
 
 	protected BigInteger logTypeId;
 	protected String logData;
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/FirmwareAnnc.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/FirmwareAnnc.java
index 5525047..0c2b44d 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/FirmwareAnnc.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/FirmwareAnnc.java
@@ -71,9 +71,9 @@
  * 
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "")
+@XmlType(name = "", propOrder = { "rest" })
 @XmlRootElement(name = ShortName.FIRMWARE_ANNC)
-public class FirmwareAnnc extends AnnouncedMgmtResource {
+public class FirmwareAnnc extends MgmtObjAnncWithChildren {
 
 	@XmlElementRefs({
 			@XmlElementRef(name = "childResource", type = JAXBElement.class, required = false),
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/MemoryAnnc.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/MemoryAnnc.java
index 0f4bae8..18b2530 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/MemoryAnnc.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/MemoryAnnc.java
@@ -67,7 +67,7 @@
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "")
 @XmlRootElement(name = ShortName.MEMORY_ANNC)
-public class MemoryAnnc extends AnnouncedMgmtResource {
+public class MemoryAnnc extends MgmtObjAnncWithChildren {
 
 	@XmlSchemaType(name = "unsignedLong")
 	protected BigInteger memAvailable;
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/MgmtObjAnncWithChildren.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/MgmtObjAnncWithChildren.java
new file mode 100644
index 0000000..5649d55
--- /dev/null
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/MgmtObjAnncWithChildren.java
@@ -0,0 +1,85 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2017 Orange.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.om2m.commons.resource;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.xml.bind.annotation.XmlElement;
+
+import org.eclipse.om2m.commons.constants.ShortName;
+
+public class MgmtObjAnncWithChildren extends AnnouncedMgmtResource {
+	
+	@XmlElement(name = ShortName.CHILD_RESOURCE, namespace="")
+	protected List<ChildResourceRef> childResource;
+
+	@XmlElement(namespace = "http://www.onem2m.org/xml/protocols", name = ShortName.SUB)
+	protected List<Subscription> subscriptions;
+
+	/**
+	 * Gets the value of the childResource property.
+	 * 
+	 * <p>
+	 * This accessor method returns a reference to the live list, not a
+	 * snapshot. Therefore any modification you make to the returned list will
+	 * be present inside the JAXB object. This is why there is not a
+	 * <CODE>set</CODE> method for the childResource property.
+	 * 
+	 * <p>
+	 * For example, to add a new item, do as follows:
+	 * 
+	 * <pre>
+	 * getChildResource().add(newItem);
+	 * </pre>
+	 * 
+	 * 
+	 * <p>
+	 * Objects of the following type(s) are allowed in the list
+	 * {@link ChildResourceRef }
+	 * 
+	 * 
+	 */
+	public List<ChildResourceRef> getChildResource() {
+		if (childResource == null) {
+			childResource = new ArrayList<ChildResourceRef>();
+		}
+		return this.childResource;
+	}
+
+	/**
+	 * Gets the value of the subscription property.
+	 * 
+	 * <p>
+	 * This accessor method returns a reference to the live list, not a
+	 * snapshot. Therefore any modification you make to the returned list will
+	 * be present inside the JAXB object. This is why there is not a
+	 * <CODE>set</CODE> method for the subscription property.
+	 * 
+	 * <p>
+	 * For example, to add a new item, do as follows:
+	 * 
+	 * <pre>
+	 * getSubscription().add(newItem);
+	 * </pre>
+	 * 
+	 * 
+	 * <p>
+	 * Objects of the following type(s) are allowed in the list
+	 * {@link Subscription }
+	 * 
+	 * 
+	 */
+	public List<Subscription> getSubscriptions() {
+		if (subscriptions == null) {
+			subscriptions = new ArrayList<Subscription>();
+		}
+		return this.subscriptions;
+	}
+
+}
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/Node.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/Node.java
index 0ced53f..666a714 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/Node.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/Node.java
@@ -93,8 +93,8 @@
 	@XmlElement(name = ShortName.HOSTED_CSE_LINK, namespace="")
 	protected String hostedCSELink;
 	
-	@XmlElement(name = ShortName.HOSTED_APP_LINK, namespace="")
-	protected String hostedAppLinks;
+	@XmlElement(name = ShortName.HOSTED_SRV_LINK, namespace="")
+	protected String hostedServiceLinks;
 	
 	@XmlElement(name = ShortName.CHILD_RESOURCE, namespace="")
 	protected List<ChildResourceRef> childResource;
@@ -166,8 +166,8 @@
 	 * @return possible object is {@link String }
 	 * 
 	 */
-	public String getHostedAppLinks() {
-		return hostedAppLinks;
+	public String getHostedServiceLinks() {
+		return hostedServiceLinks;
 	}
 
 	/**
@@ -177,8 +177,8 @@
 	 *            allowed object is {@link String }
 	 * 
 	 */
-	public void setHostedAppLinks(String value) {
-		this.hostedAppLinks = value;
+	public void setHostedServiceLinks(String value) {
+		this.hostedServiceLinks = value;
 	}
 
 	/**
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/NodeAnnc.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/NodeAnnc.java
index 54bea0e..1d14814 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/NodeAnnc.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/NodeAnnc.java
@@ -38,6 +38,8 @@
 import javax.xml.bind.annotation.adapters.CollapsedStringAdapter;
 import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
+import org.eclipse.om2m.commons.constants.ShortName;
+
 /**
  * <p>
  * Java class for anonymous complex type.
@@ -78,29 +80,36 @@
  * 
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "", propOrder = { "nodeID", "hostedCSELink", "childResource",
-		"memoryAnncOrBatteryAnncOrAreaNwkInfoAnnc" })
-@XmlRootElement(name = "nodeAnnc")
-public class NodeAnnc extends AnnounceableResource {
+@XmlType(name = "")
+@XmlRootElement(name = ShortName.NODE_ANNC)
+public class NodeAnnc extends AnnouncedMgmtResource {
 
-	@XmlElement(required = true)
 	@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
+	@XmlElement(required = true, name = ShortName.NODE_ID, namespace="")
 	protected String nodeID;
+	
+	@XmlElement(name = ShortName.HOSTED_CSE_LINK, namespace="")
 	protected String hostedCSELink;
+	
+	@XmlElement(name = ShortName.HOSTED_SRV_LINK, namespace="")
+	protected String hostedServiceLinks;
+
+	@XmlElement(name = ShortName.CHILD_RESOURCE, namespace="")
 	protected List<ChildResourceRef> childResource;
+	
 	@XmlElements({
-			@XmlElement(name = "memoryAnnc", namespace = "http://www.onem2m.org/xml/protocols", type = MemoryAnnc.class),
-			@XmlElement(name = "batteryAnnc", namespace = "http://www.onem2m.org/xml/protocols", type = BatteryAnnc.class),
-			@XmlElement(name = "areaNwkInfoAnnc", namespace = "http://www.onem2m.org/xml/protocols", type = AreaNwkInfoAnnc.class),
-			@XmlElement(name = "areaNwkDeviceInfoAnnc", namespace = "http://www.onem2m.org/xml/protocols", type = AreaNwkDeviceInfoAnnc.class),
-			@XmlElement(name = "firmwareAnnc", namespace = "http://www.onem2m.org/xml/protocols", type = FirmwareAnnc.class),
-			@XmlElement(name = "softwareAnnc", namespace = "http://www.onem2m.org/xml/protocols", type = SoftwareAnnc.class),
-			@XmlElement(name = "deviceInfoAnnc", namespace = "http://www.onem2m.org/xml/protocols", type = DeviceInfoAnnc.class),
-			@XmlElement(name = "deviceCapabilityAnnc", namespace = "http://www.onem2m.org/xml/protocols", type = DeviceCapabilityAnnc.class),
-			@XmlElement(name = "rebootAnnc", namespace = "http://www.onem2m.org/xml/protocols", type = RebootAnnc.class),
-			@XmlElement(name = "eventLogAnnc", namespace = "http://www.onem2m.org/xml/protocols", type = EventLogAnnc.class),
-			@XmlElement(name = "subscription", namespace = "http://www.onem2m.org/xml/protocols", type = Subscription.class) })
-	protected List<Resource> memoryAnncOrBatteryAnncOrAreaNwkInfoAnnc;
+		@XmlElement(name = ShortName.MEMORY_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = MemoryAnnc.class),
+		@XmlElement(name = ShortName.BATTERY_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = BatteryAnnc.class),
+		@XmlElement(name = ShortName.AREA_NWK_INFO_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = AreaNwkInfoAnnc.class),
+		@XmlElement(name = ShortName.AREA_NWK_DEVICE_INFO_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = AreaNwkDeviceInfoAnnc.class),
+		@XmlElement(name = ShortName.FIRMWARE_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = FirmwareAnnc.class),
+		@XmlElement(name = ShortName.SOFTWARE_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = SoftwareAnnc.class),
+		@XmlElement(name = ShortName.DEVICE_INFO_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = DeviceInfoAnnc.class),
+		@XmlElement(name = ShortName.DEVICE_CAPABILITY_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = DeviceCapabilityAnnc.class),
+		@XmlElement(name = ShortName.REBOOT_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = RebootAnnc.class),
+		@XmlElement(name = ShortName.EVENT_LOG_ANNC, namespace = "http://www.onem2m.org/xml/protocols", type = EventLogAnnc.class),
+		@XmlElement(name = ShortName.SUB, namespace = "http://www.onem2m.org/xml/protocols", type = Subscription.class) })
+	protected List<AnnouncedMgmtResource> mgmmtObjs;
 
 	/**
 	 * Gets the value of the nodeID property.
@@ -201,11 +210,25 @@
 	 * 
 	 * 
 	 */
-	public List<Resource> getMemoryAnncOrBatteryAnncOrAreaNwkInfoAnnc() {
-		if (memoryAnncOrBatteryAnncOrAreaNwkInfoAnnc == null) {
-			memoryAnncOrBatteryAnncOrAreaNwkInfoAnnc = new ArrayList<Resource>();
+	public List<AnnouncedMgmtResource> getMgmtObjs() {
+		if (mgmmtObjs == null) {
+			mgmmtObjs = new ArrayList<AnnouncedMgmtResource>();
 		}
-		return this.memoryAnncOrBatteryAnncOrAreaNwkInfoAnnc;
+		return this.mgmmtObjs;
+	}
+
+	/**
+	 * @return the hostedAppLinks
+	 */
+	public String getHostedServiceLinks() {
+		return hostedServiceLinks;
+	}
+
+	/**
+	 * @param hostedAppLinks the hostedAppLinks to set
+	 */
+	public void setHostedServiceLinks(String hostedServiceLinks) {
+		this.hostedServiceLinks = hostedServiceLinks;
 	}
 
 }
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/RebootAnnc.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/RebootAnnc.java
index 50f53dd..2e66646 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/RebootAnnc.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/RebootAnnc.java
@@ -31,6 +31,7 @@
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
+import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
 import org.eclipse.om2m.commons.constants.ShortName;
 
 /**
@@ -63,10 +64,16 @@
 @XmlAccessorType(XmlAccessType.FIELD)
 @XmlType(name = "")
 @XmlRootElement(name = ShortName.REBOOT_ANNC)
-public class RebootAnnc extends AnnouncedMgmtResource {
+public class RebootAnnc extends MgmtObjAnncWithChildren {
 
 	protected Boolean reboot;
 	protected Boolean factoryReset;
+	
+	
+	public RebootAnnc() {
+		super();
+		setMgmtDefinition(MgmtDefinitionTypes.REBOOT);
+	}
 
 	/**
 	 * Gets the value of the reboot property.
diff --git a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/SoftwareAnnc.java b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/SoftwareAnnc.java
index f89df00..94b5780 100644
--- a/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/SoftwareAnnc.java
+++ b/org.eclipse.om2m.commons/src/main/java/org/eclipse/om2m/commons/resource/SoftwareAnnc.java
@@ -37,6 +37,7 @@
 import javax.xml.bind.annotation.XmlRootElement;
 import javax.xml.bind.annotation.XmlType;
 
+import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
 import org.eclipse.om2m.commons.constants.ShortName;
 
 /**
@@ -74,9 +75,9 @@
  * 
  */
 @XmlAccessorType(XmlAccessType.FIELD)
-@XmlType(name = "")
+@XmlType(name = "", propOrder = { "rest" })
 @XmlRootElement(name = ShortName.SOFTWARE_ANNC)
-public class SoftwareAnnc extends AnnouncedMgmtResource {
+public class SoftwareAnnc extends MgmtObjAnncWithChildren {
 
 	@XmlElementRefs({
 			@XmlElementRef(name = "deactivate", type = JAXBElement.class, required = false),
@@ -91,6 +92,12 @@
 			@XmlElementRef(name = "version", type = JAXBElement.class, required = false),
 			@XmlElementRef(name = "install", type = JAXBElement.class, required = false) })
 	protected List<Object> rest;
+	
+	
+	public SoftwareAnnc() {
+		super();
+		setMgmtDefinition(MgmtDefinitionTypes.SOFTWARE);
+	}
 
 	/**
 	 * Gets the rest of the content model.
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/announcer/Announcer.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/announcer/Announcer.java
index b42e2f4..8825eb1 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/announcer/Announcer.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/announcer/Announcer.java
@@ -19,15 +19,19 @@
  *******************************************************************************/
 package org.eclipse.om2m.core.announcer;
 
+import java.math.BigInteger;
 import java.util.List;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.eclipse.om2m.commons.constants.Constants;
+import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
 import org.eclipse.om2m.commons.constants.MimeMediaType;
 import org.eclipse.om2m.commons.constants.Operation;
 import org.eclipse.om2m.commons.constants.ResourceType;
 import org.eclipse.om2m.commons.constants.ResponseStatusCode;
+import org.eclipse.om2m.commons.constants.ShortName;
+import org.eclipse.om2m.commons.entities.AnnounceableSubordinateEntity;
 import org.eclipse.om2m.commons.entities.CreatedAnnouncedResourceEntity;
 import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
 import org.eclipse.om2m.commons.entities.ResourceEntity;
@@ -37,7 +41,17 @@
 import org.eclipse.om2m.commons.resource.AbstractFlexContainer;
 import org.eclipse.om2m.commons.resource.AbstractFlexContainerAnnc;
 import org.eclipse.om2m.commons.resource.AnnounceableResource;
+import org.eclipse.om2m.commons.resource.AnnouncedMgmtResource;
 import org.eclipse.om2m.commons.resource.AnnouncedResource;
+import org.eclipse.om2m.commons.resource.AreaNwkDeviceInfo;
+import org.eclipse.om2m.commons.resource.AreaNwkDeviceInfoAnnc;
+import org.eclipse.om2m.commons.resource.AreaNwkInfo;
+import org.eclipse.om2m.commons.resource.AreaNwkInfoAnnc;
+import org.eclipse.om2m.commons.resource.DeviceInfo;
+import org.eclipse.om2m.commons.resource.DeviceInfoAnnc;
+import org.eclipse.om2m.commons.resource.MgmtObj;
+import org.eclipse.om2m.commons.resource.Node;
+import org.eclipse.om2m.commons.resource.NodeAnnc;
 import org.eclipse.om2m.commons.resource.RequestPrimitive;
 import org.eclipse.om2m.commons.resource.ResponsePrimitive;
 import org.eclipse.om2m.commons.resource.flexcontainerspec.FlexContainerFactory;
@@ -56,6 +70,8 @@
 public class Announcer implements Constants {
 	/** Logger */
 	private static Log LOGGER = LogFactory.getLog(Announcer.class);
+	
+	private static final String SUFFIX = "_Annc";
 
 	/**
 	 * Announces the created resource.
@@ -70,25 +86,25 @@
 	 *            - requesting entity
 	 * @return
 	 */
-	public static List<String> announce(List<String> announceTo, List<String> announceToAttribute,
-			AnnounceableResource toBeAnnounced, String requestingEntity, String remoteDestination) {
-
+	public static void announce(AnnounceableResource toBeAnnounced, 
+			String requestingEntity, String remoteDestination) {
 		AnnouncedResource announcedResource = null;
-
-		switch (toBeAnnounced.getResourceType().intValue()) {
+		LOGGER.info("announce " + toBeAnnounced + " with " + toBeAnnounced.getAnnouncedAttribute());
+		int type = toBeAnnounced.getResourceType().intValue();
+		switch (type) {
 		case ResourceType.AE:
-			AEAnnc aeAnnc = new AEAnnc();
-			aeAnnc.setAppID(((AE) toBeAnnounced).getAppID());
-			announcedResource = aeAnnc;
-			break;
+			announcedResource = createAEAnnc((AE)toBeAnnounced); break;
 		case ResourceType.FLEXCONTAINER:
-			AbstractFlexContainer afc = (AbstractFlexContainer) toBeAnnounced;
-			AbstractFlexContainerAnnc flexContainerAnnc = FlexContainerFactory.getSpecializationFlexContainerAnnc(afc.getShortName() + "Annc");
-			announcedResource = flexContainerAnnc;
+			announcedResource = createFlexContainerAnnc((AbstractFlexContainer)toBeAnnounced); break;
+		case ResourceType.NODE:
+			announcedResource = createNodeAnnc((Node)toBeAnnounced); break;
+		case ResourceType.MGMT_OBJ:
+			announcedResource = createMgmtObjAnnc((MgmtObj)toBeAnnounced); break;
 		default:
+			throw new NotImplementedException("Not implemented " + type);
 		}
 		
-		announcedResource.setName(toBeAnnounced.getName() + "_Annc");
+		announcedResource.setName(toBeAnnounced.getName() + SUFFIX);
 
 		// get the database service
 		DBService dbs = PersistenceService.getInstance().getDbService();
@@ -103,17 +119,13 @@
 		// link
 		announcedResource.setLink(toBeAnnounced.getResourceID());
 
-		for (String cseId : announceTo) {
-
+		for (String cseId : toBeAnnounced.getAnnounceTo()) { 
 			RemoteCSEEntity remoteCSE = dbs.getDAOFactory().getRemoteCSEbyCseIdDAO().find(transaction, cseId);
 			RequestPrimitive request = new RequestPrimitive();
-
 			CreatedAnnouncedResourceEntity parentResource = dao.find(transaction, toBeAnnounced.getParentID(), cseId);
 			if (parentResource != null) {
-
-				request.setTo(parentResource.getRemoteAnnouncedId());
+				request.setTo(parentResource.getRemoteAnnouncedId());
 			} else {
-
 				if (!remoteDestination.startsWith("/")) {
 					remoteDestination = "/" + remoteDestination;
 				}
@@ -122,16 +134,8 @@
 			}
 			
 			request.setOperation(Operation.CREATE);
-			switch (toBeAnnounced.getResourceType().intValue()) {
-			case ResourceType.AE:
-				request.setResourceType(ResourceType.AE_ANNC);
-				break;
-			case ResourceType.FLEXCONTAINER:
-				request.setResourceType(ResourceType.FLEXCONTAINER_ANNC);
-				break;
-			default:
-				throw new NotImplementedException("");
-			}
+			request.setResourceType(BigInteger.valueOf(
+					toBeAnnounced.getResourceType().intValue() + 10000));
 			request.setContent(announcedResource);
 			request.setRequestContentType(MimeMediaType.OBJ);
 			request.setReturnContentType(MimeMediaType.OBJ);
@@ -148,15 +152,11 @@
 				announcedResourceEntity.setRemoteAnnouncedId(ar.getResourceID());
 
 				dao.create(transaction, announcedResourceEntity);
-
 			}
-
 		}
 
 		transaction.commit();
 		transaction.close();
-
-		return null;
 	}
 
 	/**
@@ -169,8 +169,7 @@
 	 * @param requestingEntity
 	 *            - Requesting Entity
 	 */
-	public static void deAnnounce(List<String> announceTo, ResourceEntity toBeDeAnnounced, String requestingEntity) {
-
+	public static void deAnnounce(AnnounceableSubordinateEntity toBeDeAnnounced, String requestingEntity) {
 		// get the database service
 		DBService dbs = PersistenceService.getInstance().getDbService();
 		DBTransaction transaction = dbs.getDbTransaction();
@@ -178,22 +177,150 @@
 
 		AnnouncedResourceUtil announceResourceUtil = dbs.getDBUtilManager().getAnnouncedResourceUtil();
 
-		for (String cseId : announceTo) {
-
-			CreatedAnnouncedResourceEntity are = announceResourceUtil.find(transaction, toBeDeAnnounced.getResourceID(),
-					cseId);
+		for (String cseId : toBeDeAnnounced.getAnnounceTo()) {
+			CreatedAnnouncedResourceEntity are = announceResourceUtil.find(transaction, 
+					toBeDeAnnounced.getResourceID(), cseId);
 			if (are != null) {
 				RequestPrimitive request = new RequestPrimitive();
 				request.setTo(are.getRemoteAnnouncedId());
 				request.setOperation(Operation.DELETE);
 				request.setFrom(requestingEntity);
 				Redirector.retarget(request);
-
 				announceResourceUtil.delete(transaction, are);
 			}
-
 		}
 		transaction.commit();
 		transaction.close();
 	}
+	
+	private static AnnouncedResource createAEAnnc(AE res) {
+		AEAnnc annc = new AEAnnc();
+		// Mandatory Announced
+		annc.setExpirationTime(res.getExpirationTime());
+//		annc.getAccessControlPolicyIDs().addAll(res.getAccessControlPolicyIDs());
+		annc.getLabels().addAll(res.getLabels());
+		// Optionally Announced
+		for (String aa : res.getAnnouncedAttribute()) {
+			switch(aa) {
+			case ShortName.APP_NAME: annc.setAppName(res.getAppName()); break;
+			case ShortName.APP_ID: annc.setAppID(res.getAppID()); break;
+			case ShortName.AE_ID: annc.setAEID(res.getAEID()); break;
+			case ShortName.POA: annc.getPointOfAccess().addAll(res.getPointOfAccess()); break;
+			case ShortName.ONTOLOGY_REF: annc.setOntologyRef(res.getOntologyRef()); break;
+			case ShortName.NODE_LINK: annc.setNodeLink(res.getNodeLink()); break;
+			}
+		}
+		return annc;
+	}
+
+	private static AnnouncedResource createFlexContainerAnnc(AbstractFlexContainer res) {
+		AbstractFlexContainerAnnc annc = FlexContainerFactory.getSpecializationFlexContainerAnnc(res.getShortName() + "Annc");
+		// Mandatory Announced
+		annc.setExpirationTime(res.getExpirationTime());
+//		annc.getAccessControlPolicyIDs().addAll(res.getAccessControlPolicyIDs());
+		annc.getLabels().addAll(res.getLabels());
+		for (String aa : res.getAnnouncedAttribute()) {
+			switch(aa) {
+			case ShortName.STATETAG: annc.setStateTag(res.getStateTag()); break;
+			case ShortName.ONTOLOGY_REF: annc.setOntologyRef(res.getOntologyRef()); break;
+			case ShortName.NODE_LINK: annc.setNodeLink(res.getNodeLink() + SUFFIX); break;
+			}
+		}
+		return annc;
+	}
+
+	private static AnnouncedResource createNodeAnnc(Node res) {
+		NodeAnnc annc = new NodeAnnc();
+		// Mandatory Announced
+		annc.setExpirationTime(res.getExpirationTime());
+//		annc.getAccessControlPolicyIDs().addAll(res.getAccessControlPolicyIDs());
+		annc.getLabels().addAll(res.getLabels());
+		annc.setNodeID(res.getNodeID());
+		// Optionally Announced
+		for (String aa : res.getAnnouncedAttribute()) {
+			switch(aa) {
+			case ShortName.HOSTED_CSE_LINK: annc.setHostedCSELink(res.getHostedCSELink()); break;
+			case ShortName.HOSTED_SRV_LINK: annc.setHostedServiceLinks(res.getHostedServiceLinks() + SUFFIX); break;
+			}
+		}
+		return annc;
+	}
+
+	private static AnnouncedResource createMgmtObjAnnc(MgmtObj res) {
+		AnnouncedMgmtResource annc = null;
+		BigInteger type = res.getMgmtDefinition();
+		if (type.equals(MgmtDefinitionTypes.AREA_NWK_INFO)) {
+			AreaNwkInfo ani = (AreaNwkInfo) res;
+			AreaNwkInfoAnnc ania = new AreaNwkInfoAnnc();
+			annc = ania;
+			for (String aa : res.getAnnouncedAttribute()) {
+				switch(aa) {
+				case ShortName.AREA_NWK_TYPE: ania.setAreaNwkType(ani.getAreaNwkType()); break;
+				}
+			}
+		}
+		else if (type.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO)) {
+			AreaNwkDeviceInfo andi = (AreaNwkDeviceInfo) res;
+			AreaNwkDeviceInfoAnnc andia = new AreaNwkDeviceInfoAnnc();
+			annc = andia;
+			for (String aa : res.getAnnouncedAttribute()) {
+				switch(aa) {
+				case ShortName.DEV_ID: andia.setDevID(andi.getDevID()); break;
+				case ShortName.DEV_TYPE: andia.setDevType(andi.getDevType()); break;
+				case ShortName.AREA_NWK_ID: andia.setAreaNwkId(andi.getAreaNwkId()); break;
+				case ShortName.SLEEP_INTERVAL: andia.setSleepInterval(andi.getSleepInterval()); break;
+				case ShortName.SLEEP_DURATION: andia.setSleepDuration(andi.getSleepDuration()); break;
+				case ShortName.STATUS: andia.setStatus(andi.getStatus()); break;
+				}
+			}
+		}
+		else if (type.equals(MgmtDefinitionTypes.DEVICE_INFO)) {
+			DeviceInfo di = (DeviceInfo) res;
+			DeviceInfoAnnc dia = new DeviceInfoAnnc();
+			annc = dia;
+			for (String aa : res.getAnnouncedAttribute()) {
+				switch(aa) {
+				case ShortName.DEVICE_LABEL: dia.setDeviceLabel(di.getDeviceLabel()); break;
+				case ShortName.MANUFACTURER: dia.setManufacturer(di.getManufacturer()); break;
+				case ShortName.DEVICE_MODEL: dia.setModel(di.getModel()); break;
+				case ShortName.DEVICE_TYPE: dia.setDeviceType(di.getDeviceType()); break;
+				case ShortName.FW_VERSION: dia.setFwVersion(di.getFwVersion()); break;
+				case ShortName.HW_VERSION: dia.setHwVersion(di.getHwVersion()); break;
+				case ShortName.OS_VERSION: dia.setOsVersion(di.getOsVersion()); break;
+				}
+			}
+		}
+		//	else if (type.equals(MgmtDefinitionTypes.FIRMWARE))
+		//		return new FirmwareAnnc();
+		//	else if (type.equals(MgmtDefinitionTypes.SOFTWARE))
+		//		return new SoftwareAnnc();
+		//	else if (type.equals(MgmtDefinitionTypes.MEMORY))
+		//		return new MemoryAnnc();
+		//	else if (type.equals(MgmtDefinitionTypes.BATTERY))
+		//		return new BatteryAnnc();
+		//	else if (type.equals(MgmtDefinitionTypes.DEVICE_CAPABILITY))
+		//		return new DeviceCapabilityAnnc();
+		//	else if (type.equals(MgmtDefinitionTypes.REBOOT))
+		//		return new RebootAnnc();
+		//	else if (type.equals(MgmtDefinitionTypes.EVENT_LOG))
+		//		return new EventLogAnnc();
+		
+		// Common attributes
+		if (annc != null) {
+			// Mandatory Announced
+			annc.setExpirationTime(res.getExpirationTime());
+//			annc.getAccessControlPolicyIDs().addAll(res.getAccessControlPolicyIDs());
+			annc.getLabels().addAll(res.getLabels());
+			// Optionally Announced
+			for (String aa : res.getAnnouncedAttribute()) {
+				switch(aa) {
+				case ShortName.OBJ_IDS: annc.getObjectIDs().addAll(res.getObjectIDs()); break;
+				case ShortName.OBJ_PATHS: annc.getObjectPaths().addAll(res.getObjectPaths()); break;
+				case ShortName.DESCRIPTION: annc.setDescription(res.getDescription()); break;
+				}
+			}
+		}
+		return annc;
+	}
+
 }
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/AEController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/AEController.java
index b23308c..9f3a129 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/AEController.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/AEController.java
@@ -336,11 +336,11 @@
 		// Commit the DB transaction & release lock
 		transaction.commit();
 		
-		if ((ae.getAnnounceTo() != null) && (!ae.getAnnounceTo().isEmpty())) {
+		if (! ae.getAnnounceTo().isEmpty()) {
 			ae.setName(aeDB.getName());
 			ae.setResourceID(aeDB.getResourceID());
 			ae.setResourceType(ResourceType.AE);
-			Announcer.announce(ae.getAnnounceTo(), ae.getAnnouncedAttribute(), ae, request.getFrom(), "");
+			Announcer.announce(ae, request.getFrom(), "");
 		}
 
 		// Create the response
@@ -603,9 +603,9 @@
 		transaction.commit();
 		
 		// deannounce
-		
-		Announcer.deAnnounce(aeEntity.getAnnounceTo(), aeEntity, Constants.ADMIN_REQUESTING_ENTITY);
-
+		if (! aeEntity.getAnnounceTo().isEmpty()) {
+			Announcer.deAnnounce(aeEntity, Constants.ADMIN_REQUESTING_ENTITY);
+		}
 		// Return rsc
 		response.setResponseStatusCode(ResponseStatusCode.DELETED);
 		return response;
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/DiscoveryController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/DiscoveryController.java
index 621f37c..2753fc5 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/DiscoveryController.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/DiscoveryController.java
@@ -41,7 +41,9 @@
 import org.eclipse.om2m.commons.entities.FlexContainerEntity;
 import org.eclipse.om2m.commons.entities.GroupEntity;
 import org.eclipse.om2m.commons.entities.LabelEntity;
+import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
 import org.eclipse.om2m.commons.entities.NodeEntity;
 import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
 import org.eclipse.om2m.commons.entities.ResourceEntity;
@@ -221,8 +223,12 @@
 			return ((FlexContainerAnncEntity) resourceEntity).getAccessControlPolicies();
 		case ResourceType.NODE:
 			return ((NodeEntity) resourceEntity).getAccessControlPolicies();
+		case ResourceType.NODE_ANNC:
+			return ((NodeAnncEntity) resourceEntity).getAccessControlPolicies();
 		case ResourceType.MGMT_OBJ:
 			return ((MgmtObjEntity)resourceEntity).getAccessControlPolicies();
+		case ResourceType.MGMT_OBJ_ANNC:
+			return ((MgmtObjAnncEntity)resourceEntity).getAccessControlPolicies();
 		default:
 			// TODO On implementing resource, add the reference here
 			return null;
@@ -267,11 +273,19 @@
 			case(ResourceType.NODE): 
 				result.addAll(labelEntity.getLinkedNodes());
 				break;
+			case(ResourceType.NODE_ANNC): 
+				result.addAll(labelEntity.getLinkedNodesA());
+				break;
 			case(ResourceType.MGMT_OBJ): 
 				result.addAll(labelEntity.getLinkedAni());
 				result.addAll(labelEntity.getLinkedAndi());
 				result.addAll(labelEntity.getLinkedDvi());
 				break;
+			case(ResourceType.MGMT_OBJ_ANNC): 
+				result.addAll(labelEntity.getLinkedAniA());
+				result.addAll(labelEntity.getLinkedAndiA());
+				result.addAll(labelEntity.getLinkedDviA());
+				break;
 			case(ResourceType.SUBSCRIPTION):
 				result.addAll(labelEntity.getLinkedSub());
 				break;
@@ -290,9 +304,13 @@
 			result.addAll(labelEntity.getLinkedFcntA());
 			result.addAll(labelEntity.getLinkedACP());
 			result.addAll(labelEntity.getLinkedNodes());
+			result.addAll(labelEntity.getLinkedNodesA());
 			result.addAll(labelEntity.getLinkedAni());
+			result.addAll(labelEntity.getLinkedAniA());
 			result.addAll(labelEntity.getLinkedAndi());
+			result.addAll(labelEntity.getLinkedAndiA());
 			result.addAll(labelEntity.getLinkedDvi());
+			result.addAll(labelEntity.getLinkedDviA());
 			result.addAll(labelEntity.getLinkedSub());
 		}
 		return result;
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FlexContainerAnncController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FlexContainerAnncController.java
index aee70c3..6de2d93 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FlexContainerAnncController.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FlexContainerAnncController.java
@@ -9,6 +9,8 @@
 
 import java.util.List;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.eclipse.om2m.commons.constants.Constants;
 import org.eclipse.om2m.commons.constants.MimeMediaType;
 import org.eclipse.om2m.commons.constants.Operation;
@@ -42,6 +44,10 @@
 
 public class FlexContainerAnncController extends Controller {
 
+	/** Logger */
+	private static Log LOGGER = LogFactory.getLog(FlexContainerAnncController.class);
+
+	@SuppressWarnings("unchecked")
 	@Override
 	public ResponsePrimitive doCreate(RequestPrimitive request) {
 		/*
@@ -160,6 +166,11 @@
 			flexContainerAnncEntity.setCreator(flexContainerAnnc.getCreator());
 		}
 
+		// nodeLink O
+		if (flexContainerAnnc.getNodeLink() != null) {
+			flexContainerAnncEntity.setNodeLink(flexContainerAnnc.getNodeLink());
+		}
+
 		// containerDefinition != null
 		if ((flexContainerAnnc.getContainerDefinition() == null) || (flexContainerAnnc.getContainerDefinition().isEmpty())) {
 			// the containerDefinition MUST be provided
@@ -168,6 +179,11 @@
 			flexContainerAnncEntity.setContainerDefinition(flexContainerAnnc.getContainerDefinition());
 		}
 
+		// ontologyRef O
+		if (flexContainerAnnc.getOntologyRef() != null) {
+			flexContainerAnncEntity.setOntologyRef(flexContainerAnnc.getOntologyRef());
+		}
+
 		// containerDefinition exists...
 		// TODO
 
@@ -183,10 +199,10 @@
 		}
 		flexContainerAnncEntity.setLongName(flexContainerAnnc.getLongName());
 		flexContainerAnncEntity.setShortName(flexContainerAnnc.getShortName());
-		flexContainerAnncEntity.setResourceID(
-				"/" + Constants.CSE_ID + "/" + ShortName.FCNTA + Constants.PREFIX_SEPERATOR + generatedId);
-		flexContainerAnncEntity
-				.setHierarchicalURI(parentEntity.getHierarchicalURI() + "/" + flexContainerAnncEntity.getName());
+		flexContainerAnncEntity.setResourceID("/" + Constants.CSE_ID + "/" + ShortName.FCNTA 
+				+ Constants.PREFIX_SEPERATOR + generatedId);
+		flexContainerAnncEntity.setHierarchicalURI(parentEntity.getHierarchicalURI() 
+				+ "/" + flexContainerAnncEntity.getName());
 		flexContainerAnncEntity.setParentID(parentEntity.getResourceID());
 		flexContainerAnncEntity.setResourceType(ResourceType.FLEXCONTAINER_ANNC);
 		switch(parentEntity.getResourceType().intValue()) {
@@ -217,11 +233,6 @@
 			throw new ConflictException("Name already present in the parent collection.");
 		}
 
-		// ontologyRef O
-		if (flexContainerAnnc.getOntologyRef() != null) {
-			flexContainerAnncEntity.setOntologyRef(flexContainerAnnc.getOntologyRef());
-		}
-
 		// custom attributes
 		// LOGGER.debug("nb of customAttributes: "
 		// + (flexContainer.getCustomAttributes() != null ?
@@ -330,115 +341,113 @@
 			originalResourceRequest.setReturnContentType(request.getReturnContentType());
 			originalResourceRequest.setContent(request.getContent());
 			return Redirector.retarget(originalResourceRequest);
+		}
+		// create the response base
+		ResponsePrimitive response = new ResponsePrimitive(request);
+
+		AbstractFlexContainerAnnc modifiedFlexCtr = new AbstractFlexContainerAnnc();
+		// check if content is present
+		if (request.getContent() == null) {
+			// content might be null for FlexContainer representing a SDT action
 		} else {
-			// create the response base
-			ResponsePrimitive response = new ResponsePrimitive(request);
-
-			AbstractFlexContainerAnnc modifiedAttributes = new AbstractFlexContainerAnnc();
-			// check if content is present
-			if (request.getContent() != null) {
-				// create the java object from the resource representation
-				// get the object from the representation
-				AbstractFlexContainerAnnc flexContainerAnnc = null;
-				try {
-					if (request.getRequestContentType().equals(MimeMediaType.OBJ)) {
-						flexContainerAnnc = (AbstractFlexContainerAnnc) request.getContent();
-					} else {
-						flexContainerAnnc = (AbstractFlexContainerAnnc) DataMapperSelector.getDataMapperList()
-								.get(request.getRequestContentType()).stringToObj((String) request.getContent());
-					}
-
-
-				} catch (ClassCastException e) {
-					throw new BadRequestException("Incorrect resource representation in content", e);
-				}
-				if (flexContainerAnnc == null) {
-					throw new BadRequestException("Error in provided content");
-				}
-
-				// check attributes, NP attributes are ignored
-				// @resourceName NP
-				// resourceType NP
-				// resourceID NP
-				// parentID NP
-				// creationTime NP
-				// creator NP
-				// lastModifiedTime NP
-				// currentNrOfInstances NP
-				// currentByteSize NP
-
-				// labels O
-				// accessControlPolicyIDs O
-				if (!flexContainerAnnc.getAccessControlPolicyIDs().isEmpty()) {
-					flexContainerAnncEntity.getAccessControlPolicies().clear();
-					flexContainerAnncEntity.setAccessControlPolicies(
-							ControllerUtil.buildAcpEntityList(flexContainerAnnc.getAccessControlPolicyIDs(), transaction));
-					modifiedAttributes.getAccessControlPolicyIDs().addAll(flexContainerAnnc.getAccessControlPolicyIDs());
-				}
-				// dynamicAuthorizationConsultationIDs O
-				if (!flexContainerAnnc.getDynamicAuthorizationConsultationIDs().isEmpty()) {
-					flexContainerAnncEntity.setDynamicAuthorizationConsultations(
-							ControllerUtil.buildDacEntityList(flexContainerAnnc.getDynamicAuthorizationConsultationIDs(), transaction));
-					
-					// update link with flexContainerAnncEntity - DacEntity
-					for(DynamicAuthorizationConsultationEntity dace : flexContainerAnncEntity.getDynamicAuthorizationConsultations()) {
-						DynamicAuthorizationConsultationEntity daceFromDB = dbs.getDAOFactory().getDynamicAuthorizationDAO().find(transaction, dace.getResourceID());
-						daceFromDB.getLinkedFlexContainerAnncEntities().add(flexContainerAnncEntity);
-						dbs.getDAOFactory().getDynamicAuthorizationDAO().update(transaction, daceFromDB);
-					}
-				}
-				// labels O
-				if (!flexContainerAnnc.getLabels().isEmpty()) {
-					flexContainerAnncEntity.setLabelsEntitiesFromSring(flexContainerAnnc.getLabels());
-					modifiedAttributes.getLabels().addAll(flexContainerAnnc.getLabels());
-				}
-				// expirationTime O
-				if (flexContainerAnnc.getExpirationTime() != null) {
-					flexContainerAnncEntity.setExpirationTime(flexContainerAnnc.getExpirationTime());
-					modifiedAttributes.setExpirationTime(flexContainerAnnc.getExpirationTime());
-				}
-				
-				// ontologyRef O
-				if (flexContainerAnnc.getOntologyRef() != null) {
-					flexContainerAnncEntity.setOntologyRef(flexContainerAnnc.getOntologyRef());
-					modifiedAttributes.setOntologyRef(flexContainerAnnc.getOntologyRef());
-				}
-
-				// containerDef
-				if ((flexContainerAnnc.getContainerDefinition() != null)
-						&& (!flexContainerAnncEntity.getContainerDefinition().equals(flexContainerAnnc.getContainerDefinition()))) {
-					throw new BadRequestException("unable to change the containerDefinition value");
+			// create the java object from the resource representation
+			// get the object from the representation
+			AbstractFlexContainerAnnc flexContainerAnnc = null;
+			try {
+				if (request.getRequestContentType().equals(MimeMediaType.OBJ)) {
+					flexContainerAnnc = (AbstractFlexContainerAnnc) request.getContent();
+				} else {
+					flexContainerAnnc = (AbstractFlexContainerAnnc) DataMapperSelector.getDataMapperList()
+							.get(request.getRequestContentType()).stringToObj((String) request.getContent());
 				}
 
 
-			} else {
-				// content might be null for FlexContainer representing a SDT action
+			} catch (ClassCastException e) {
+				throw new BadRequestException("Incorrect resource representation in content", e);
+			}
+			if (flexContainerAnnc == null) {
+				throw new BadRequestException("Error in provided content");
 			}
 
-			flexContainerAnncEntity.setLastModifiedTime(DateUtil.now());
-			modifiedAttributes.setLastModifiedTime(flexContainerAnncEntity.getLastModifiedTime());
+			// check attributes, NP attributes are ignored
+			// @resourceName NP
+			// resourceType NP
+			// resourceID NP
+			// parentID NP
+			// creationTime NP
+			// creator NP
+			// lastModifiedTime NP
+			// currentNrOfInstances NP
+			// currentByteSize NP
 
+			// labels O
+			// accessControlPolicyIDs O
+			if (!flexContainerAnnc.getAccessControlPolicyIDs().isEmpty()) {
+				flexContainerAnncEntity.getAccessControlPolicies().clear();
+				flexContainerAnncEntity.setAccessControlPolicies(
+						ControllerUtil.buildAcpEntityList(flexContainerAnnc.getAccessControlPolicyIDs(), transaction));
+				modifiedFlexCtr.getAccessControlPolicyIDs().addAll(flexContainerAnnc.getAccessControlPolicyIDs());
+			}
+			// dynamicAuthorizationConsultationIDs O
+			if (!flexContainerAnnc.getDynamicAuthorizationConsultationIDs().isEmpty()) {
+				flexContainerAnncEntity.setDynamicAuthorizationConsultations(
+						ControllerUtil.buildDacEntityList(flexContainerAnnc.getDynamicAuthorizationConsultationIDs(), transaction));
 
-			// at this point, we are sure there was no error when setting custom
-			// attribute parameter
+				// update link with flexContainerAnncEntity - DacEntity
+				for(DynamicAuthorizationConsultationEntity dace : flexContainerAnncEntity.getDynamicAuthorizationConsultations()) {
+					DynamicAuthorizationConsultationEntity daceFromDB = dbs.getDAOFactory().getDynamicAuthorizationDAO().find(transaction, dace.getResourceID());
+					daceFromDB.getLinkedFlexContainerAnncEntities().add(flexContainerAnncEntity);
+					dbs.getDAOFactory().getDynamicAuthorizationDAO().update(transaction, daceFromDB);
+				}
+			}
+			// labels O
+			if (!flexContainerAnnc.getLabels().isEmpty()) {
+				flexContainerAnncEntity.setLabelsEntitiesFromSring(flexContainerAnnc.getLabels());
+				modifiedFlexCtr.getLabels().addAll(flexContainerAnnc.getLabels());
+			}
+			// expirationTime O
+			if (flexContainerAnnc.getExpirationTime() != null) {
+				flexContainerAnncEntity.setExpirationTime(flexContainerAnnc.getExpirationTime());
+				modifiedFlexCtr.setExpirationTime(flexContainerAnnc.getExpirationTime());
+			}
 
-			response.setContent(modifiedAttributes);
-			// update the resource in the database
-			dbs.getDAOFactory().getFlexContainerAnncDAO().update(transaction, flexContainerAnncEntity);
-			
-			// commit transaction & unlock current entity
-			transaction.commit();
+			// ontologyRef O
+			if (flexContainerAnnc.getOntologyRef() != null) {
+				flexContainerAnncEntity.setOntologyRef(flexContainerAnnc.getOntologyRef());
+				modifiedFlexCtr.setOntologyRef(flexContainerAnnc.getOntologyRef());
+			}
+			// nodeLink O
+			if (flexContainerAnnc.getNodeLink() != null) {
+				flexContainerAnncEntity.setNodeLink(flexContainerAnnc.getNodeLink());
+				modifiedFlexCtr.setNodeLink(flexContainerAnnc.getNodeLink());
+			}
 
-			Notifier.notify(flexContainerAnncEntity.getSubscriptions(), flexContainerAnncEntity, modifiedAttributes,
-					ResourceStatus.UPDATED);
-
-			// set response status code
-			response.setResponseStatusCode(ResponseStatusCode.UPDATED);
-			return response;			
-			
-			
+			// containerDef
+			if ((flexContainerAnnc.getContainerDefinition() != null)
+					&& (!flexContainerAnncEntity.getContainerDefinition().equals(flexContainerAnnc.getContainerDefinition()))) {
+				throw new BadRequestException("unable to change the containerDefinition value");
+			}
 		}
 
+		flexContainerAnncEntity.setLastModifiedTime(DateUtil.now());
+		modifiedFlexCtr.setLastModifiedTime(flexContainerAnncEntity.getLastModifiedTime());
+
+		// at this point, we are sure there was no error when setting custom
+		// attribute parameter
+
+		response.setContent(modifiedFlexCtr);
+		// update the resource in the database
+		dbs.getDAOFactory().getFlexContainerAnncDAO().update(transaction, flexContainerAnncEntity);
+
+		// commit transaction & unlock current entity
+		transaction.commit();
+
+		Notifier.notify(flexContainerAnncEntity.getSubscriptions(), flexContainerAnncEntity, 
+				modifiedFlexCtr, ResourceStatus.UPDATED);
+
+		// set response status code
+		response.setResponseStatusCode(ResponseStatusCode.UPDATED);
+		return response;			
 	}
 
 	@Override
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FlexContainerController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FlexContainerController.java
index 617bd19..9e047c8 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FlexContainerController.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/FlexContainerController.java
@@ -9,6 +9,8 @@
 
 import java.util.List;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.eclipse.om2m.commons.constants.Constants;
 import org.eclipse.om2m.commons.constants.MimeMediaType;
 import org.eclipse.om2m.commons.constants.ResourceStatus;
@@ -53,6 +55,9 @@
  */
 public class FlexContainerController extends Controller {
 
+	/** Logger */
+	private static Log LOGGER = LogFactory.getLog(FlexContainerController.class);
+
 	/**
 	 * Create the resource in the system according to the representation
 	 */
@@ -299,7 +304,7 @@
 		// commit the transaction & release lock
 		transaction.commit();
 
-		if ((flexContainer.getAnnounceTo() != null) && (!flexContainer.getAnnounceTo().isEmpty())) {
+		if (! flexContainer.getAnnounceTo().isEmpty()) {
 			flexContainer.setName(flexContainerFromDB.getName());
 			flexContainer.setResourceID(flexContainerFromDB.getResourceID());
 			flexContainer.setResourceType(ResourceType.FLEXCONTAINER);
@@ -307,8 +312,7 @@
 			String hierachicalURI = flexContainerFromDB.getHierarchicalURI();
 			String remoteLocation = hierachicalURI
 					.substring(("/" + Constants.CSE_ID + "/" + Constants.CSE_NAME + "/").length());
-			Announcer.announce(flexContainer.getAnnounceTo(), flexContainer.getAnnouncedAttribute(), flexContainer,
-					request.getFrom(), remoteLocation);
+			Announcer.announce(flexContainer, request.getFrom(), remoteLocation);
 		}
 
 		Notifier.notify(subscriptions, flexContainerFromDB, ResourceStatus.CHILD_CREATED);
@@ -410,9 +414,11 @@
 			checkPermissions(request, flexContainerEntity, flexContainerEntity.getAccessControlPolicies());
 		}
 
-		AbstractFlexContainer modifiedAttributes = /*new FlexContainer()*/ FlexContainerFactory.getSpecializationFlexContainer(flexContainerEntity.getShortName());
+		AbstractFlexContainer modifiedFlexCtr = FlexContainerFactory.getSpecializationFlexContainer(flexContainerEntity.getShortName());
 		// check if content is present
-		if (request.getContent() != null) {
+		if (request.getContent() == null) {
+			// content might be null for FlexContainer representing a SDT action
+		} else {
 			// create the java object from the resource representation
 			// get the object from the representation
 			AbstractFlexContainer flexContainer = null;
@@ -423,16 +429,13 @@
 					// need to create the payload in order to validate it
 					payload = DataMapperSelector.getDataMapperList().get(contentFormat)
 							.objToString(flexContainer);
-
 				} else {
 					flexContainer = (AbstractFlexContainer) DataMapperSelector.getDataMapperList()
 							.get(request.getRequestContentType()).stringToObj((String) request.getContent());
-
 					if (request.getRequestContentType().equals(contentFormat)) {
 						payload = (String) request.getContent();
 					} else {
-						// need to create the XML payload in order to validate
-						// it
+						// need to create the XML payload in order to validate it
 						payload = DataMapperSelector.getDataMapperList().get(contentFormat)
 								.objToString(flexContainer);
 					}
@@ -442,7 +445,6 @@
 				if (contentFormat.equals(MimeMediaType.XML)) {
 					FlexContainerXMLValidator.validateXMLPayload(payload, flexContainer.getContainerDefinition());
 				}
-
 			} catch (ClassCastException e) {
 				throw new BadRequestException("Incorrect resource representation in content", e);
 			}
@@ -467,7 +469,7 @@
 				flexContainerEntity.getAccessControlPolicies().clear();
 				flexContainerEntity.setAccessControlPolicies(
 						ControllerUtil.buildAcpEntityList(flexContainer.getAccessControlPolicyIDs(), transaction));
-				modifiedAttributes.getAccessControlPolicyIDs().addAll(flexContainer.getAccessControlPolicyIDs());
+				modifiedFlexCtr.getAccessControlPolicyIDs().addAll(flexContainer.getAccessControlPolicyIDs());
 			}
 			
 			// dynamicAuthorizationConsultationIDs O
@@ -486,37 +488,36 @@
 			// labels O
 			if (!flexContainer.getLabels().isEmpty()) {
 				flexContainerEntity.setLabelsEntitiesFromSring(flexContainer.getLabels());
-				modifiedAttributes.getLabels().addAll(flexContainer.getLabels());
+				modifiedFlexCtr.getLabels().addAll(flexContainer.getLabels());
 			}
 			// expirationTime O
 			if (flexContainer.getExpirationTime() != null) {
 				flexContainerEntity.setExpirationTime(flexContainer.getExpirationTime());
-				modifiedAttributes.setExpirationTime(flexContainer.getExpirationTime());
+				modifiedFlexCtr.setExpirationTime(flexContainer.getExpirationTime());
 			}
 			// announceTo O
 			if (!flexContainer.getAnnounceTo().isEmpty()) {
 				// TODO Announcement in AE update
 				flexContainerEntity.getAnnounceTo().clear();
 				flexContainerEntity.getAnnounceTo().addAll(flexContainer.getAnnounceTo());
-				modifiedAttributes.getAnnounceTo().addAll(flexContainer.getAnnounceTo());
+				modifiedFlexCtr.getAnnounceTo().addAll(flexContainer.getAnnounceTo());
 			}
 			// announcedAttribute O
 			if (!flexContainer.getAnnouncedAttribute().isEmpty()) {
 				flexContainerEntity.getAnnouncedAttribute().clear();
 				flexContainerEntity.getAnnouncedAttribute().addAll(flexContainer.getAnnouncedAttribute());
-				modifiedAttributes.getAnnouncedAttribute().addAll(flexContainer.getAnnouncedAttribute());
+				modifiedFlexCtr.getAnnouncedAttribute().addAll(flexContainer.getAnnouncedAttribute());
 			}
 			// ontologyRef O
 			if (flexContainer.getOntologyRef() != null) {
 				flexContainerEntity.setOntologyRef(flexContainer.getOntologyRef());
-				modifiedAttributes.setOntologyRef(flexContainer.getOntologyRef());
+				modifiedFlexCtr.setOntologyRef(flexContainer.getOntologyRef());
 			}
 			// nodeLink O
 			if (flexContainer.getNodeLink() != null) {
 				flexContainerEntity.setNodeLink(flexContainer.getNodeLink());
-				modifiedAttributes.setNodeLink(flexContainer.getNodeLink());
+				modifiedFlexCtr.setNodeLink(flexContainer.getNodeLink());
 			}
-
 			// containerDef
 			if ((flexContainer.getContainerDefinition() != null)
 					&& (!flexContainerEntity.getContainerDefinition().equals(flexContainer.getContainerDefinition()))) {
@@ -529,28 +530,23 @@
 					flexContainerEntity.createOrUpdateCustomAttribute(ca.getCustomAttributeName(),
 							ca.getCustomAttributeValue());
 				}
-				modifiedAttributes.setCustomAttributes(flexContainer.getCustomAttributes());
+				modifiedFlexCtr.setCustomAttributes(flexContainer.getCustomAttributes());
 			}
-
-		} else {
-			// content might be null for FlexContainer representing a SDT action
 		}
 
 		flexContainerEntity.setLastModifiedTime(DateUtil.now());
-		modifiedAttributes.setLastModifiedTime(flexContainerEntity.getLastModifiedTime());
+		modifiedFlexCtr.setLastModifiedTime(flexContainerEntity.getLastModifiedTime());
 
 		// in case of update operation
 		if (!isInternalNotify) {
-			LOGGER.info("flexContainer.getResourceID=" + flexContainerEntity.getResourceID());
 			// check if a FlexContainerService exist
 			FlexContainerService fcs = FlexContainerSelector.getFlexContainerService(
 					/* request.getTo() */ /* UriUtil.toCseRelativeUri( */flexContainerEntity.getResourceID()/* ) */);
 			if (fcs != null) {
 				try {
-					fcs.setCustomAttributeValues(modifiedAttributes.getCustomAttributes(), request);
+					fcs.setCustomAttributeValues(modifiedFlexCtr.getCustomAttributes(), request);
 					// at this modifiedAttributes.getCustomAttributes() list
 					// contains the new values of CustomAttribute
-
 				} catch (Om2mException e) {
 					throw e;
 				}
@@ -560,14 +556,14 @@
 		// at this point, we are sure there was no error when setting custom
 		// attribute parameter
 
-		response.setContent(modifiedAttributes);
+		response.setContent(modifiedFlexCtr);
 		// update the resource in the database
 		dbs.getDAOFactory().getFlexContainerDAO().update(transaction, flexContainerEntity);
 
 		// commit and release lock
 		transaction.commit();
 
-		Notifier.notify(flexContainerEntity.getSubscriptions(), flexContainerEntity, modifiedAttributes,
+		Notifier.notify(flexContainerEntity.getSubscriptions(), flexContainerEntity, modifiedFlexCtr,
 				ResourceStatus.UPDATED);
 
 		// set response status code
@@ -590,7 +586,6 @@
 			LOGGER.info("Delete flexCnt: not found");
 			throw new ResourceNotFoundException("Resource not found");
 		}
-		LOGGER.info("Delete flexCnt " + flexContainerEntity);
 
 		// lock entity
 		transaction.lock(flexContainerEntity);
@@ -607,11 +602,10 @@
 		// commit the transaction & release lock
 		transaction.commit();
 		
-		String nodeLink = flexContainerEntity.getNodeLink();
-
 		// deannounce
-		Announcer.deAnnounce(flexContainerEntity.getAnnounceTo(), flexContainerEntity,
-				Constants.ADMIN_REQUESTING_ENTITY);
+		if (! flexContainerEntity.getAnnounceTo().isEmpty()) {
+			Announcer.deAnnounce(flexContainerEntity, Constants.ADMIN_REQUESTING_ENTITY);
+		}
 
 		// return the response
 		response.setResponseStatusCode(ResponseStatusCode.DELETED);
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/MgmtObjAnncController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/MgmtObjAnncController.java
index b958852..73147b2 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/MgmtObjAnncController.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/MgmtObjAnncController.java
@@ -22,7 +22,7 @@
 import org.eclipse.om2m.commons.entities.AccessControlPolicyEntity;
 import org.eclipse.om2m.commons.entities.DynamicAuthorizationConsultationEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
-import org.eclipse.om2m.commons.entities.NodeEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
 import org.eclipse.om2m.commons.entities.ResourceEntity;
 import org.eclipse.om2m.commons.entities.SubscriptionEntity;
 import org.eclipse.om2m.commons.exceptions.BadRequestException;
@@ -42,7 +42,7 @@
 import org.eclipse.om2m.persistence.service.DAO;
 
 /**
- * Controller for the MgmtObj Resource
+ * Controller for the MgmtObjAnnc Resource
  *
  */
 public class MgmtObjAnncController extends Controller {
@@ -57,7 +57,7 @@
 	@Override
 	public ResponsePrimitive doCreate(RequestPrimitive request) {
 		/*
-		 * MgmtObj creation procedure
+		 * MgmtObjAnnc creation procedure
 		 * 
 		 * @resourceName NP resourceType NP resourceID NP parentID NP
 		 * accessControlPolicyIDs O creationTime NP expirationTime O
@@ -85,32 +85,28 @@
 		if (parentEntity == null) {
 			throw new ResourceNotFoundException("Cannot find parent resource");
 		}
-
-		// lock parent
-		transaction.lock(parentEntity);
-
-		if (parentEntity.getResourceType().intValue() == (ResourceType.NODE_ANNC)) {
-			throw new NotImplementedException("Parent is Node Annc, not implemented yet.");
+		if (parentEntity.getResourceType().intValue() != (ResourceType.NODE_ANNC)) {
+			throw new NotImplementedException("Parent should be NodeAnnc: " + parentEntity);
 		}
 
+		// lock parent
+//		transaction.lock(parentEntity);
+
 		// parent is Node
-		NodeEntity nodeEntity = (NodeEntity) parentEntity;
+		NodeAnncEntity nodeEntity = (NodeAnncEntity) parentEntity;
 
 		// get lists to change in the method corresponding to specific object
 		List<AccessControlPolicyEntity> acpsToCheck = nodeEntity.getAccessControlPolicies();
 //		List<DynamicAuthorizationConsultationEntity> dacsToCheck = null;
-		List<SubscriptionEntity> subscriptions = nodeEntity.getSubscriptions();
+		List<SubscriptionEntity> subscriptions = nodeEntity.getChildSubscriptions();
 
 		// check access control policy of the originator
 		checkPermissions(request, nodeEntity, acpsToCheck);
 		
 		// check if content is present
 		if (request.getContent() == null) {
-			throw new BadRequestException("A content is requiered for MgmtObj creation");
+			throw new BadRequestException("A content is requiered for MgmtObjAnnc creation");
 		}
-		LOGGER.info("contentType: " + request.getRequestContentType());
-		LOGGER.info("content: " + request.getContent());
-		LOGGER.info("parent node: " + nodeEntity);
 		// get the object from the representation
 		AnnouncedMgmtResource mgmtObj = null;
 		try {
@@ -129,7 +125,6 @@
 					payload = DataMapperSelector.getDataMapperList().get(contentFormat).objToString(mgmtObj);
 				}
 			}
-			LOGGER.info("payload: " + payload);
 
 			// validate XML payload
 //			if (contentFormat.equals(MimeMediaType.XML)) {
@@ -144,7 +139,6 @@
 		if (mgmtObj == null) {
 			throw new BadRequestException("Error in provided content");
 		}
-		else LOGGER.info("MgmtObj: " + mgmtObj.getClass() +  ": " + mgmtObj);
 		
 		BigInteger mgmtDef = mgmtObj.getMgmtDefinition();
 
@@ -152,7 +146,13 @@
 		MgmtObjAnncEntity mgmtObjEntity = MgmtObjAnncEntity.create(mgmtDef);
 
 		ControllerUtil.CreateUtil.fillEntityFromGenericResource(mgmtObj, mgmtObjEntity);
-		
+
+		if (mgmtObj.getLink() == null) {
+			throw new BadRequestException("Link is Mandatory");
+		} else {
+			mgmtObjEntity.setLink(mgmtObj.getLink());
+		}
+
 		mgmtObjEntity.fillFrom(mgmtObj);
 
 		String generatedId = generateId("", "");
@@ -165,11 +165,13 @@
 		} else {
 			mgmtObjEntity.setName(MgmtDefinitionTypes.getShortName(mgmtDef) + "_" + generatedId);
 		}
-		mgmtObjEntity.setResourceID("/" + Constants.CSE_ID + "/" + ShortName.MGO 
+		mgmtObjEntity.setResourceID("/" + Constants.CSE_ID + "/" + ShortName.MGOA
 				+ Constants.PREFIX_SEPERATOR + generatedId);
-		mgmtObjEntity.setHierarchicalURI(parentEntity.getHierarchicalURI() + "/" + mgmtObjEntity.getName());
-		mgmtObjEntity.setParentID(parentEntity.getResourceID());
-		mgmtObjEntity.setResourceType(ResourceType.MGMT_OBJ);
+		mgmtObjEntity.setHierarchicalURI(nodeEntity.getHierarchicalURI() + "/" + mgmtObjEntity.getName());
+		mgmtObjEntity.setParentID(nodeEntity.getResourceID());
+		mgmtObjEntity.setResourceType(ResourceType.MGMT_OBJ_ANNC);
+		mgmtObjEntity.setCreationTime(DateUtil.now());
+		mgmtObjEntity.setLastModifiedTime(DateUtil.now());
 
 		// accessControlPolicyIDs O
 		if (! mgmtObj.getAccessControlPolicyIDs().isEmpty()) {
@@ -186,26 +188,23 @@
 		}
 
 		if (! UriMapper.addNewUri(mgmtObjEntity.getHierarchicalURI(), mgmtObjEntity.getResourceID(),
-				ResourceType.MGMT_OBJ)) {
+				ResourceType.MGMT_OBJ_ANNC)) {
 			throw new ConflictException("Name already present in the parent collection.");
 		}
 
 		// create the mgmtObj in the DB
-		LOGGER.info("persist " + mgmtObjEntity + " ");
 		dbs.getDAOFactory().getMgmtObjAnncDAO().create(transaction, mgmtObjEntity);
 		// retrieve the managed object from DB
 		MgmtObjAnncEntity mgmtObjFromDB = dbs.getDAOFactory().getMgmtObjAnncDAO().find(transaction,
 				mgmtObjEntity.getResourceID());
 		
-		LOGGER.info("Created entity: " + mgmtObjFromDB);
-		
-//		nodeEntity.addMgmtObj(mgmtObjFromDB); TODO
+		nodeEntity.addMgmtObj(mgmtObjFromDB);
 		nodeDao.update(transaction, nodeEntity);
 
 		// update link with mgmtObjEntity - DacEntity
 		for (DynamicAuthorizationConsultationEntity dace : mgmtObjFromDB.getDynamicAuthorizationConsultations()) {
 			DynamicAuthorizationConsultationEntity daceFromDB = dbs.getDAOFactory().getDynamicAuthorizationDAO().find(transaction, dace.getResourceID());
-//			daceFromDB.addMgmtObj(mgmtObjFromDB); TODO
+			daceFromDB.addMgmtObj(mgmtObjFromDB);
 			dbs.getDAOFactory().getDynamicAuthorizationDAO().update(transaction, daceFromDB);
 		}
 
@@ -312,7 +311,7 @@
 			checkPermissions(request, mgmtObjEntity, mgmtObjEntity.getAccessControlPolicies());
 		}
 
-		AnnouncedMgmtResource modifiedMgmtObj = (AnnouncedMgmtResource) 
+		AnnouncedMgmtResource modifiedMgmtObjAnnc = (AnnouncedMgmtResource) 
 			EntityMapperFactory.getMapperForMgmtObjAnnc()
 				.mapEntityToResource(mgmtObjEntity, request);
 		// check if content is present
@@ -371,7 +370,7 @@
 				mgmtObjEntity.getAccessControlPolicies().clear();
 				mgmtObjEntity.setAccessControlPolicies(
 						ControllerUtil.buildAcpEntityList(mgmtObj.getAccessControlPolicyIDs(), transaction));
-				modifiedMgmtObj.getAccessControlPolicyIDs().addAll(mgmtObj.getAccessControlPolicyIDs());
+				modifiedMgmtObjAnnc.getAccessControlPolicyIDs().addAll(mgmtObj.getAccessControlPolicyIDs());
 			}
 			
 			// dynamicAuthorizationConsultationIDs O
@@ -380,14 +379,9 @@
 						ControllerUtil.buildDacEntityList(mgmtObj.getDynamicAuthorizationConsultationIDs(), transaction));
 				
 				// update link with mgmtObjEntity - DacEntity
-				for(DynamicAuthorizationConsultationEntity dace : mgmtObjEntity.getDynamicAuthorizationConsultations()) {
+				for (DynamicAuthorizationConsultationEntity dace : mgmtObjEntity.getDynamicAuthorizationConsultations()) {
 					DynamicAuthorizationConsultationEntity daceFromDB = dbs.getDAOFactory().getDynamicAuthorizationDAO().find(transaction, dace.getResourceID());
-//					if (mgmtObj instanceof DeviceInfo) TODO
-//						daceFromDB.getLinkedDeviceInfoEntities().add((DeviceInfoEntity) mgmtObjEntity);
-//					else if (mgmtObj instanceof AreaNwkDeviceInfo)
-//						daceFromDB.getLinkedAreaNwkDeviceInfoEntities().add((AreaNwkDeviceInfoEntity) mgmtObjEntity);
-//					else if (mgmtObj instanceof AreaNwkInfo)
-//						daceFromDB.getLinkedAreaNwkInfoEntities().add((AreaNwkInfoEntity) mgmtObjEntity);
+					daceFromDB.addMgmtObj(mgmtObjEntity);
 					dbs.getDAOFactory().getDynamicAuthorizationDAO().update(transaction, daceFromDB);
 				}
 			}
@@ -395,12 +389,12 @@
 			// labels O
 			if (! mgmtObj.getLabels().isEmpty()) {
 				mgmtObjEntity.setLabelsEntitiesFromSring(mgmtObj.getLabels());
-				modifiedMgmtObj.getLabels().addAll(mgmtObj.getLabels());
+				modifiedMgmtObjAnnc.getLabels().addAll(mgmtObj.getLabels());
 			}
 			// expirationTime O
 			if (mgmtObj.getExpirationTime() != null) {
 				mgmtObjEntity.setExpirationTime(mgmtObj.getExpirationTime());
-				modifiedMgmtObj.setExpirationTime(mgmtObj.getExpirationTime());
+				modifiedMgmtObjAnnc.setExpirationTime(mgmtObj.getExpirationTime());
 			}
 
 			// mgmtDefinition
@@ -411,16 +405,16 @@
 		}
 
 		mgmtObjEntity.setLastModifiedTime(DateUtil.now());
-		modifiedMgmtObj.setLastModifiedTime(mgmtObjEntity.getLastModifiedTime());
+		modifiedMgmtObjAnnc.setLastModifiedTime(mgmtObjEntity.getLastModifiedTime());
 
-		response.setContent(modifiedMgmtObj);
+		response.setContent(modifiedMgmtObjAnnc);
 		// update the resource in the database
 		dbs.getDAOFactory().getMgmtObjAnncDAO().update(transaction, mgmtObjEntity);
 
 		// commit and release lock
 		transaction.commit();
 
-		Notifier.notify(mgmtObjEntity.getSubscriptions(), mgmtObjEntity, modifiedMgmtObj,
+		Notifier.notify(mgmtObjEntity.getSubscriptions(), mgmtObjEntity, modifiedMgmtObjAnnc,
 				ResourceStatus.UPDATED);
 
 		// set response status code
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/MgmtObjController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/MgmtObjController.java
index d4f63f8..be03107 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/MgmtObjController.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/MgmtObjController.java
@@ -75,25 +75,24 @@
 		ResponsePrimitive response = new ResponsePrimitive(request);
 
 		// get the dao of the parent
-		DAO<ResourceEntity> nodeDao = (DAO<ResourceEntity>) patterns.getDAO(request.getTo(), dbs);
-		if (nodeDao == null) {
+		DAO<ResourceEntity> dao = (DAO<ResourceEntity>) patterns.getDAO(request.getTo(), dbs);
+		if (dao == null) {
 			throw new ResourceNotFoundException("Cannot find parent resource");
 		}
 
 		// get the parent entity
-		ResourceEntity parentEntity = (ResourceEntity) nodeDao.find(transaction, request.getTo());
+		ResourceEntity parentEntity = (ResourceEntity) dao.find(transaction, request.getTo());
 		// check the parent existence
 		if (parentEntity == null) {
 			throw new ResourceNotFoundException("Cannot find parent resource");
 		}
-
-		// lock parent
-		transaction.lock(parentEntity);
-
 		if (parentEntity.getResourceType().intValue() == (ResourceType.NODE_ANNC)) {
 			throw new NotImplementedException("Parent is Node Annc, not implemented yet.");
 		}
 
+		// lock parent
+		transaction.lock(parentEntity);
+
 		// parent is Node
 		NodeEntity nodeEntity = (NodeEntity) parentEntity;
 
@@ -109,9 +108,6 @@
 		if (request.getContent() == null) {
 			throw new BadRequestException("A content is requiered for MgmtObj creation");
 		}
-		LOGGER.info("contentType: " + request.getRequestContentType());
-		LOGGER.info("content: " + request.getContent());
-		LOGGER.info("parent node: " + nodeEntity);
 		// get the object from the representation
 		MgmtObj mgmtObj = null;
 		try {
@@ -145,7 +141,6 @@
 		if (mgmtObj == null) {
 			throw new BadRequestException("Error in provided content");
 		}
-		else LOGGER.info("MgmtObj: " + mgmtObj.getClass() +  ": " + mgmtObj);
 		
 		BigInteger mgmtDef = mgmtObj.getMgmtDefinition();
 
@@ -168,8 +163,9 @@
 		}
 		mgmtObjEntity.setResourceID("/" + Constants.CSE_ID + "/" + ShortName.MGO 
 				+ Constants.PREFIX_SEPERATOR + generatedId);
-		mgmtObjEntity.setHierarchicalURI(parentEntity.getHierarchicalURI() + "/" + mgmtObjEntity.getName());
-		mgmtObjEntity.setParentID(parentEntity.getResourceID());
+		mgmtObjEntity.setParentNode(nodeEntity);
+		mgmtObjEntity.setHierarchicalURI(nodeEntity.getHierarchicalURI() + "/" + mgmtObjEntity.getName());
+		mgmtObjEntity.setParentID(nodeEntity.getResourceID());
 		mgmtObjEntity.setResourceType(ResourceType.MGMT_OBJ);
 
 		// accessControlPolicyIDs O
@@ -192,16 +188,13 @@
 		}
 
 		// create the mgmtObj in the DB
-		LOGGER.info("persist " + mgmtObjEntity + " ");
 		dbs.getDAOFactory().getMgmtObjDAO().create(transaction, mgmtObjEntity);
 		// retrieve the managed object from DB
 		MgmtObjEntity mgmtObjFromDB = dbs.getDAOFactory().getMgmtObjDAO().find(transaction,
 				mgmtObjEntity.getResourceID());
 		
-		LOGGER.info("Created entity: " + mgmtObjFromDB);
-		
 		nodeEntity.addMgmtObj(mgmtObjFromDB);
-		nodeDao.update(transaction, nodeEntity);
+		dao.update(transaction, nodeEntity);
 
 		// update link with mgmtObjEntity - DacEntity
 		for (DynamicAuthorizationConsultationEntity dace : mgmtObjFromDB.getDynamicAuthorizationConsultations()) {
@@ -213,16 +206,12 @@
 		// commit the transaction & release lock
 		transaction.commit();
 
-		if ((mgmtObj.getAnnounceTo() != null) && ! mgmtObj.getAnnounceTo().isEmpty()) {
+		if (! mgmtObj.getAnnounceTo().isEmpty()) {
 			mgmtObj.setName(mgmtObjFromDB.getName());
 			mgmtObj.setResourceID(mgmtObjFromDB.getResourceID());
 			mgmtObj.setResourceType(ResourceType.MGMT_OBJ);
 			mgmtObj.setParentID(mgmtObjFromDB.getParentID());
-			String hierachicalURI = mgmtObjFromDB.getHierarchicalURI();
-			String remoteLocation = hierachicalURI
-					.substring(("/" + Constants.CSE_ID + "/" + Constants.CSE_NAME + "/").length());
-			Announcer.announce(mgmtObj.getAnnounceTo(), mgmtObj.getAnnouncedAttribute(), mgmtObj,
-					request.getFrom(), remoteLocation);
+			Announcer.announce(mgmtObj, request.getFrom(), "");
 		}
 
 		Notifier.notify(subscriptions, mgmtObjFromDB, ResourceStatus.CHILD_CREATED);
@@ -476,8 +465,9 @@
 		transaction.commit();
 
 		// deannounce
-		Announcer.deAnnounce(mgmtObjEntity.getAnnounceTo(), mgmtObjEntity,
-				Constants.ADMIN_REQUESTING_ENTITY);
+		if (! mgmtObjEntity.getAnnounceTo().isEmpty()) {
+			Announcer.deAnnounce(mgmtObjEntity, Constants.ADMIN_REQUESTING_ENTITY);
+		}
 
 		// return the response
 		response.setResponseStatusCode(ResponseStatusCode.DELETED);
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/NodeAnncController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/NodeAnncController.java
new file mode 100644
index 0000000..74cbc64
--- /dev/null
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/NodeAnncController.java
@@ -0,0 +1,367 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2017 Orange.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.om2m.core.controller;
+
+import java.util.List;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.eclipse.om2m.commons.constants.Constants;
+import org.eclipse.om2m.commons.constants.MimeMediaType;
+import org.eclipse.om2m.commons.constants.Operation;
+import org.eclipse.om2m.commons.constants.ResourceStatus;
+import org.eclipse.om2m.commons.constants.ResourceType;
+import org.eclipse.om2m.commons.constants.ResponseStatusCode;
+import org.eclipse.om2m.commons.constants.ShortName;
+import org.eclipse.om2m.commons.entities.AccessControlPolicyEntity;
+import org.eclipse.om2m.commons.entities.AeAnncEntity;
+import org.eclipse.om2m.commons.entities.CSEBaseEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
+import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
+import org.eclipse.om2m.commons.entities.ResourceEntity;
+import org.eclipse.om2m.commons.entities.SubscriptionEntity;
+import org.eclipse.om2m.commons.exceptions.BadRequestException;
+import org.eclipse.om2m.commons.exceptions.ConflictException;
+import org.eclipse.om2m.commons.exceptions.ResourceNotFoundException;
+import org.eclipse.om2m.commons.resource.NodeAnnc;
+import org.eclipse.om2m.commons.resource.RequestPrimitive;
+import org.eclipse.om2m.commons.resource.ResponsePrimitive;
+import org.eclipse.om2m.commons.utils.Util.DateUtil;
+import org.eclipse.om2m.core.datamapper.DataMapperSelector;
+import org.eclipse.om2m.core.entitymapper.EntityMapperFactory;
+import org.eclipse.om2m.core.notifier.Notifier;
+import org.eclipse.om2m.core.router.Patterns;
+import org.eclipse.om2m.core.urimapper.UriMapper;
+import org.eclipse.om2m.core.util.ControllerUtil;
+import org.eclipse.om2m.core.util.ControllerUtil.UpdateUtil;
+import org.eclipse.om2m.persistence.service.DAO;
+
+
+/**
+ * Controller for Node resource
+ *
+ */
+public class NodeAnncController extends Controller {
+
+	/** Logger */
+	private static Log LOGGER = LogFactory.getLog(NodeAnncController.class);
+
+	@Override
+	public ResponsePrimitive doCreate(RequestPrimitive request) {
+		/*
+		 * NODE CREATION PROCEDURE
+		 * @resourceName			NP
+		 * resourceType				NP
+		 * resourceID				NP
+		 * parentID					NP
+		 * accessControlPolicyIDs	O
+		 * creationTime				NP
+		 * expirationTime			O
+		 * lastModifiedTime			NP
+		 * labels					O
+		 * 
+		 * nodeID					M
+		 * hostedCSELink			O
+		 * 
+		 */
+
+		ResponsePrimitive response = new ResponsePrimitive(request);
+		Patterns patterns = new Patterns();
+
+		// retrieve the parent
+		DAO<ResourceEntity> dao = (DAO<ResourceEntity>) patterns.getDAO(request.getTo(), dbs);
+		if (dao == null) {
+			throw new ResourceNotFoundException("Cannot find parent resource");
+		}
+
+		// Get the parent entity
+		ResourceEntity parentEntity = (ResourceEntity) dao.find(transaction, request.getTo());
+		// Check the parent existence
+		if (parentEntity == null) {
+			throw new ResourceNotFoundException("Cannot find parent resource");
+		}
+
+		List<NodeAnncEntity> childNodes = null;
+		List<AccessControlPolicyEntity> acpsToCheck = null;
+		List<SubscriptionEntity> subscriptions = null;
+		// case parent is csb
+		if (parentEntity.getResourceType().intValue() == ResourceType.CSE_BASE) {
+			CSEBaseEntity csb = (CSEBaseEntity) parentEntity;
+			childNodes = csb.getChildAnncNodes();
+			acpsToCheck = csb.getAccessControlPolicies();
+			subscriptions = csb.getSubscriptions();
+		}
+		// case parent is csr
+		if (parentEntity.getResourceType().intValue() == ResourceType.REMOTE_CSE) {
+			RemoteCSEEntity remoteCse = (RemoteCSEEntity) parentEntity;
+			childNodes = remoteCse.getChildAnncNodes();
+			acpsToCheck = remoteCse.getAccessControlPolicies();
+			subscriptions = remoteCse.getSubscriptions();
+		}
+
+		// check access control policy of the originator
+		checkACP(acpsToCheck, request.getFrom(), Operation.CREATE);
+
+		// check if content is present
+		if (request.getContent() == null) {
+			throw new BadRequestException("A content is required for Container creation");
+		}
+
+		// get the object from the representation
+		NodeAnnc node = null;
+		try {
+			if (request.getRequestContentType().equals(MimeMediaType.OBJ)) {
+				node = (NodeAnnc) request.getContent();
+			} else {
+				node = (NodeAnnc)DataMapperSelector.getDataMapperList()
+						.get(request.getRequestContentType()).stringToObj((String)request.getContent());				
+			}
+
+		} catch (ClassCastException e) {
+			throw new BadRequestException("Incorrect resource representation in content", e);
+		}
+		if (node == null) {
+			throw new BadRequestException("Error in provided content");
+		}
+
+		NodeAnncEntity nodeEntity = new NodeAnncEntity();
+		// check attributes
+		ControllerUtil.CreateUtil.fillEntityFromGenericResource(node, nodeEntity);
+
+		if (node.getLink() == null) {
+			throw new BadRequestException("Link is Mandatory");
+		} else {
+			nodeEntity.setLink(node.getLink());
+		}
+
+		/*
+		 * nodeID					M
+		 * hostedCSELink			O
+		 */
+		if (node.getNodeID() == null) {
+			throw new BadRequestException("Node ID is Mandatory");
+		} else {
+			nodeEntity.setNodeID(node.getNodeID());
+		}
+
+		if (node.getHostedCSELink() != null) {
+			nodeEntity.setHostedCSELink(node.getHostedCSELink());
+		}
+		if (node.getHostedServiceLinks() != null) {
+			nodeEntity.setHostedServiceLinks(node.getHostedServiceLinks());
+		}
+
+		String generatedId = generateId();
+		// Set other parameters
+		nodeEntity.setResourceID("/" + Constants.CSE_ID + "/" +
+				ShortName.NODE_ANNC + Constants.PREFIX_SEPERATOR + generatedId);
+
+		nodeEntity.setCreationTime(DateUtil.now());
+		nodeEntity.setLastModifiedTime(DateUtil.now());
+		nodeEntity.setParentID(parentEntity.getResourceID());
+		nodeEntity.setResourceType(ResourceType.NODE_ANNC);
+		if (parentEntity.getResourceType().intValue() == ResourceType.CSE_BASE) {
+			nodeEntity.setParentCsb((CSEBaseEntity) parentEntity);
+		} else if (parentEntity.getResourceType().intValue() == ResourceType.REMOTE_CSE) {
+			nodeEntity.setParentCsr((RemoteCSEEntity) parentEntity);
+		}
+
+		if (dbs.getDAOFactory().getNodeAnncDAO().find(transaction, nodeEntity.getResourceID()) != null) {
+			throw new ConflictException("Already registered");
+		}
+
+		if (node.getName() != null) {
+			if (!patterns.checkResourceName(node.getName())) {
+				throw new BadRequestException("Name provided is incorrect. Must be:" + patterns.ID_STRING);
+			}
+			nodeEntity.setName(node.getName());
+		} else {
+			nodeEntity.setName(ShortName.NODE_ANNC + "_" + generatedId);
+		}
+		nodeEntity.setHierarchicalURI(parentEntity.getHierarchicalURI() + "/" + nodeEntity.getName());
+
+		// set acps
+		if (!node.getAccessControlPolicyIDs().isEmpty()) {
+			nodeEntity.setAccessControlPolicies(ControllerUtil.buildAcpEntityList(node.getAccessControlPolicyIDs(), transaction));
+		} else {
+			nodeEntity.getAccessControlPolicies().addAll(acpsToCheck);
+		}
+		
+		// dynamicAuthorizationConsultationIDs O
+		if (!node.getDynamicAuthorizationConsultationIDs().isEmpty()) {
+			nodeEntity.setDynamicAuthorizationConsultations(
+					ControllerUtil.buildDacEntityList(node.getDynamicAuthorizationConsultationIDs(), transaction));
+		} 
+
+		// storing the hierarchical uri
+		if (!UriMapper.addNewUri(nodeEntity.getHierarchicalURI(), nodeEntity.getResourceID(), ResourceType.NODE_ANNC)) {
+			throw new ConflictException("Name already present in the parent collection.");
+		}
+
+		// persisting data
+		dbs.getDAOFactory().getNodeAnncDAO().create(transaction, nodeEntity);
+
+		// get the managed object
+		NodeAnncEntity nodeDB = dbs.getDAOFactory().getNodeAnncDAO().find(transaction, nodeEntity.getResourceID());
+		// Add the AE to the parentEntity list
+		childNodes.add(nodeDB);
+		dao.update(transaction, parentEntity);
+		transaction.commit();
+
+		Notifier.notify(subscriptions, nodeDB, ResourceStatus.CHILD_CREATED);
+		response.setResponseStatusCode(ResponseStatusCode.CREATED);
+		setLocationAndCreationContent(request, response, nodeDB);
+		return response;
+	}
+
+	@Override
+	public ResponsePrimitive doRetrieve(RequestPrimitive request) {
+		// create the response primitive
+		ResponsePrimitive response = new ResponsePrimitive(request);
+
+		// get the entity
+		NodeAnncEntity nodeEntity = dbs.getDAOFactory().getNodeAnncDAO().find(transaction, 
+				request.getTo());
+		if (nodeEntity == null) {
+			throw new ResourceNotFoundException();
+		}
+
+		// check authorization
+		List<AccessControlPolicyEntity> acps = nodeEntity.getAccessControlPolicies();
+		checkACP(acps, request.getFrom(), request.getOperation());
+		
+		response = new ResponsePrimitive(request);
+		// map the entity with the representation resource
+		NodeAnnc node = EntityMapperFactory.getNodeAnncMapper().mapEntityToResource(nodeEntity, request);
+		response.setContent(node);
+		// set status code
+		response.setResponseStatusCode(ResponseStatusCode.OK);
+		// return the response
+		return response;
+	}
+
+	@Override
+	public ResponsePrimitive doUpdate(RequestPrimitive request) {
+		// create the response base
+		ResponsePrimitive response = new ResponsePrimitive(request);
+
+		// retrieve the resource from database
+		NodeAnncEntity nodeEntity = dbs.getDAOFactory().getNodeAnncDAO().find(transaction, request.getTo());
+		if (nodeEntity == null) {
+			throw new ResourceNotFoundException();
+		}
+		// check ACP
+		checkACP(nodeEntity.getAccessControlPolicies(), request.getFrom(), Operation.UPDATE);
+		
+
+		// check if content is present
+		if (request.getContent() == null) {
+			throw new BadRequestException("A content is required for node update");
+		}
+
+		// create the java object from the resource representation
+		// get the object from the representation
+		NodeAnnc node = null;
+		try{
+			if (request.getRequestContentType().equals(MimeMediaType.OBJ)) {
+				node = (NodeAnnc) request.getContent();
+			} else {
+				node = (NodeAnnc)DataMapperSelector.getDataMapperList()
+						.get(request.getRequestContentType()).stringToObj((String)request.getContent());				
+			}
+
+		} catch (ClassCastException e) {
+			throw new BadRequestException("Incorrect resource representation in content", e);
+		}
+		if (node == null) {
+			throw new BadRequestException("Error in provided content");
+		}
+
+		// check attributes, NP attributes are ignored
+		// @resourceName				NP
+		// resourceType					NP
+		// resourceID					NP
+		// parentID						NP
+		// creationTime					NP
+		// creator						NP
+		// lastModifiedTime				NP
+		UpdateUtil.checkNotPermittedParameters(node);
+		// hostedCseLink				NP
+		if (node.getHostedCSELink() != null) {
+			throw new BadRequestException("HostedCSELink is NP");
+		}
+
+		NodeAnnc modifiedAttributes = new NodeAnnc();
+		// labels						O
+		if (!node.getLabels().isEmpty()) {
+			nodeEntity.setLabelsEntitiesFromSring(node.getLabels());
+			modifiedAttributes.getLabels().addAll(node.getLabels());
+		}
+		// accessControlPolicyIDs		O
+		if (!node.getAccessControlPolicyIDs().isEmpty()) {
+			for(AccessControlPolicyEntity acpe : nodeEntity.getAccessControlPolicies()) {
+				checkSelfACP(acpe, request.getFrom(), Operation.UPDATE);
+			}
+			nodeEntity.getAccessControlPolicies().clear();
+			nodeEntity.setAccessControlPolicies(ControllerUtil.buildAcpEntityList(node.getAccessControlPolicyIDs(), transaction));
+			modifiedAttributes.getAccessControlPolicyIDs().addAll(node.getAccessControlPolicyIDs());
+		}
+		// expirationTime			O
+		if (node.getExpirationTime() != null) {
+			nodeEntity.setExpirationTime(node.getExpirationTime());
+			modifiedAttributes.setExpirationTime(node.getExpirationTime());
+		}
+
+		// nodeID					O
+		if (node.getNodeID() != null) {
+			nodeEntity.setNodeID(node.getNodeID());
+			modifiedAttributes.setNodeID(node.getNodeID());
+		}
+		
+		nodeEntity.setLastModifiedTime(DateUtil.now());
+		modifiedAttributes.setLastModifiedTime(nodeEntity.getLastModifiedTime());
+		response.setContent(modifiedAttributes);
+		
+		// uptade the persisted resource
+		dbs.getDAOFactory().getNodeAnncDAO().update(transaction, nodeEntity);
+		// commit & close the db transaction
+		transaction.commit();
+		Notifier.notify(nodeEntity.getChildSubscriptions(), nodeEntity, ResourceStatus.UPDATED);
+
+		// set response status code
+		response.setResponseStatusCode(ResponseStatusCode.UPDATED);
+		return response;
+	}
+
+	@Override
+	public ResponsePrimitive doDelete(RequestPrimitive request) {
+		// Generic delete procedure
+		ResponsePrimitive response = new ResponsePrimitive(request);
+
+		// retrieve the entity
+		NodeAnncEntity nodeEntity = dbs.getDAOFactory().getNodeAnncDAO().find(transaction, request.getTo());
+		if (nodeEntity == null) {
+			throw new ResourceNotFoundException();
+		}
+
+		// check access control policies
+		checkACP(nodeEntity.getAccessControlPolicies(), request.getFrom(), Operation.DELETE);
+		
+		UriMapper.deleteUri(nodeEntity.getHierarchicalURI());
+		Notifier.notifyDeletion(nodeEntity.getChildSubscriptions(), nodeEntity);
+
+		// delete the resource in the database
+		dbs.getDAOFactory().getNodeAnncDAO().delete(transaction, nodeEntity);
+		// commit the transaction
+		transaction.commit();
+		// return the response
+		response.setResponseStatusCode(ResponseStatusCode.DELETED);
+		return response;
+	}
+
+}
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/NodeController.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/NodeController.java
index 3f88947..9aff30f 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/NodeController.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/controller/NodeController.java
@@ -21,6 +21,8 @@
 
 import java.util.List;
 
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
 import org.eclipse.om2m.commons.constants.Constants;
 import org.eclipse.om2m.commons.constants.MimeMediaType;
 import org.eclipse.om2m.commons.constants.Operation;
@@ -41,6 +43,7 @@
 import org.eclipse.om2m.commons.resource.RequestPrimitive;
 import org.eclipse.om2m.commons.resource.ResponsePrimitive;
 import org.eclipse.om2m.commons.utils.Util.DateUtil;
+import org.eclipse.om2m.core.announcer.Announcer;
 import org.eclipse.om2m.core.datamapper.DataMapperSelector;
 import org.eclipse.om2m.core.entitymapper.EntityMapperFactory;
 import org.eclipse.om2m.core.notifier.Notifier;
@@ -57,6 +60,10 @@
  */
 public class NodeController extends Controller {
 
+	/** Logger */
+	private static Log LOGGER = LogFactory.getLog(NodeController.class);
+
+	@SuppressWarnings("unchecked")
 	@Override
 	public ResponsePrimitive doCreate(RequestPrimitive request) {
 		/*
@@ -80,19 +87,21 @@
 		Patterns patterns = new Patterns();
 
 		// retrieve the parent
-		DAO<ResourceEntity> dao = (DAO<ResourceEntity>) patterns.getDAO(request.getTo(), dbs);
-		if (dao == null){
+		DAO<ResourceEntity> parentDao = (DAO<ResourceEntity>) patterns.getDAO(request.getTo(), dbs);
+		if (parentDao == null){
 			throw new ResourceNotFoundException("Cannot find parent resource");
 		}
 
 		// Get the parent entity
-		LOGGER.trace("Target ID in controller: " + request.getTo());
-		ResourceEntity parentEntity = (ResourceEntity) dao.find(transaction, request.getTo());
+		ResourceEntity parentEntity = (ResourceEntity) parentDao.find(transaction, request.getTo());
 		// Check the parent existence
 		if (parentEntity == null){
 			throw new ResourceNotFoundException("Cannot find parent resource");
 		}
 
+		// lock parent
+		transaction.lock(parentEntity);
+
 		List<NodeEntity> childNodes = null;
 		List<AccessControlPolicyEntity> acpsToCheck = null;
 		List<SubscriptionEntity> subscriptions = null;
@@ -104,7 +113,7 @@
 			subscriptions = csb.getSubscriptions();
 		}
 		// case parent is csr
-		if(parentEntity.getResourceType().intValue() == ResourceType.REMOTE_CSE){
+		else if(parentEntity.getResourceType().intValue() == ResourceType.REMOTE_CSE){
 			RemoteCSEEntity remoteCse = (RemoteCSEEntity) parentEntity;
 			childNodes = remoteCse.getChildNodes();
 			acpsToCheck = remoteCse.getAccessControlPolicies();
@@ -112,7 +121,8 @@
 		}
 
 		// check access control policy of the originator
-		checkACP(acpsToCheck, request.getFrom(), Operation.CREATE);
+//		checkACP(acpsToCheck, request.getFrom(), Operation.CREATE);
+		checkPermissions(request, parentEntity, acpsToCheck);
 
 		response = new ResponsePrimitive(request);
 		// check if content is present
@@ -154,8 +164,8 @@
 		if (node.getHostedCSELink() != null) {
 			nodeEntity.setHostedCSELink(node.getHostedCSELink());
 		}
-		if (node.getHostedAppLinks() != null) {
-			nodeEntity.setHostedAppLink(node.getHostedAppLinks());
+		if (node.getHostedServiceLinks() != null) {
+			nodeEntity.setHostedServiceLinks(node.getHostedServiceLinks());
 		}
 
 		String generatedId = generateId();
@@ -164,7 +174,12 @@
 		nodeEntity.setLastModifiedTime(DateUtil.now());
 		nodeEntity.setParentID(parentEntity.getResourceID());
 		nodeEntity.setResourceType(ResourceType.NODE);
-	
+		if (parentEntity.getResourceType().intValue() == ResourceType.CSE_BASE) {
+			nodeEntity.setParentCsb((CSEBaseEntity) parentEntity);
+		} else if (parentEntity.getResourceType().intValue() == ResourceType.REMOTE_CSE) {
+			nodeEntity.setParentCsr((RemoteCSEEntity) parentEntity);
+		}
+
 		if (node.getName() != null){
 			if (!patterns.checkResourceName(node.getName())){
 				throw new BadRequestException("Name provided is incorrect. Must be:" + patterns.ID_STRING);
@@ -187,14 +202,23 @@
 			throw new ConflictException("Name already present in the parent collection.");
 		}
 		// persisting data
-		dbs.getDAOFactory().getNodeDAO().create(transaction, nodeEntity);
+		DAO<NodeEntity> nodeDao = dbs.getDAOFactory().getNodeDAO();
+		nodeDao.create(transaction, nodeEntity);
 
 		// get the manage object
-		NodeEntity nodeDB = dbs.getDAOFactory().getNodeDAO().find(transaction, nodeEntity.getResourceID());
+		NodeEntity nodeDB = nodeDao.find(transaction, nodeEntity.getResourceID());
 		childNodes.add(nodeDB);
-		dao.update(transaction, parentEntity);
+		parentDao.update(transaction, parentEntity);
 		transaction.commit();
 
+		if (! node.getAnnounceTo().isEmpty()) {
+			node.setName(nodeDB.getName());
+			node.setResourceID(nodeDB.getResourceID());
+			node.setResourceType(ResourceType.NODE);
+			node.setParentID(nodeDB.getParentID());
+			Announcer.announce(node, request.getFrom(), "");
+		}
+
 		Notifier.notify(subscriptions, nodeDB, ResourceStatus.CHILD_CREATED);
 		response.setResponseStatusCode(ResponseStatusCode.CREATED);
 		setLocationAndCreationContent(request, response, nodeDB);
@@ -207,7 +231,7 @@
 		ResponsePrimitive response = new ResponsePrimitive(request);
 
 		// get the entity
-		NodeEntity nodeEntity = dbs.getDAOFactory().getNodeEntityDAO().find(transaction, request.getTo());
+		NodeEntity nodeEntity = dbs.getDAOFactory().getNodeDAO().find(transaction, request.getTo());
 		if (nodeEntity == null) {
 			throw new ResourceNotFoundException();
 		}
@@ -232,7 +256,8 @@
 		ResponsePrimitive response = new ResponsePrimitive(request);
 
 		// retrieve the resource from database
-		NodeEntity nodeEntity = dbs.getDAOFactory().getNodeEntityDAO().find(transaction, request.getTo());
+		DAO<NodeEntity> nodeDao = dbs.getDAOFactory().getNodeDAO();
+		NodeEntity nodeEntity = nodeDao.find(transaction, request.getTo());
 		if (nodeEntity == null) {
 			throw new ResourceNotFoundException();
 		}
@@ -322,7 +347,7 @@
 		response.setContent(modifiedAttributes);
 		
 		// uptade the persisted resource
-		dbs.getDAOFactory().getNodeDAO().update(transaction, nodeEntity);
+		nodeDao.update(transaction, nodeEntity);
 		// commit & close the db transaction
 		transaction.commit();
 		Notifier.notify(nodeEntity.getSubscriptions(), nodeEntity, ResourceStatus.UPDATED);
@@ -337,23 +362,33 @@
 		// Generic delete procedure
 		ResponsePrimitive response = new ResponsePrimitive(request);
 		// retrieve the entity
-		NodeEntity nodeEntity = dbs.getDAOFactory().getNodeEntityDAO().find(transaction, request.getTo());
+		DAO<NodeEntity> nodeDao = dbs.getDAOFactory().getNodeDAO();
+		NodeEntity nodeEntity = nodeDao.find(transaction, request.getTo());
 		if (nodeEntity == null) {
 			LOGGER.info("Delete node: not found");
 			throw new ResourceNotFoundException();
 		}
-		LOGGER.info("Delete node " + nodeEntity);
+
+		// lock entity
+		transaction.lock(nodeEntity);
 
 		// check access control policies
-		checkACP(nodeEntity.getAccessControlPolicies(), request.getFrom(), Operation.DELETE);
+//		checkACP(nodeEntity.getAccessControlPolicies(), request.getFrom(), Operation.DELETE);
+		checkPermissions(request, nodeEntity, nodeEntity.getAccessControlPolicies());
 		
 		UriMapper.deleteUri(nodeEntity.getHierarchicalURI());
 		Notifier.notifyDeletion(nodeEntity.getSubscriptions(), nodeEntity);
 
 		// delete the resource in the database
-		dbs.getDAOFactory().getNodeDAO().delete(transaction, nodeEntity);
+		nodeDao.delete(transaction, nodeEntity);
 		// commit the transaction
 		transaction.commit();
+
+		// deannounce
+		if (! nodeEntity.getAnnounceTo().isEmpty()) {
+			Announcer.deAnnounce(nodeEntity, Constants.ADMIN_REQUESTING_ENTITY);
+		}
+
 		// return the response
 		response.setResponseStatusCode(ResponseStatusCode.DELETED);
 		return response;
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/AeAnncMapper.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/AeAnncMapper.java
index 6433541..b8daa7f 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/AeAnncMapper.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/AeAnncMapper.java
@@ -37,10 +37,8 @@
 		resource.setExpirationTime(entity.getExpirationTime());
 		resource.setAppName(entity.getAppName());
 		resource.setNodeLink(entity.getNodeLink());
-		resource.setLink(entity.getLink());
 		resource.setOntologyRef(entity.getOntologyRef());
 		resource.getPointOfAccess().addAll(entity.getPointOfAccess());
-
 	}
 
 	@Override
@@ -50,10 +48,7 @@
 	
 	@Override
 	protected List<ChildResourceRef> getChildResourceRef(AeAnncEntity entity, int level, int offset) {
-		
-		
 		List<ChildResourceRef> childRefs = new ArrayList<>();
-		
 		if (level == 0) {
 			return childRefs;
 		}
@@ -65,7 +60,6 @@
 			child.setValue(flexContainerEntity.getResourceID());
 			child.setSpid(flexContainerEntity.getContainerDefinition());
 			childRefs.add(child);
-			
 			childRefs.addAll(new FlexContainerAnncMapper().getChildResourceRef(flexContainerEntity, level - 1, offset - 1));
 		}
 
@@ -76,7 +70,6 @@
 			child.setType(BigInteger.valueOf(ResourceType.SUBSCRIPTION));
 			child.setValue(sub.getResourceID());
 			childRefs.add(child);
-			
 			childRefs.addAll(new SubscriptionMapper().getChildResourceRef(sub, level - 1, offset - 1));
 		}
 		
@@ -85,7 +78,6 @@
 
 	@Override
 	protected void mapChildResources(AeAnncEntity entity, AEAnnc resource, int level, int offset) {
-
 		if (level == 0) {
 			return;
 		}
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/CseBaseMapper.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/CseBaseMapper.java
index 7d078c9..4eaa75c 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/CseBaseMapper.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/CseBaseMapper.java
@@ -45,6 +45,7 @@
 import org.eclipse.om2m.commons.resource.Container;
 import org.eclipse.om2m.commons.resource.DynamicAuthorizationConsultation;
 import org.eclipse.om2m.commons.resource.Group;
+import org.eclipse.om2m.commons.resource.Node;
 import org.eclipse.om2m.commons.resource.RemoteCSE;
 import org.eclipse.om2m.commons.resource.Request;
 import org.eclipse.om2m.commons.resource.Subscription;
@@ -250,6 +251,11 @@
 			Subscription subRes = new SubscriptionMapper().mapEntityToResource(sub, ResultContent.ATTRIBUTES_AND_CHILD_RES, level - 1, offset - 1);
 			resource.getRemoteCSEOrNodeOrAE().add(subRes);
 		}
+		// adding node refs
+		for (NodeEntity node : entity.getChildNodes()) {
+			Node nodeRes = new NodeMapper().mapEntityToResource(node, ResultContent.ATTRIBUTES_AND_CHILD_RES, level - 1, offset - 1);
+			resource.getRemoteCSEOrNodeOrAE().add(nodeRes);
+		}
 		// adding request refs
 		for (RequestEntity req : entity.getChildReq()) {
 			Request reqResource = new RequestMapper().mapEntityToResource(req, ResultContent.ATTRIBUTES_AND_CHILD_RES, level - 1, offset - 1);
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/EntityMapperFactory.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/EntityMapperFactory.java
index d5dccbf..5c3a11c 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/EntityMapperFactory.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/EntityMapperFactory.java
@@ -34,6 +34,7 @@
 import org.eclipse.om2m.commons.entities.GroupEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
 import org.eclipse.om2m.commons.entities.NodeEntity;
 import org.eclipse.om2m.commons.entities.PollingChannelEntity;
 import org.eclipse.om2m.commons.entities.RegularResourceEntity;
@@ -56,6 +57,7 @@
 import org.eclipse.om2m.commons.resource.Group;
 import org.eclipse.om2m.commons.resource.MgmtObj;
 import org.eclipse.om2m.commons.resource.Node;
+import org.eclipse.om2m.commons.resource.NodeAnnc;
 import org.eclipse.om2m.commons.resource.PollingChannel;
 import org.eclipse.om2m.commons.resource.RegularResource;
 import org.eclipse.om2m.commons.resource.RemoteCSE;
@@ -121,11 +123,15 @@
 	public static EntityMapper<NodeEntity, Node> getNodeMapper() {
 		return new NodeMapper();
 	}
+	public static EntityMapper<NodeAnncEntity, NodeAnnc> getNodeAnncMapper() {
+		return new NodeAnncMapper();
+	}
 	
 	/** Get the Remote CSE mapper */
 	public static EntityMapper<RemoteCSEEntity, RemoteCSE> getRemoteCseMapper(){
 		return new RemoteCSEMapper();
 	}
+	
 	/** Get the Subscription mapper */
 	public static EntityMapper<SubscriptionEntity, Subscription> getSubscriptionMapper(){
 		return new SubscriptionMapper();
@@ -199,6 +205,8 @@
 			return new GroupMapper();
 		case ResourceType.NODE:
 			return new NodeMapper();
+		case ResourceType.NODE_ANNC:
+			return new NodeAnncMapper();
 		case ResourceType.REMOTE_CSE:
 			return new RemoteCSEMapper();
 		case ResourceType.SUBSCRIPTION:
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/FlexContainerAnncMapper.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/FlexContainerAnncMapper.java
index 5271ec7..8ca76fe 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/FlexContainerAnncMapper.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/FlexContainerAnncMapper.java
@@ -44,7 +44,7 @@
 		resource.setOntologyRef(entity.getOntologyRef());
 		resource.setStateTag(entity.getStateTag());
 		resource.setContainerDefinition(entity.getContainerDefinition());
-		
+		resource.setNodeLink(entity.getNodeLink());
 	}
 	
 	@Override
@@ -104,11 +104,9 @@
 			resource.getFlexContainerOrContainerOrSubscription().add(subRes);
 		}
 		
-		
 		// add child ref with containers
 		
 		resource.finalizeSerialization();
 	}
-
 	
 }
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/MgmtObjAnncMapper.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/MgmtObjAnncMapper.java
index 9c04c07..5e3949f 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/MgmtObjAnncMapper.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/MgmtObjAnncMapper.java
@@ -19,19 +19,30 @@
  *******************************************************************************/
 package org.eclipse.om2m.core.entitymapper;
 
+import java.math.BigInteger;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
 import org.eclipse.om2m.commons.constants.ResourceType;
 import org.eclipse.om2m.commons.constants.ResultContent;
+import org.eclipse.om2m.commons.entities.AreaNwkDeviceInfoAnncEntity;
+import org.eclipse.om2m.commons.entities.AreaNwkInfoAnncEntity;
+import org.eclipse.om2m.commons.entities.DeviceInfoAnncEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
 import org.eclipse.om2m.commons.entities.SubscriptionEntity;
 import org.eclipse.om2m.commons.resource.AnnouncedMgmtResource;
+import org.eclipse.om2m.commons.resource.AreaNwkDeviceInfoAnnc;
+import org.eclipse.om2m.commons.resource.AreaNwkInfoAnnc;
 import org.eclipse.om2m.commons.resource.ChildResourceRef;
+import org.eclipse.om2m.commons.resource.DeviceInfoAnnc;
+import org.eclipse.om2m.commons.resource.MgmtObjAnncWithChildren;
 import org.eclipse.om2m.commons.resource.Subscription;
 
 public class MgmtObjAnncMapper extends EntityMapper<MgmtObjAnncEntity, AnnouncedMgmtResource> {
 
+//	private static Log LOGGER = LogFactory.getLog(MgmtObjAnncMapper.class);
+
 	@Override
 	protected void mapAttributes(MgmtObjAnncEntity entity, AnnouncedMgmtResource resource, int level, int offset) {
 		if (level < 0) {
@@ -51,51 +62,52 @@
 		resource.setResourceID(entity.getResourceID());
 		resource.setResourceType(entity.getResourceType());
 		
-//		if (entity instanceof AreaNwkInfoEntity) {
-//			mapSpecificAttributes((AreaNwkInfoEntity)entity, (AreaNwkInfo)resource);
-//		} else if (entity instanceof AreaNwkDeviceInfoEntity) {
-//			mapSpecificAttributes((AreaNwkDeviceInfoEntity)entity, (AreaNwkDeviceInfo)resource);
-//		} else if (entity instanceof DeviceInfoEntity) {
-//			mapSpecificAttributes((DeviceInfoEntity)entity, (DeviceInfo)resource);
-//		}
+		BigInteger mgd = entity.getMgmtDefinition();
+		if (mgd.equals(MgmtDefinitionTypes.AREA_NWK_INFO)) {
+			mapSpecificAttributes((AreaNwkInfoAnncEntity)entity, (AreaNwkInfoAnnc)resource);
+		} else if (mgd.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO)) {
+			mapSpecificAttributes((AreaNwkDeviceInfoAnncEntity)entity, (AreaNwkDeviceInfoAnnc)resource);
+		} else if (mgd.equals(MgmtDefinitionTypes.DEVICE_INFO)) {
+			mapSpecificAttributes((DeviceInfoAnncEntity)entity, (DeviceInfoAnnc)resource);
+		}
 	}
 	
-//	private void mapSpecificAttributes(AreaNwkInfoEntity entity, AreaNwkInfo resource) {
-//		resource.setAreaNwkType(entity.getAreaNwkType());
-//		if (!entity.getListOfDevices().isEmpty()) {
-//			resource.getListOfDevices().addAll(entity.getListOfDevices());
-//		}
-//	}
-//	
-//	private void mapSpecificAttributes(AreaNwkDeviceInfoEntity entity, AreaNwkDeviceInfo resource) {
-//		resource.setAreaNwkId(entity.getAreaNwkId());
-//		resource.setDevID(entity.getDevID());
-//		resource.setSleepDuration(entity.getSleepDuration());
-//		resource.setSleepInterval(entity.getSleepInterval());
-//		resource.setStatus(entity.getStatus());
-//	}
-//	
-//	private void mapSpecificAttributes(DeviceInfoEntity entity, DeviceInfo resource) {
-//		resource.setDeviceLabel(entity.getDeviceLabel());
-//		resource.setModel(entity.getModel());
-//		resource.setManufacturer(entity.getManufacturer());
-//		resource.setDeviceType(entity.getDeviceType());
-//		
-//		resource.setDeviceName(entity.getDeviceName());
-//		resource.setFwVersion(entity.getFwVersion());
-//		resource.setSwVersion(entity.getSwVersion());
-//		resource.setHwVersion(entity.getHwVersion());
-//		resource.setOsVersion(entity.getOsVersion());
-//		resource.setManufacturerDetailsLink(entity.getManufacturerDetailsLink());
-//		resource.setManufacturingDate(entity.getManufacturingDate());
-//		resource.setSubModel(entity.getSubModel());
-//		resource.setCountry(entity.getCountry());
-//		resource.setLocation(entity.getLocation());
-//		resource.setSystemTime(entity.getSystemTime());
-//		resource.setSupportURL(entity.getSupportURL());
-//		resource.setPresentationURL(entity.getPresentationURL());
-//		resource.setProtocol(entity.getProtocol());
-//	}
+	private void mapSpecificAttributes(AreaNwkInfoAnncEntity entity, AreaNwkInfoAnnc resource) {
+		resource.setAreaNwkType(entity.getAreaNwkType());
+		if (!entity.getListOfDevices().isEmpty()) {
+			resource.getListOfDevices().addAll(entity.getListOfDevices());
+		}
+	}
+	
+	private void mapSpecificAttributes(AreaNwkDeviceInfoAnncEntity entity, AreaNwkDeviceInfoAnnc resource) {
+		resource.setAreaNwkId(entity.getAreaNwkId());
+		resource.setDevID(entity.getDevID());
+		resource.setSleepDuration(entity.getSleepDuration());
+		resource.setSleepInterval(entity.getSleepInterval());
+		resource.setStatus(entity.getStatus());
+	}
+	
+	private void mapSpecificAttributes(DeviceInfoAnncEntity entity, DeviceInfoAnnc resource) {
+		resource.setDeviceLabel(entity.getDeviceLabel());
+		resource.setModel(entity.getModel());
+		resource.setManufacturer(entity.getManufacturer());
+		resource.setDeviceType(entity.getDeviceType());
+		
+		resource.setDeviceName(entity.getDeviceName());
+		resource.setFwVersion(entity.getFwVersion());
+		resource.setSwVersion(entity.getSwVersion());
+		resource.setHwVersion(entity.getHwVersion());
+		resource.setOsVersion(entity.getOsVersion());
+		resource.setManufacturerDetailsLink(entity.getManufacturerDetailsLink());
+		resource.setManufacturingDate(entity.getManufacturingDate());
+		resource.setSubModel(entity.getSubModel());
+		resource.setCountry(entity.getCountry());
+		resource.setLocation(entity.getLocation());
+		resource.setSystemTime(entity.getSystemTime());
+		resource.setSupportURL(entity.getSupportURL());
+		resource.setPresentationURL(entity.getPresentationURL());
+		resource.setProtocol(entity.getProtocol());
+	}
 	
 	@Override
 	protected List<ChildResourceRef> getChildResourceRef(MgmtObjAnncEntity entity, int level, int offset) {
@@ -117,7 +129,7 @@
 
 	@Override
 	protected void mapChildResourceRef(MgmtObjAnncEntity entity, AnnouncedMgmtResource resource, int level, int offset) {
-//		((MgmtObjWithChildren)resource).getChildResource().addAll(getChildResourceRef(entity, level, offset));
+		((MgmtObjAnncWithChildren)resource).getChildResource().addAll(getChildResourceRef(entity, level, offset));
 	}
 
 	@Override
@@ -125,18 +137,22 @@
 		// add child ref subscription
 		for (SubscriptionEntity sub : entity.getSubscriptions()){
 			Subscription subRes = new SubscriptionMapper().mapEntityToResource(sub, ResultContent.ATTRIBUTES, level - 1, offset - 1);
-//			((MgmtObjWithChildren)resource).getSubscriptions().add(subRes);
+			((MgmtObjAnncWithChildren)resource).getSubscriptions().add(subRes);
 		}
 	}
 
 	@Override
 	protected AnnouncedMgmtResource createResource(MgmtObjAnncEntity entity) {
-//		if (entity instanceof AreaNwkInfoEntity)
-//			return new AreaNwkInfo();
-//		if (entity instanceof AreaNwkDeviceInfoEntity)
-//			return new AreaNwkDeviceInfo();
-//		if (entity instanceof DeviceInfoEntity)
-//			return new DeviceInfo();
+		BigInteger mgd = entity.getMgmtDefinition();
+		if (mgd.equals(MgmtDefinitionTypes.AREA_NWK_INFO)) {
+			return new AreaNwkInfoAnnc();
+		} 
+		if (mgd.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO)) {
+			return new AreaNwkDeviceInfoAnnc();
+		} 
+		if (mgd.equals(MgmtDefinitionTypes.DEVICE_INFO)) {
+			return new DeviceInfoAnnc();
+		}
 		return null;
 	}
 
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/NodeAnncMapper.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/NodeAnncMapper.java
new file mode 100644
index 0000000..d115d42
--- /dev/null
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/NodeAnncMapper.java
@@ -0,0 +1,109 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2017 Orange.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.om2m.core.entitymapper;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.om2m.commons.constants.ResourceType;
+import org.eclipse.om2m.commons.constants.ResultContent;
+import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
+import org.eclipse.om2m.commons.entities.SubscriptionEntity;
+import org.eclipse.om2m.commons.resource.ChildResourceRef;
+import org.eclipse.om2m.commons.resource.NodeAnnc;
+import org.eclipse.om2m.commons.resource.Subscription;
+
+/**
+ * Mapper for Node resource - entity
+ *
+ */
+public class NodeAnncMapper extends EntityMapper<NodeAnncEntity, NodeAnnc> {
+
+	private MgmtObjAnncMapper mgmtObjMapper;
+	
+	public NodeAnncMapper() {
+		super();
+		mgmtObjMapper = new MgmtObjAnncMapper();
+	}
+
+	@Override
+	protected void mapAttributes(NodeAnncEntity entity, NodeAnnc resource, int level, int offset) {
+		if (level < 0) {
+			return;
+		}
+		
+		// announceableResource attributes
+		EntityMapperFactory.getAnnouncedResourceMapper().mapAttributes(entity, resource, level, offset);
+		
+		// node attribute
+		resource.setNodeID(entity.getNodeID());
+		resource.setHostedCSELink(entity.getHostedCSELink());
+		resource.setHostedServiceLinks(entity.getHostedServiceLinks());
+	}
+	
+	@Override
+	protected List<ChildResourceRef> getChildResourceRef(NodeAnncEntity entity, 
+			int level, int offset) {
+		List<ChildResourceRef> childRefs = new ArrayList<>();
+		if (level == 0) {
+			return childRefs;
+		}
+
+		// add child ref subscription
+		for (SubscriptionEntity sub : entity.getChildSubscriptions()){
+			ChildResourceRef child = new ChildResourceRef();
+			child.setResourceName(sub.getName());
+			child.setType(ResourceType.SUBSCRIPTION);
+			child.setValue(sub.getResourceID());
+			childRefs.add(child);
+			childRefs.addAll(new SubscriptionMapper().getChildResourceRef(sub, level - 1, offset - 1));
+		}
+		
+		// add mgmt obj entities
+		for (MgmtObjAnncEntity mgmtObj : entity.getMgmtObjEntities()) {
+			childRefs.add(createChildResourceRef(mgmtObj));
+			childRefs.addAll(mgmtObjMapper.getChildResourceRef(mgmtObj, level - 1, offset - 1));
+		}
+		
+		return childRefs;
+	}
+
+	@Override
+	protected void mapChildResourceRef(NodeAnncEntity entity, NodeAnnc resource, int level, int offset) {
+		resource.getChildResource().addAll(getChildResourceRef(entity, level, offset));
+	}
+
+	@Override
+	protected void mapChildResources(NodeAnncEntity entity, NodeAnnc resource, int level, int offset) {
+		// add child ref subscription
+		for (SubscriptionEntity sub : entity.getChildSubscriptions()){
+			Subscription subRes = new SubscriptionMapper().mapEntityToResource(sub, ResultContent.ATTRIBUTES, level - 1, offset - 1);
+//			resource.getMgmtObjs().add(subRes);
+		}
+		// add mgmt obj entities
+		for (MgmtObjAnncEntity mgmtObj : entity.getMgmtObjEntities()) {
+			resource.getMgmtObjs().add(mgmtObjMapper.mapEntityToResource(mgmtObj, 
+					ResultContent.ATTRIBUTES, level - 1, offset - 1));
+		}
+	}
+
+	@Override
+	protected NodeAnnc createResource() {
+		return new NodeAnnc();
+	}
+
+	private final ChildResourceRef createChildResourceRef(MgmtObjAnncEntity entity) {
+		ChildResourceRef chref = new ChildResourceRef();
+		chref.setResourceName(entity.getName());
+		chref.setType(ResourceType.MGMT_OBJ_ANNC);
+		chref.setValue(entity.getResourceID());
+		return chref;
+	}
+	
+}
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/NodeMapper.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/NodeMapper.java
index 3c035ff..2cd6fa6 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/NodeMapper.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/NodeMapper.java
@@ -57,7 +57,7 @@
 		// node attribute
 		resource.setNodeID(entity.getNodeID());
 		resource.setHostedCSELink(entity.getHostedCSELink());
-		resource.setHostedAppLinks(entity.getHostedAppLink());
+		resource.setHostedServiceLinks(entity.getHostedServiceLinks());
 	}
 	
 	@Override
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/RemoteCSEMapper.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/RemoteCSEMapper.java
index 898c314..1ec5bca 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/RemoteCSEMapper.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/entitymapper/RemoteCSEMapper.java
@@ -31,6 +31,8 @@
 import org.eclipse.om2m.commons.entities.DynamicAuthorizationConsultationEntity;
 import org.eclipse.om2m.commons.entities.FlexContainerEntity;
 import org.eclipse.om2m.commons.entities.GroupEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
+import org.eclipse.om2m.commons.entities.NodeEntity;
 import org.eclipse.om2m.commons.entities.PollingChannelEntity;
 import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
 import org.eclipse.om2m.commons.entities.ScheduleEntity;
@@ -43,6 +45,8 @@
 import org.eclipse.om2m.commons.resource.Container;
 import org.eclipse.om2m.commons.resource.DynamicAuthorizationConsultation;
 import org.eclipse.om2m.commons.resource.Group;
+import org.eclipse.om2m.commons.resource.Node;
+import org.eclipse.om2m.commons.resource.NodeAnnc;
 import org.eclipse.om2m.commons.resource.PollingChannel;
 import org.eclipse.om2m.commons.resource.RemoteCSE;
 import org.eclipse.om2m.commons.resource.Subscription;
@@ -82,7 +86,6 @@
 	@Override
 	protected List<ChildResourceRef> getChildResourceRef(RemoteCSEEntity csrEntity, int level, int offset) {
 		List<ChildResourceRef> childRefs = new ArrayList<>();
-		
 		if (level == 0) {
 			return childRefs;
 		}
@@ -169,7 +172,24 @@
 			child.setType(ResourceType.SCHEDULE);
 			childRefs.add(child);
 		}
-		// TODO add NODE ref
+		// adding node refs
+		for (NodeEntity nod : csrEntity.getChildNodes()) {
+			ChildResourceRef ch = new ChildResourceRef();
+			ch.setResourceName(nod.getName());
+			ch.setType(ResourceType.NODE);
+			ch.setValue(nod.getResourceID());
+			childRefs.add(ch);
+			childRefs.addAll(new NodeMapper().getChildResourceRef(nod, level - 1, offset - 1));
+		}
+		// adding nodeAnnc refs
+		for (NodeAnncEntity nod : csrEntity.getChildAnncNodes()) {
+			ChildResourceRef ch = new ChildResourceRef();
+			ch.setResourceName(nod.getName());
+			ch.setType(ResourceType.NODE_ANNC);
+			ch.setValue(nod.getResourceID());
+			childRefs.add(ch);
+			childRefs.addAll(new NodeAnncMapper().getChildResourceRef(nod, level - 1, offset - 1));
+		}
 
 		// adding DynamicAuthorizationConsultation refs
 		for (DynamicAuthorizationConsultationEntity dace : csrEntity.getChildDynamicAuthorizationConsultation()) {
@@ -237,6 +257,15 @@
 			PollingChannel chPch = new PollingChannelMapper().mapEntityToResource(pollEntity, ResultContent.ATTRIBUTES_AND_CHILD_RES, level - 1, offset - 1);
 			csr.getAEOrContainerOrGroup().add(chPch);
 		}
+		// adding node refs
+		for (NodeEntity nod : csrEntity.getChildNodes()) {
+			Node node = new NodeMapper().mapEntityToResource(nod, ResultContent.ATTRIBUTES_AND_CHILD_RES, level - 1, offset - 1);
+			csr.getAEOrContainerOrGroup().add(node);
+		}
+		for (NodeAnncEntity nod : csrEntity.getChildAnncNodes()) {
+			NodeAnnc node = new NodeAnncMapper().mapEntityToResource(nod, ResultContent.ATTRIBUTES_AND_CHILD_RES, level - 1, offset - 1);
+			csr.getAEOrContainerOrGroup().add(node);
+		}
 		// adding schedule child
 		ScheduleEntity sch = csrEntity.getLinkedSchedule();
 		if (sch != null) {
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Patterns.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Patterns.java
index 0b7c185..b9ed2af 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Patterns.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Patterns.java
@@ -20,7 +20,6 @@
 
 package org.eclipse.om2m.core.router;
 
-import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import org.eclipse.om2m.commons.constants.Constants;
@@ -34,6 +33,8 @@
  */
 public class Patterns implements Constants {
 	
+//	private static Log LOGGER = LogFactory.getLog(Patterns.class);
+
 	/** All short name for filtering */
 	private static final String ALL_SHORT_NAMES = ShortName.ACP + "|" + ShortName.AE + "|" + ShortName.CNT +
 			"|" + ShortName.CIN + "|" + ShortName.REMOTE_CSE + "|" + ShortName.LATEST + "|" + ShortName.OLDEST +
@@ -98,7 +99,11 @@
     
     public final Pattern NODE_PATTERN = Pattern.compile(CSE_BASE_PATTERN + "/" + ShortName.NODE + Constants.PREFIX_SEPERATOR + ID_STRING);
     
+    public final Pattern NODE_ANNC_PATTERN = Pattern.compile(CSE_BASE_PATTERN + "/" + ShortName.NODE_ANNC + Constants.PREFIX_SEPERATOR + ID_STRING);
+    
     public final Pattern NMGMT_OBJ_PATTERN = Pattern.compile(CSE_BASE_PATTERN + "/" + ShortName.MGO + Constants.PREFIX_SEPERATOR + ID_STRING);
+    
+    public final Pattern NMGMT_OBJ_ANNC_PATTERN = Pattern.compile(CSE_BASE_PATTERN + "/" + ShortName.MGOA + Constants.PREFIX_SEPERATOR + ID_STRING);
 
     /** Non-hierarchical URI pattern */
     public final Pattern NON_HIERARCHICAL_PATTERN = Pattern.compile(
@@ -118,11 +123,7 @@
 	 */
 	public boolean match(Pattern pattern, String uri) {
 	    // Match uri with pattern
-	    Matcher m = pattern.matcher(uri);
-	    if (!m.matches()){
-	        return false;
-	    }
-	    return true;
+		return pattern.matcher(uri).matches();
 	}
 	
 	/**
@@ -180,9 +181,15 @@
 		if (match(NMGMT_OBJ_PATTERN, uri)) {
 			return db.getDAOFactory().getMgmtObjDAO();
 		}
+		if (match(NODE_ANNC_PATTERN, uri)) {
+			return db.getDAOFactory().getNodeAnncDAO();
+		}
+		if (match(NMGMT_OBJ_ANNC_PATTERN, uri)) {
+			return db.getDAOFactory().getMgmtObjAnncDAO();
+		}
 		return null;
 	}
-	
+
 	/**
 	 * Method used to check the validity of the resource name provided
 	 * @param resourceName
diff --git a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Router.java b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Router.java
index 4c84857..8408990 100644
--- a/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Router.java
+++ b/org.eclipse.om2m.core/src/main/java/org/eclipse/om2m/core/router/Router.java
@@ -39,11 +39,12 @@
 import org.eclipse.om2m.commons.exceptions.NotImplementedException;
 import org.eclipse.om2m.commons.exceptions.Om2mException;
 import org.eclipse.om2m.commons.exceptions.ResourceNotFoundException;
+import org.eclipse.om2m.commons.resource.DynamicAuthorizationConsultation;
 import org.eclipse.om2m.commons.resource.RequestPrimitive;
 import org.eclipse.om2m.commons.resource.ResponsePrimitive;
-import org.eclipse.om2m.core.controller.AEAnncController;
 import org.eclipse.om2m.core.controller.AEController;
 import org.eclipse.om2m.core.controller.AccessControlPolicyController;
+import org.eclipse.om2m.core.controller.AEAnncController;
 import org.eclipse.om2m.core.controller.CSEBaseController;
 import org.eclipse.om2m.core.controller.ContainerController;
 import org.eclipse.om2m.core.controller.ContentInstanceController;
@@ -58,6 +59,7 @@
 import org.eclipse.om2m.core.controller.LatestOldestController.SortingPolicy;
 import org.eclipse.om2m.core.controller.MgmtObjAnncController;
 import org.eclipse.om2m.core.controller.MgmtObjController;
+import org.eclipse.om2m.core.controller.NodeAnncController;
 import org.eclipse.om2m.core.controller.NodeController;
 import org.eclipse.om2m.core.controller.PollingChannelController;
 import org.eclipse.om2m.core.controller.PollingChannelUriController;
@@ -310,9 +312,15 @@
 		if (patterns.match(patterns.NODE_PATTERN, uri)) {
 			return new NodeController();
 		}
+		if (patterns.match(patterns.NODE_ANNC_PATTERN, uri)) {
+			return new NodeAnncController();
+		}
 		if (patterns.match(patterns.NMGMT_OBJ_PATTERN, uri)) {
 			return new MgmtObjController();
 		}
+		if (patterns.match(patterns.NMGMT_OBJ_ANNC_PATTERN, uri)) {
+			return new MgmtObjAnncController();
+		}
 		if (patterns.match(patterns.SUBSCRIPTION_PATTERN, uri)){
 			return new SubscriptionController();
 		}
@@ -373,6 +381,8 @@
 			return new MgmtObjController(); 
 		case ResourceType.MGMT_OBJ_ANNC:
 			return new MgmtObjAnncController(); 
+		case ResourceType.NODE_ANNC:
+			return new NodeAnncController();
 		default : 
 			throw new NotImplementedException("ResourceType: " + resourceType + " is not implemented");
 		}
diff --git a/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/CseUtil.java b/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/CseUtil.java
index 81b5c6c..fdddfa4 100644
--- a/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/CseUtil.java
+++ b/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/CseUtil.java
@@ -22,10 +22,9 @@
 import org.eclipse.om2m.commons.resource.AbstractFlexContainer;
 import org.eclipse.om2m.commons.resource.AccessControlPolicy;
 import org.eclipse.om2m.commons.resource.AccessControlRule;
-import org.eclipse.om2m.commons.resource.DeviceInfo;
+import org.eclipse.om2m.commons.resource.MgmtObj;
 import org.eclipse.om2m.commons.resource.Node;
 import org.eclipse.om2m.commons.resource.RequestPrimitive;
-import org.eclipse.om2m.commons.resource.Resource;
 import org.eclipse.om2m.commons.resource.ResponsePrimitive;
 import org.eclipse.om2m.commons.resource.SetOfAcrs;
 import org.eclipse.om2m.commons.resource.Subscription;
@@ -193,8 +192,7 @@
  	 * @param baseLocation location of the to be created resource
 	 * @return response sent by the CSE
 	 */
-	public static ResponsePrimitive sendCreateNodeRequest(Node node, 
-			DeviceInfo devInfo, String baseLocation) {
+	public static ResponsePrimitive sendCreateNodeRequest(Node node, String baseLocation) {
 		RequestPrimitive request = new RequestPrimitive();
 		request.setFrom(Constants.ADMIN_REQUESTING_ENTITY);
 		request.setTo(baseLocation);
@@ -209,15 +207,18 @@
 			return resp;
 		Node createdNode = (Node) resp.getContent();
 		
-		request = new RequestPrimitive();
-		request.setFrom(Constants.ADMIN_REQUESTING_ENTITY);
-		request.setTo(createdNode.getResourceID());
-		request.setOperation(Operation.CREATE);
-		request.setResourceType(ResourceType.MGMT_OBJ);
-		request.setRequestContentType(MimeMediaType.OBJ);
-		request.setReturnContentType(MimeMediaType.OBJ);
-		request.setContent(devInfo);
-		return cseService.doRequest(request);
+		for (MgmtObj mgmtObj : node.getMgmtObjs()) {
+			request = new RequestPrimitive();
+			request.setFrom(Constants.ADMIN_REQUESTING_ENTITY);
+			request.setTo(createdNode.getResourceID());
+			request.setOperation(Operation.CREATE);
+			request.setResourceType(ResourceType.MGMT_OBJ);
+			request.setRequestContentType(MimeMediaType.OBJ);
+			request.setReturnContentType(MimeMediaType.OBJ);
+			request.setContent(mgmtObj);
+			cseService.doRequest(request);
+		}
+		return resp;
 	}
 
 	/**
diff --git a/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/SDTDeviceAdaptor.java b/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/SDTDeviceAdaptor.java
index 3a5f5bb..fe2736c 100644
--- a/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/SDTDeviceAdaptor.java
+++ b/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/SDTDeviceAdaptor.java
@@ -13,10 +13,11 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.eclipse.om2m.commons.constants.ResponseStatusCode;
+import org.eclipse.om2m.commons.constants.ShortName;
 import org.eclipse.om2m.commons.resource.AbstractFlexContainer;
+import org.eclipse.om2m.commons.resource.AreaNwkDeviceInfo;
 import org.eclipse.om2m.commons.resource.CustomAttribute;
 import org.eclipse.om2m.commons.resource.DeviceInfo;
-import org.eclipse.om2m.commons.resource.MgmtObj;
 import org.eclipse.om2m.commons.resource.Node;
 import org.eclipse.om2m.commons.resource.ResponsePrimitive;
 import org.eclipse.om2m.commons.resource.flexcontainerspec.FlexContainerFactory;
@@ -31,12 +32,14 @@
 
 	private static final String SEP = "/";
 	private static final String DEVICE_PREFIX = "DEVICE_";
+	private static final String NODE_PREFIX = "NODE_";
 	
 	private final boolean hasToBeAnnounced;
 	private final String parentLocation;
 	private final String baseLocation;
 	private final String resourceLocation;
-	private final String resourceName;
+	private final String deviceName;
+	private final String nodeName;
 	private final Device device;
 	private final String adminAcpResource;
 	private final String announceCseId;
@@ -58,8 +61,9 @@
 		this.baseLocation = baseLocation;
 		this.hasToBeAnnounced = hasToBeAnnounced;
 		this.device = pDevice;
-		this.resourceName = DEVICE_PREFIX + device.getId();
-		this.resourceLocation = parentLocation + SEP + resourceName;
+		this.deviceName = DEVICE_PREFIX + device.getId();
+		this.nodeName = NODE_PREFIX + device.getId();
+		this.resourceLocation = parentLocation + SEP + deviceName;
 		this.announceCseId = pAnnounceCseId;
 		this.remoteCseName = pRemoteCseName;
 		this.adminAcpResource = pAdminAcpResource;
@@ -70,11 +74,11 @@
 	 * Publish the SDT Device as a FlexContainer entity into the oneM2M tree
 	 */
 	public boolean publishIntoOM2MTree() {
-		logger.info("publishIntoOM2MTree(flexContainerName=" + resourceName 
+		logger.info("publishIntoOM2MTree(flexContainerName=" + deviceName 
 				+ ", parentLocation:" + parentLocation);
 		
 		AbstractFlexContainer flexContainer = FlexContainerFactory.getSpecializationFlexContainer(device.getShortDefinitionName());
-		flexContainer.setName(resourceName);
+		flexContainer.setName(deviceName);
 		// set container definition with the value of the Device definition
 		flexContainer.setContainerDefinition(device.getDefinition());
 				
@@ -82,9 +86,6 @@
 		flexContainer.setLongName(device.getLongDefinitionName());
 		flexContainer.setShortName(device.getShortDefinitionName());
 		flexContainer.getAccessControlPolicyIDs().add(adminAcpResource);
-		if (hasToBeAnnounced) {
-			flexContainer.getAnnounceTo().add(SEP + announceCseId);
-		}
 		
 		// labels
 		flexContainer.getLabels().add("id/" + this.device.getId());
@@ -99,13 +100,38 @@
 		isPublished = true;
 		
 		Node node = new Node();
-		node.setNodeID("Node-" + resourceName);
+		node.setNodeID(nodeName);
+		node.setName(nodeName);
 		node.getAccessControlPolicyIDs().add(adminAcpResource);
-		if (hasToBeAnnounced) {
-			node.getAnnounceTo().add(SEP + announceCseId);
-		}
+		node.getLabels().add("object.type/node");
+		node.getLabels().add("name/" + nodeName);
 		DeviceInfo devInfo = new DeviceInfo();
 		node.getMgmtObjs().add(devInfo);
+		
+		AreaNwkDeviceInfo nwkDeviceInfo = new AreaNwkDeviceInfo();
+		node.getMgmtObjs().add(nwkDeviceInfo);
+		nwkDeviceInfo.setAreaNwkId("TBD");
+		nwkDeviceInfo.setDevID(this.device.getName());
+		nwkDeviceInfo.setDevType("SDT");
+		
+		logger.info("Node mgmtObjs: " + node.getMgmtObjs());
+
+		if (hasToBeAnnounced) {
+			flexContainer.getAnnounceTo().add(SEP + announceCseId);
+			flexContainer.getAnnouncedAttribute().add(ShortName.NODE_LINK);
+			
+			node.getAnnounceTo().add(SEP + announceCseId);
+			node.getAnnouncedAttribute().add(ShortName.HOSTED_SRV_LINK);
+			
+			devInfo.getAnnounceTo().add(SEP + announceCseId);
+			devInfo.getAnnouncedAttribute().add(ShortName.MANUFACTURER);
+			devInfo.getAnnouncedAttribute().add(ShortName.DEVICE_LABEL);
+			devInfo.getAnnouncedAttribute().add(ShortName.DEVICE_MODEL);
+			devInfo.getAnnouncedAttribute().add(ShortName.DEVICE_TYPE);
+			
+			nwkDeviceInfo.getAnnounceTo().add(SEP + announceCseId);
+			nwkDeviceInfo.getAnnouncedAttribute().add(ShortName.DEV_TYPE);
+		}
 
 		// SDT properties are customAttribute of the device FlexContainer
 		for (Property sdtProperty : device.getProperties()) {
@@ -161,28 +187,25 @@
 			}
 		}
 		
+		flexContainer.setNodeLink(nodeName);
 		ResponsePrimitive response = CseUtil.sendCreateFlexContainerRequest(flexContainer, 
 				parentLocation);
 		if (! response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {
 			logger.error("unable to create a FlexContainer for SDT Device "
-					+ resourceName + " : " + response.getContent(), null);
+					+ deviceName + " : " + response.getContent(), null);
 			return false;
 		}
 		flexContainer = (AbstractFlexContainer) response.getContent();
+		node.setHostedServiceLinks(flexContainer.getName());
 		
-		node.setHostedAppLinks(flexContainer.getResourceID());
-		response = CseUtil.sendCreateNodeRequest(node, devInfo, baseLocation);
+		response = CseUtil.sendCreateNodeRequest(node, baseLocation);
 		if (! response.getResponseStatusCode().equals(ResponseStatusCode.CREATED)) {
 			logger.error("unable to create a Node for SDT Device "
-					+ resourceName + " : " + response.getContent(), null);
+					+ deviceName + " : " + response.getContent(), null);
 			return false;
 		}
-		nodeLocation = ((MgmtObj)response.getContent()).getParentID();
+		nodeLocation = ((Node)response.getContent()).getResourceID();
 		
-		// update 
-		flexContainer.setNodeLink(nodeLocation);
-		CseUtil.sendUpdateFlexContainerRequest(flexContainer);
-
 		// Modules (must be done now because Device FlexContainer is the parent of each Module)
 		for (Module module : this.device.getModules()) {
 			SDTModuleAdaptor sdtModuleAdaptor = new SDTModuleAdaptor(module, 
diff --git a/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/SDTIpeApplication.java b/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/SDTIpeApplication.java
index 1065a61..a18c429 100644
--- a/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/SDTIpeApplication.java
+++ b/org.eclipse.om2m.ipe.sdt/src/main/java/org/eclipse/om2m/ipe/sdt/SDTIpeApplication.java
@@ -15,6 +15,7 @@
 import org.apache.commons.logging.LogFactory;
 import org.eclipse.om2m.commons.constants.Constants;
 import org.eclipse.om2m.commons.constants.ResponseStatusCode;
+import org.eclipse.om2m.commons.constants.ShortName;
 import org.eclipse.om2m.commons.resource.AE;
 import org.eclipse.om2m.commons.resource.AEAnnc;
 import org.eclipse.om2m.commons.resource.AccessControlPolicy;
@@ -112,6 +113,9 @@
 		ae.getPointOfAccess().add(POA);
 		if (hasToBeAnnounced) {
 			ae.getAnnounceTo().add(SEP + remoteCseId);
+			ae.getAnnouncedAttribute().add(ShortName.APP_ID);
+			ae.getAnnouncedAttribute().add(ShortName.APP_NAME);
+			ae.getAnnouncedAttribute().add(ShortName.NODE_LINK);
 		}
 
 		ResponsePrimitive resp = null;
diff --git a/org.eclipse.om2m.persistence.eclipselink/META-INF/persistence.xml b/org.eclipse.om2m.persistence.eclipselink/META-INF/persistence.xml
index b21a7de..42f45d6 100644
--- a/org.eclipse.om2m.persistence.eclipselink/META-INF/persistence.xml
+++ b/org.eclipse.om2m.persistence.eclipselink/META-INF/persistence.xml
@@ -33,30 +33,34 @@
 		<class>org.eclipse.om2m.commons.entities.AccessControlRuleEntity</class>
 		<class>org.eclipse.om2m.commons.entities.AeEntity</class>
 		<class>org.eclipse.om2m.commons.entities.AeAnncEntity</class>
+		<class>org.eclipse.om2m.commons.entities.AnnouncedResourceEntity</class>
 		<class>org.eclipse.om2m.commons.entities.AreaNwkDeviceInfoEntity</class>
+		<class>org.eclipse.om2m.commons.entities.AreaNwkDeviceInfoAnncEntity</class>
 		<class>org.eclipse.om2m.commons.entities.AreaNwkInfoEntity</class>
-		<class>org.eclipse.om2m.commons.entities.DeviceInfoEntity</class>
-		<class>org.eclipse.om2m.commons.entities.CSEBaseEntity</class>
+		<class>org.eclipse.om2m.commons.entities.AreaNwkInfoAnncEntity</class>
 		<class>org.eclipse.om2m.commons.entities.ContainerEntity</class>
+		<class>org.eclipse.om2m.commons.entities.ContentInstanceEntity</class>
+		<class>org.eclipse.om2m.commons.entities.CreatedAnnouncedResourceEntity</class>
+		<class>org.eclipse.om2m.commons.entities.CSEBaseEntity</class>
+		<class>org.eclipse.om2m.commons.entities.CustomAttributeEntity</class>
+		<class>org.eclipse.om2m.commons.entities.ContainerAnncEntity</class>
+		<class>org.eclipse.om2m.commons.entities.DeviceInfoEntity</class>
+		<class>org.eclipse.om2m.commons.entities.DeviceInfoAnncEntity</class>
 		<class>org.eclipse.om2m.commons.entities.DynamicAuthorizationConsultationEntity</class>
 		<class>org.eclipse.om2m.commons.entities.FlexContainerEntity</class>
 		<class>org.eclipse.om2m.commons.entities.FlexContainerAnncEntity</class>
-		<class>org.eclipse.om2m.commons.entities.CustomAttributeEntity</class>
-		<class>org.eclipse.om2m.commons.entities.ContainerAnncEntity</class>
-		<class>org.eclipse.om2m.commons.entities.ContentInstanceEntity</class>
 		<class>org.eclipse.om2m.commons.entities.GroupEntity</class>
 		<class>org.eclipse.om2m.commons.entities.LabelEntity</class>
 		<class>org.eclipse.om2m.commons.entities.NodeEntity</class>
+		<class>org.eclipse.om2m.commons.entities.NodeAnncEntity</class>
 		<class>org.eclipse.om2m.commons.entities.PollingChannelEntity</class>
+		<class>org.eclipse.om2m.commons.entities.RegularResourceEntity</class>
 		<class>org.eclipse.om2m.commons.entities.RemoteCSEEntity</class>
 		<class>org.eclipse.om2m.commons.entities.RemoteCseAnncEntity</class>
 		<class>org.eclipse.om2m.commons.entities.RequestEntity</class>
 		<class>org.eclipse.om2m.commons.entities.ScheduleEntity</class>
 		<class>org.eclipse.om2m.commons.entities.SubscriptionEntity</class>
 		<class>org.eclipse.om2m.commons.entities.UriMapperEntity</class>
-		<class>org.eclipse.om2m.commons.entities.CreatedAnnouncedResourceEntity</class>
-		<class>org.eclipse.om2m.commons.entities.RegularResourceEntity</class>
-		<class>org.eclipse.om2m.commons.entities.AnnouncedResourceEntity</class>
 
 		<properties>
 			<!-- Actions performed at the start of the platform -->
diff --git a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/DAOFactoryImpl.java b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/DAOFactoryImpl.java
index a49f637..0d0a87d 100644
--- a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/DAOFactoryImpl.java
+++ b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/DAOFactoryImpl.java
@@ -33,6 +33,7 @@
 import org.eclipse.om2m.commons.entities.LabelEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
 import org.eclipse.om2m.commons.entities.NodeEntity;
 import org.eclipse.om2m.commons.entities.PollingChannelEntity;
 import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
@@ -57,6 +58,7 @@
 import org.eclipse.om2m.persistence.eclipselink.internal.dao.LabelDAO;
 import org.eclipse.om2m.persistence.eclipselink.internal.dao.MgmtObjAnncDAO;
 import org.eclipse.om2m.persistence.eclipselink.internal.dao.MgmtObjDAO;
+import org.eclipse.om2m.persistence.eclipselink.internal.dao.NodeAnncDAO;
 import org.eclipse.om2m.persistence.eclipselink.internal.dao.NodeDAO;
 import org.eclipse.om2m.persistence.eclipselink.internal.dao.OldestDAO;
 import org.eclipse.om2m.persistence.eclipselink.internal.dao.PollingChannelDAO;
@@ -190,13 +192,18 @@
 	public DAO<DynamicAuthorizationConsultationEntity> getDynamicAuthorizationDAO() {
 		return new DynamicAuthorizationConsultationDAO();
 	}
-
+	
 	@Override
 	public DAO<ContentInstanceEntity> getOldestDAO() {
 		return new OldestDAO();
 	}
 
 	@Override
+	public DAO<NodeAnncEntity> getNodeAnncDAO() {
+		return new NodeAnncDAO();
+	}
+
+	@Override
 	public DAO<MgmtObjAnncEntity> getMgmtObjAnncDAO() {
 		return new MgmtObjAnncDAO();
 	}
diff --git a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/DynamicAuthorizationConsultationDAO.java b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/DynamicAuthorizationConsultationDAO.java
index 06828ed..770ec22 100644
--- a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/DynamicAuthorizationConsultationDAO.java
+++ b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/DynamicAuthorizationConsultationDAO.java
@@ -13,7 +13,9 @@
 import org.eclipse.om2m.commons.entities.FlexContainerEntity;
 import org.eclipse.om2m.commons.entities.GroupEntity;
 import org.eclipse.om2m.commons.entities.LabelEntity;
+import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
 import org.eclipse.om2m.commons.entities.NodeEntity;
 import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
 import org.eclipse.om2m.commons.entities.ScheduleEntity;
@@ -87,6 +89,10 @@
 			mgmtObj.getDynamicAuthorizationConsultations().remove(resource);
 			transaction.getEm().merge(mgmtObj);
 		}
+		for(MgmtObjAnncEntity mgmtObj : resource.getMgmtObjAnncEntities()) {
+			mgmtObj.getDynamicAuthorizationConsultations().remove(resource);
+			transaction.getEm().merge(mgmtObj);
+		}
 		
 		// remove link with Container
 		for(ContainerEntity ce : resource.getLinkedContainerEntities()) {
@@ -135,6 +141,10 @@
 			ne.getDynamicAuthorizationConsultations().remove(resource);
 			transaction.getEm().merge(ne);
 		}
+		for(NodeAnncEntity ne : resource.getLinkedNodeAnncEntities()) {
+			ne.getDynamicAuthorizationConsultations().remove(resource);
+			transaction.getEm().merge(ne);
+		}
 		
 		// remove link with RemoteCSE
 		for(RemoteCSEEntity rce : resource.getLinkedRemoteCSEEntities()) {
diff --git a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/MgmtObjAnncDAO.java b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/MgmtObjAnncDAO.java
index 8e4e282..ab05694 100644
--- a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/MgmtObjAnncDAO.java
+++ b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/MgmtObjAnncDAO.java
@@ -9,89 +9,85 @@
 
 import java.math.BigInteger;
 
-import org.eclipse.om2m.commons.entities.AreaNwkDeviceInfoEntity;
-import org.eclipse.om2m.commons.entities.AreaNwkInfoEntity;
-import org.eclipse.om2m.commons.entities.DeviceInfoEntity;
+import org.eclipse.om2m.commons.constants.MgmtDefinitionTypes;
+import org.eclipse.om2m.commons.entities.AreaNwkDeviceInfoAnncEntity;
+import org.eclipse.om2m.commons.entities.AreaNwkInfoAnncEntity;
+import org.eclipse.om2m.commons.entities.DeviceInfoAnncEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
-import org.eclipse.om2m.commons.entities.MgmtObjEntity;
 import org.eclipse.om2m.commons.entities.NodeEntity;
 import org.eclipse.om2m.persistence.eclipselink.internal.DBTransactionJPAImpl;
 import org.eclipse.om2m.persistence.service.DBTransaction;
 
 public class MgmtObjAnncDAO extends AbstractDAO<MgmtObjAnncEntity> {
 	
-	private AbstractDAO<DeviceInfoEntity> deviceInfoDAO;
-	private AbstractDAO<AreaNwkInfoEntity> areaNwkInfoDAO;
-	private AbstractDAO<AreaNwkDeviceInfoEntity> areaNwkDeviceInfoDAO;
-	
+	private AbstractDAO<DeviceInfoAnncEntity> deviceInfoDAO;
+	private AbstractDAO<AreaNwkInfoAnncEntity> areaNwkInfoDAO;
+	private AbstractDAO<AreaNwkDeviceInfoAnncEntity> areaNwkDeviceInfoDAO;
 	
 	public MgmtObjAnncDAO() {
-		deviceInfoDAO = new AbstractDAO<DeviceInfoEntity>() {
+		deviceInfoDAO = new AbstractDAO<DeviceInfoAnncEntity>() {
 			@Override
-			public DeviceInfoEntity find(DBTransaction dbTransaction, Object id) {
+			public DeviceInfoAnncEntity find(DBTransaction dbTransaction, Object id) {
 				DBTransactionJPAImpl transaction = (DBTransactionJPAImpl) dbTransaction;
-				return transaction.getEm().find(DeviceInfoEntity.class, id);
+				return transaction.getEm().find(DeviceInfoAnncEntity.class, id);
 			}
 			@Override
-			public void delete(DBTransaction dbTransaction, DeviceInfoEntity resource) {
+			public void delete(DBTransaction dbTransaction, DeviceInfoAnncEntity resource) {
 			}
 		};
 		
-		areaNwkInfoDAO = new AbstractDAO<AreaNwkInfoEntity>() {
+		areaNwkInfoDAO = new AbstractDAO<AreaNwkInfoAnncEntity>() {
 			@Override
-			public AreaNwkInfoEntity find(DBTransaction dbTransaction, Object id) {
+			public AreaNwkInfoAnncEntity find(DBTransaction dbTransaction, Object id) {
 				DBTransactionJPAImpl transaction = (DBTransactionJPAImpl) dbTransaction;
-				return transaction.getEm().find(AreaNwkInfoEntity.class, id);
+				return transaction.getEm().find(AreaNwkInfoAnncEntity.class, id);
 			}
 			@Override
-			public void delete(DBTransaction dbTransaction, AreaNwkInfoEntity resource) {
+			public void delete(DBTransaction dbTransaction, AreaNwkInfoAnncEntity resource) {
 			}
 		};
 		
-		areaNwkDeviceInfoDAO = new AbstractDAO<AreaNwkDeviceInfoEntity>() {
+		areaNwkDeviceInfoDAO = new AbstractDAO<AreaNwkDeviceInfoAnncEntity>() {
 			@Override
-			public AreaNwkDeviceInfoEntity find(DBTransaction dbTransaction, Object id) {
+			public AreaNwkDeviceInfoAnncEntity find(DBTransaction dbTransaction, Object id) {
 				DBTransactionJPAImpl transaction = (DBTransactionJPAImpl) dbTransaction;
-				return transaction.getEm().find(AreaNwkDeviceInfoEntity.class, id);
+				return transaction.getEm().find(AreaNwkDeviceInfoAnncEntity.class, id);
 			}
 			@Override
-			public void delete(DBTransaction dbTransaction, AreaNwkDeviceInfoEntity resource) {
+			public void delete(DBTransaction dbTransaction, AreaNwkDeviceInfoAnncEntity resource) {
 			}
 		};
 	}
 
 	@Override
 	public void create(DBTransaction dbTransaction, MgmtObjAnncEntity resource) {
-		// TODO
 		BigInteger mgd = resource.getMgmtDefinition();
-//		if (mgd.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
-//			areaNwkInfoDAO.create(dbTransaction, (AreaNwkInfoEntity) resource);
-//		else if (mgd.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
-//			areaNwkDeviceInfoDAO.create(dbTransaction, (AreaNwkDeviceInfoEntity) resource);
-//		else if (mgd.equals(MgmtDefinitionTypes.DEVICE_INFO))
-//			deviceInfoDAO.create(dbTransaction, (DeviceInfoEntity) resource);
-//		else 
+		if (mgd.equals(MgmtDefinitionTypes.AREA_NWK_INFO))
+			areaNwkInfoDAO.create(dbTransaction, (AreaNwkInfoAnncEntity) resource);
+		else if (mgd.equals(MgmtDefinitionTypes.AREA_NWK_DEVICE_INFO))
+			areaNwkDeviceInfoDAO.create(dbTransaction, (AreaNwkDeviceInfoAnncEntity) resource);
+		else if (mgd.equals(MgmtDefinitionTypes.DEVICE_INFO))
+			deviceInfoDAO.create(dbTransaction, (DeviceInfoAnncEntity) resource);
+		else 
 			throw new UnsupportedOperationException("Not implemented");
 	}
 
 	@Override
 	public MgmtObjAnncEntity find(DBTransaction dbTransaction, Object id) {
-		// TODO
-		MgmtObjEntity ret = deviceInfoDAO.find(dbTransaction, id);
-//		if (ret != null) return ret;
-//		ret = areaNwkInfoDAO.find(dbTransaction, id);
-//		if (ret != null) return ret;
-//		ret = areaNwkDeviceInfoDAO.find(dbTransaction, id);
-//		if (ret != null) return ret;
+		MgmtObjAnncEntity ret = deviceInfoDAO.find(dbTransaction, id);
+		if (ret != null) return ret;
+		ret = areaNwkInfoDAO.find(dbTransaction, id);
+		if (ret != null) return ret;
+		ret = areaNwkDeviceInfoDAO.find(dbTransaction, id);
+		if (ret != null) return ret;
 		return null;
 	}
 
 	@Override
 	public void delete(DBTransaction dbTransaction, MgmtObjAnncEntity resource) {
 		DBTransactionJPAImpl transaction = (DBTransactionJPAImpl) dbTransaction;
-//		if (resource.getParentAE() != null) {
-//			resource.getParentAE().getChildFlexContainers().remove(resource);
-//		}
+		if (resource.getParentNode() != null)
+			resource.getParentNode().removeMgmtObj(resource);
 		transaction.getEm().remove(resource);
 		// cleaning the cache
 		transaction.getEm().getEntityManagerFactory().getCache().evict(NodeEntity.class);
diff --git a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/MgmtObjDAO.java b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/MgmtObjDAO.java
index e84f056..aded936 100644
--- a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/MgmtObjDAO.java
+++ b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/MgmtObjDAO.java
@@ -90,7 +90,7 @@
 			resource.getParentNode().removeMgmtObj(resource);
 		transaction.getEm().remove(resource);
 		// cleaning the cache
-		transaction.getEm().getEntityManagerFactory().getCache().evict(NodeEntity.class);
+//		transaction.getEm().getEntityManagerFactory().getCache().evict(NodeEntity.class);
 	}
 
 }
diff --git a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/NodeAnncDAO.java b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/NodeAnncDAO.java
new file mode 100644
index 0000000..b397fe5
--- /dev/null
+++ b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/NodeAnncDAO.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2014, 2017 Orange.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *******************************************************************************/
+package org.eclipse.om2m.persistence.eclipselink.internal.dao;
+
+import java.util.List;
+
+import org.eclipse.om2m.commons.entities.LabelEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
+import org.eclipse.om2m.persistence.eclipselink.internal.DBTransactionJPAImpl;
+import org.eclipse.om2m.persistence.service.DBTransaction;
+
+public class NodeAnncDAO extends AbstractDAO<NodeAnncEntity>{
+
+	@Override
+	public NodeAnncEntity find(DBTransaction dbTransaction, Object id) {
+		DBTransactionJPAImpl transaction = (DBTransactionJPAImpl) dbTransaction;
+		return transaction.getEm().find(NodeAnncEntity.class, id);
+	}
+
+	@Override
+	public void delete(DBTransaction dbTransaction, NodeAnncEntity resource) {
+		DBTransactionJPAImpl transaction = (DBTransactionJPAImpl) dbTransaction;
+		for (LabelEntity label : resource.getLabelsEntities()) {
+			label.getLinkedNodesA().remove(resource);
+		}
+		if (resource.getParentCsb() != null) {
+			resource.getParentCsb().getChildAnncNodes().remove(resource);
+		}
+		if (resource.getParentCsr() != null) {
+			resource.getParentCsr().getChildAnncNodes().remove(resource);
+		}
+		transaction.getEm().remove(resource);
+	}
+	
+	@Override
+	public void update(DBTransaction dbTransaction, NodeAnncEntity resource) {
+		DBTransactionJPAImpl transaction = (DBTransactionJPAImpl) dbTransaction;
+		List<LabelEntity> lbls = processLabels(dbTransaction, resource.getLabelsEntities());
+		resource.setLabelsEntities(lbls);
+		transaction.getEm().merge(resource);
+		super.update(dbTransaction, resource);
+//		List<LabelEntity> lbls = processLabels(dbTransaction, resource.getLabelsEntities());
+//		resource.setLabelsEntities(lbls);
+//		super.update(dbTransaction, resource);
+	}
+
+}
diff --git a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/NodeDAO.java b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/NodeDAO.java
index 00d67ee..f9e401c 100644
--- a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/NodeDAO.java
+++ b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/dao/NodeDAO.java
@@ -39,9 +39,18 @@
 	@Override
 	public void delete(DBTransaction dbTransaction, NodeEntity resource) {
 		DBTransactionJPAImpl transaction = (DBTransactionJPAImpl) dbTransaction;
+		for (LabelEntity label : resource.getLabelsEntities()) {
+			label.getLinkedNodes().remove(resource);
+		}
+		if (resource.getParentCsb() != null) {
+			resource.getParentCsb().getChildNodes().remove(resource);
+		}
+		if (resource.getParentCsr() != null) {
+			resource.getParentCsr().getChildNodes().remove(resource);
+		}
 		transaction.getEm().remove(resource);
-		transaction.getEm().getEntityManagerFactory().getCache().evict(CSEBaseEntity.class);
-		transaction.getEm().getEntityManagerFactory().getCache().evict(RemoteCSEEntity.class);
+//		transaction.getEm().getEntityManagerFactory().getCache().evict(CSEBaseEntity.class);
+//		transaction.getEm().getEntityManagerFactory().getCache().evict(RemoteCSEEntity.class);
 	}
 	
 	@Override
diff --git a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/util/DynamicAuthorizationConsultationUtilImpl.java b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/util/DynamicAuthorizationConsultationUtilImpl.java
index 650eb39..e572bc6 100644
--- a/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/util/DynamicAuthorizationConsultationUtilImpl.java
+++ b/org.eclipse.om2m.persistence.eclipselink/src/main/java/org/eclipse/om2m/persistence/eclipselink/internal/util/DynamicAuthorizationConsultationUtilImpl.java
@@ -17,7 +17,9 @@
 import org.eclipse.om2m.commons.entities.FlexContainerAnncEntity;
 import org.eclipse.om2m.commons.entities.FlexContainerEntity;
 import org.eclipse.om2m.commons.entities.GroupEntity;
+import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
 import org.eclipse.om2m.commons.entities.NodeEntity;
 import org.eclipse.om2m.commons.entities.PollingChannelEntity;
 import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
@@ -195,13 +197,18 @@
 		case ResourceType.MGMT_OBJ:
 			MgmtObjEntity mgmtObjEntity = DBServiceJPAImpl.getInstance().getDAOFactory()
 				.getMgmtObjDAO().find(dbTransaction, resourceId);
-			resourceEntity = mgmtObjEntity;
-			if (mgmtObjEntity != null) {
-				daces.addAll(mgmtObjEntity.getDynamicAuthorizationConsultations());
-			}
+		resourceEntity = mgmtObjEntity;
+		if (mgmtObjEntity != null) {
+			daces.addAll(mgmtObjEntity.getDynamicAuthorizationConsultations());
+		}
 			break;
 		case ResourceType.MGMT_OBJ_ANNC:
-			// TODO ?
+			MgmtObjAnncEntity mgmtObjAnncEntity = DBServiceJPAImpl.getInstance().getDAOFactory()
+				.getMgmtObjAnncDAO().find(dbTransaction, resourceId);
+			resourceEntity = mgmtObjAnncEntity;
+			if (mgmtObjAnncEntity != null) {
+				daces.addAll(mgmtObjAnncEntity.getDynamicAuthorizationConsultations());
+			}
 			break;
 		case ResourceType.NODE:
 			NodeEntity nodeEntity = DBServiceJPAImpl.getInstance().getDAOFactory().getNodeDAO().find(dbTransaction, resourceId);
@@ -211,7 +218,11 @@
 			}
 			break;
 		case ResourceType.NODE_ANNC:
-			// TODO ?
+			NodeAnncEntity nodeAnncEntity = DBServiceJPAImpl.getInstance().getDAOFactory().getNodeAnncDAO().find(dbTransaction, resourceId);
+			resourceEntity = nodeAnncEntity;
+			if (nodeAnncEntity != null) {
+				daces.addAll(nodeAnncEntity.getDynamicAuthorizationConsultations());
+			}
 			break;
 		case ResourceType.POLLING_CHANNEL:
 			PollingChannelEntity pollingChannelEntity = DBServiceJPAImpl.getInstance().getDAOFactory().getPollingChannelDAO().find(dbTransaction, resourceId);
diff --git a/org.eclipse.om2m.persistence.mongodb/src/main/java/org/eclipse/om2m/persistence/mongodb/DAOFactoryImpl.java b/org.eclipse.om2m.persistence.mongodb/src/main/java/org/eclipse/om2m/persistence/mongodb/DAOFactoryImpl.java
index 49428f1..3ce5e58 100644
--- a/org.eclipse.om2m.persistence.mongodb/src/main/java/org/eclipse/om2m/persistence/mongodb/DAOFactoryImpl.java
+++ b/org.eclipse.om2m.persistence.mongodb/src/main/java/org/eclipse/om2m/persistence/mongodb/DAOFactoryImpl.java
@@ -22,6 +22,7 @@
 import org.eclipse.om2m.commons.entities.LabelEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
 import org.eclipse.om2m.commons.entities.NodeEntity;
 import org.eclipse.om2m.commons.entities.PollingChannelEntity;
 import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
@@ -159,7 +160,7 @@
 	
 	@Override
 	public DAO<DynamicAuthorizationConsultationEntity> getDynamicAuthorizationDAO() {
-		return  new DAOImpl<DynamicAuthorizationConsultationEntity>(DynamicAuthorizationConsultationEntity.class) {
+		return new DAOImpl<DynamicAuthorizationConsultationEntity>(DynamicAuthorizationConsultationEntity.class) {
 		};
 	}
 
@@ -169,6 +170,17 @@
 		};
 	}
 
+	@Override
+	public DAO<NodeAnncEntity> getNodeAnncDAO() {
+		return new DAOImpl<NodeAnncEntity>(NodeAnncEntity.class) {
+		};
+	}
+
+	@Override
+	public DAO<MgmtObjAnncEntity> getMgmtObjAnncDAO() {
+		return new DAOImpl<MgmtObjAnncEntity>(MgmtObjAnncEntity.class) {
+		};
+	}
 	
 	@Override
 	public DAO<ContainerEntity> getContainerByResourceNameDAO() {
@@ -185,10 +197,4 @@
 		return new AeByAppIdDAO();
 	}
 
-	@Override
-	public DAO<MgmtObjAnncEntity> getMgmtObjAnncDAO() {
-		return new DAOImpl<MgmtObjAnncEntity>(MgmtObjAnncEntity.class) {
-		};
-	}
-
 }
diff --git a/org.eclipse.om2m.persistence.mongodb/src/main/java/org/eclipse/om2m/persistence/mongodb/dao/LabelEntityDao.java b/org.eclipse.om2m.persistence.mongodb/src/main/java/org/eclipse/om2m/persistence/mongodb/dao/LabelEntityDao.java
index bef107c..75355e2 100644
--- a/org.eclipse.om2m.persistence.mongodb/src/main/java/org/eclipse/om2m/persistence/mongodb/dao/LabelEntityDao.java
+++ b/org.eclipse.om2m.persistence.mongodb/src/main/java/org/eclipse/om2m/persistence/mongodb/dao/LabelEntityDao.java
@@ -16,17 +16,16 @@
 import org.eclipse.om2m.commons.entities.AccessControlPolicyEntity;
 import org.eclipse.om2m.commons.entities.AeAnncEntity;
 import org.eclipse.om2m.commons.entities.AeEntity;
-import org.eclipse.om2m.commons.entities.AreaNwkDeviceInfoEntity;
-import org.eclipse.om2m.commons.entities.AreaNwkInfoEntity;
 import org.eclipse.om2m.commons.entities.CSEBaseEntity;
 import org.eclipse.om2m.commons.entities.ContainerEntity;
 import org.eclipse.om2m.commons.entities.ContentInstanceEntity;
-import org.eclipse.om2m.commons.entities.DeviceInfoEntity;
 import org.eclipse.om2m.commons.entities.FlexContainerAnncEntity;
 import org.eclipse.om2m.commons.entities.FlexContainerEntity;
 import org.eclipse.om2m.commons.entities.GroupEntity;
 import org.eclipse.om2m.commons.entities.LabelEntity;
+import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
 import org.eclipse.om2m.commons.entities.NodeEntity;
 import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
 import org.eclipse.om2m.persistence.mongodb.DBServiceImpl;
@@ -108,10 +107,18 @@
 					NodeEntity nodeEntity = DBServiceImpl.getInstance().getGson().fromJson(element.toJson(), NodeEntity.class);
 					labelEntity.getLinkedNodes().add(nodeEntity);
 					break;
+				case(ResourceType.NODE_ANNC):
+					NodeAnncEntity nodeAnncEntity = DBServiceImpl.getInstance().getGson().fromJson(element.toJson(), NodeAnncEntity.class);
+					labelEntity.getLinkedNodesA().add(nodeAnncEntity);
+					break;
 				case(ResourceType.MGMT_OBJ): 
 					MgmtObjEntity mgmtObjEntity = DBServiceImpl.getInstance().getGson().fromJson(element.toJson(), MgmtObjEntity.class);
 					labelEntity.addMgmtObj(mgmtObjEntity);
 					break;
+				case(ResourceType.MGMT_OBJ_ANNC): 
+					MgmtObjAnncEntity mgmtObjAnncEntity = DBServiceImpl.getInstance().getGson().fromJson(element.toJson(), MgmtObjAnncEntity.class);
+					labelEntity.addMgmtObjA(mgmtObjAnncEntity);
+					break;
 				default:
 					break;
 				}
diff --git a/org.eclipse.om2m.persistence.service/src/main/java/org/eclipse/om2m/persistence/service/DAOFactory.java b/org.eclipse.om2m.persistence.service/src/main/java/org/eclipse/om2m/persistence/service/DAOFactory.java
index eeaf8fe..48acbf5 100644
--- a/org.eclipse.om2m.persistence.service/src/main/java/org/eclipse/om2m/persistence/service/DAOFactory.java
+++ b/org.eclipse.om2m.persistence.service/src/main/java/org/eclipse/om2m/persistence/service/DAOFactory.java
@@ -34,6 +34,7 @@
 import org.eclipse.om2m.commons.entities.LabelEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjAnncEntity;
 import org.eclipse.om2m.commons.entities.MgmtObjEntity;
+import org.eclipse.om2m.commons.entities.NodeAnncEntity;
 import org.eclipse.om2m.commons.entities.NodeEntity;
 import org.eclipse.om2m.commons.entities.PollingChannelEntity;
 import org.eclipse.om2m.commons.entities.RemoteCSEEntity;
@@ -96,6 +97,8 @@
 
 	public abstract DAO<ContentInstanceEntity> getOldestDAO();
 
+	public abstract DAO<NodeAnncEntity> getNodeAnncDAO();
+
 	public abstract DAO<MgmtObjAnncEntity> getMgmtObjAnncDAO();
 
 }
