diff --git a/server/device.cpp b/server/device.cpp
index a253a6d..6420ee5 100644
--- a/server/device.cpp
+++ b/server/device.cpp
@@ -3229,7 +3229,43 @@ void DeviceImpl::add_attribute(Tango::Attr *new_attr)
 
 	if (new_attr->is_fwd() == true)
 	{
-		dev_attr->add_fwd_attribute(device_name,device_class,i,new_attr);
+		// If forwarded attribute is dynamically created and was constructed without specifying
+		// the root_attribute parameter then we have to get its __root_att property from tango DB
+		// prior to calling validate_fwd_att()
+		vector<AttrProperty> dev_prop;
+		Tango::Util *tg = Tango::Util::instance();
+		Tango::FwdAttr *fwd_attr = static_cast<Tango::FwdAttr *> (new_attr);
+		if ((tg->_UseDb==true) && (fwd_attr->get_full_root_att()==RootAttNotDef))
+		{
+			Tango::DbData db_list;
+			db_list.push_back(DbDatum(new_attr->get_name()));
+			tg->get_database()->get_device_attribute_property(this->device_name,db_list,tg->get_db_cache());
+			for (unsigned int ind=0 ; ind<db_list.size() ; ind++)
+			{
+				if (db_list[ind].name == RootAttrPropName)
+				{
+					dev_prop.push_back(AttrProperty(db_list[ind].name, db_list[ind].value_string[0]));
+					break;
+				}
+			}
+		}
+		// Validate the __root_att property of the attribute
+		fwd_attr->validate_fwd_att(dev_prop, this->device_name);
+		// Register the root attribute configuration
+		try
+		{
+			fwd_attr->get_root_conf(this->device_name,this);
+		}
+        catch (...)
+        {
+			DeviceImpl::FwdWrongConf fwc;
+			fwc.att_name = attr_name;
+			fwc.full_root_att_name = fwd_attr->get_full_root_att();
+			fwc.fae = fwd_attr->get_err_kind();
+			fwd_att_wrong_conf.push_back(fwc);
+        }
+		// Add the attribute
+		dev_attr->add_fwd_attribute(device_name,device_class,i,fwd_attr);
 	}
 	else
 		dev_attr->add_attribute(device_name,device_class,i);
diff --git a/server/fwdattrdesc.cpp b/server/fwdattrdesc.cpp
index 1c019f5..de1a032 100644
--- a/server/fwdattrdesc.cpp
+++ b/server/fwdattrdesc.cpp
@@ -180,7 +180,10 @@ bool FwdAttr::validate_fwd_att(vector<AttrProperty> &prop_list,const string &dev
 	}
 	catch (...) {}
 
-	if (root_att_db_defined == true)
+	//check if full_root_att is already set
+	if (full_root_att.size()!=0 and full_root_att.compare(RootAttNotDef)!=0)
+		;
+	else if (root_att_db_defined == true)
 		full_root_att = root_att_db;
     else
         full_root_att = RootAttNotDef;
diff --git a/server/multiattribute.cpp b/server/multiattribute.cpp
index 932cae4..6685389 100644
--- a/server/multiattribute.cpp
+++ b/server/multiattribute.cpp
@@ -915,6 +915,12 @@ void MultiAttribute::add_fwd_attribute(string &dev_name,DeviceClass *dev_class_p
 			alarm_attr_list.push_back(index);
 	}
 
+//
+// Check if the writable_attr_name property is set and in this case, check if the associated attribute exists and is
+// writable
+//
+	check_associated(index,dev_name);
+
 	cout4 << "Leaving MultiAttribute::add_fwd_attribute" << endl;
 }
 
