diff --git a/TestFramework/data/TestCDataWrapper.cpp b/TestFramework/data/TestCDataWrapper.cpp
index c1bc0aff78c63ec0c4511fd7659e697edb315684..7be685d9b5445fdb8f73a810687e695db181a50e 100644
--- a/TestFramework/data/TestCDataWrapper.cpp
+++ b/TestFramework/data/TestCDataWrapper.cpp
@@ -98,6 +98,32 @@ TEST(CDataWrapperTest, Performance) {
         ASSERT_TRUE(cloned->isBoolValue("bv"));
         data_pack.reset();
     }
+}
+TEST(CDataWrapperTest, haKey) {
+    int idx = 0;
+    CDataWrapper data_pack;
+    data_pack.addBoolValue("bv", (int32_t)0);
+    data_pack.addInt32Value("i32v", (int32_t)0);
+
+    data_pack.addInt32Value("i32v.pippo", (int32_t)0);
+    data_pack.addDoubleValue("dbv", (double)36.6);
+    data_pack.addDoubleValue("dbv.pippo", (double)37.6);
+    ASSERT_TRUE(data_pack.hasKey("bv"));
+    ASSERT_FALSE(data_pack.hasKey("bva"));
+    ASSERT_FALSE(data_pack.hasKey("bv.pippo"));
+    
+    ASSERT_TRUE(data_pack.hasKey("dbv"));
+    ASSERT_FALSE(data_pack.hasKey("dbva"));
+    ASSERT_FALSE(data_pack.hasKey("dbv.pippa"));
+    ASSERT_TRUE(data_pack.hasKey("dbv.pippo"));
+
+    ASSERT_TRUE(data_pack.hasKey("i32v"));
+    ASSERT_FALSE(data_pack.hasKey("i32va"));
+    ASSERT_FALSE(data_pack.hasKey("i32v.pippa"));
+    ASSERT_TRUE(data_pack.hasKey("i32v.pippo"));
+    
+    
+    
 }
 TEST(CDataWrapperTest, TestJsonDouble) {
     const char* test_json_translation="{\"double_key\":[1.0,2.1,-1.0,-0.9]}";
diff --git a/chaos/common/data/CDataWrapper.cpp b/chaos/common/data/CDataWrapper.cpp
index 0cd8d7df14391447c724303924d0436fffaa402c..efef62b8ee830865902ea7ae3cd64b872567ae82 100644
--- a/chaos/common/data/CDataWrapper.cpp
+++ b/chaos/common/data/CDataWrapper.cpp
@@ -811,7 +811,17 @@ CDBufferUniquePtr CDataWrapper::getBinaryValueAsCDataBuffer(const std::string& k
 
 // check if the key is present in data wrapper
 bool CDataWrapper::hasKey(const std::string& key) const {
-  return bson_has_field(ACCESS_BSON(bson), key.c_str());
+   bson_iter_t iter;
+   bson_iter_t child;
+
+   BSON_ASSERT (bson);
+   if(key.size()==0) return false;
+   if(strchr(key.c_str(),'.')){
+    // if contains . cannot recurse
+    return (bson_iter_init (&iter, ACCESS_BSON(bson)) && bson_iter_find (&iter, key.c_str()));
+   } 
+  return (bson_iter_init (&iter, ACCESS_BSON(bson)) && bson_iter_find_descendant (&iter, key.c_str(), &child));
+   
 }
 
 bool CDataWrapper::isVector(const std::string& key) const {