all: merge from official Eclipse branch


Change-Id: Iba1502617c1c401217471a52b15273ac4690ac1f
Signed-off-by: BONNARDEL Gregory <gbonnardel.ext@orange.com>
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();
 
 }