diff --git a/yaserde/tests/deserializer.rs b/yaserde/tests/deserializer.rs
index b250f44..42230ff 100644
--- a/yaserde/tests/deserializer.rs
+++ b/yaserde/tests/deserializer.rs
@@ -181,6 +181,8 @@ fn de_rename() {
     item: String,
     #[yaserde(rename = "sub")]
     sub_struct: SubStruct,
+    #[yaserde(rename = "maj.min.bug")]
+    with_dots: String,
   }
 
   #[derive(YaDeserialize, PartialEq, Debug)]
@@ -198,7 +200,7 @@ fn de_rename() {
     }
   }
 
-  let content = "";
+  let content = "2.0.1";
   convert_and_validate!(
     content,
     XmlStruct,
@@ -207,6 +209,7 @@ fn de_rename() {
       sub_struct: SubStruct {
         subitem: "sub_something".to_string(),
       },
+      with_dots: "2.0.1".into()
     }
   );
 }
@@ -378,6 +381,8 @@ fn de_complex_enum() {
     Magenta(Vec),
     #[yaserde(rename = "NotSoCyan")]
     Cyan(Vec),
+    #[yaserde(rename = "renamed.with.dots")]
+    Dotted(u32),
   }
 
   impl Default for Color {
@@ -551,6 +556,21 @@ fn de_complex_enum() {
       ])
     }
   );
+
+  let content = r#"
+    
+      
+        54
+      
+    
+  "#;
+  convert_and_validate!(
+    content,
+    XmlStruct,
+    XmlStruct {
+      background: Color::Dotted(54)
+    }
+  );
 }
 
 #[test]
diff --git a/yaserde/tests/serializer.rs b/yaserde/tests/serializer.rs
index c27e270..66480e0 100644
--- a/yaserde/tests/serializer.rs
+++ b/yaserde/tests/serializer.rs
@@ -125,6 +125,8 @@ fn ser_rename() {
     item: String,
     #[yaserde(rename = "sub")]
     sub_struct: SubStruct,
+    #[yaserde(rename = "maj.min.bug")]
+    version: String,
   }
 
   #[derive(YaSerialize, PartialEq, Debug)]
@@ -154,9 +156,10 @@ fn ser_rename() {
     sub_struct: SubStruct {
       subitem: "sub_something".to_string(),
     },
+    version: "2.0.2".into(),
   };
 
-  let content = "";
+  let content = "2.0.2";
   convert_and_validate!(model, content);
 }
 
@@ -326,6 +329,8 @@ fn ser_unnamed_enum() {
     Structs(Vec),
     #[yaserde(rename = "renamed")]
     ToRename(u32),
+    #[yaserde(rename = "renamed.with.dots")]
+    ToRenameDots(u32),
   }
 
   impl Default for Enum {
@@ -422,6 +427,14 @@ fn ser_unnamed_enum() {
   let content =
     "87";
   convert_and_validate!(model, content);
+
+  let model = XmlStruct {
+    color: Enum::ToRenameDots(84),
+  };
+
+  let content =
+    "84";
+  convert_and_validate!(model, content);
 }
 
 #[test]
diff --git a/yaserde_derive/src/de/expand_struct.rs b/yaserde_derive/src/de/expand_struct.rs
index 4f3fae2..37814e5 100644
--- a/yaserde_derive/src/de/expand_struct.rs
+++ b/yaserde_derive/src/de/expand_struct.rs
@@ -207,7 +207,7 @@ pub fn parse(
         .rename
         .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string());
 
-      let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site());
+      let visitor_label = build_visitor_ident(&label_name, None);
 
       match get_field_type(field) {
         Some(FieldType::FieldTypeString) => {
@@ -252,10 +252,7 @@ pub fn parse(
             .iter()
             .map(|s| s.ident.to_string())
             .collect();
-          let struct_ident = Ident::new(
-            &format!("__Visitor_{}_{}", label_name, struct_id),
-            Span::call_site(),
-          );
+          let struct_ident = build_visitor_ident(&label_name, Some(&struct_id));
 
           Some(quote! {
             #[allow(non_snake_case, non_camel_case_types)]
@@ -405,11 +402,10 @@ pub fn parse(
         return None;
       }
 
-      let label_name = if let Some(ref value) = field_attrs.rename {
-        Ident::new(&value.to_string(), Span::call_site()).to_string()
-      } else {
-        field.ident.clone().unwrap().to_string()
-      };
+      let label_name = field_attrs
+        .rename
+        .clone()
+        .unwrap_or_else(|| label.as_ref().unwrap().to_string());
 
       match get_field_type(field) {
         Some(FieldType::FieldTypeString) => {
@@ -899,7 +895,7 @@ pub fn parse(
         .rename
         .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string());
 
-      let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site());
+      let visitor_label = build_visitor_ident(&label_name, None);
 
       match get_field_type(field) {
         Some(FieldType::FieldTypeString) => Some(quote! {
@@ -1077,13 +1073,9 @@ pub fn parse(
           }
         }
         Some(FieldType::FieldTypeStruct { struct_name }) => {
-          let struct_ident = Ident::new(
-            &format!(
-              "__Visitor_{}_{}",
-              label_name,
-              struct_name.into_token_stream()
-            ),
-            Span::call_site(),
+          let struct_ident = build_visitor_ident(
+            &label_name,
+            Some(&struct_name.into_token_stream().to_string()),
           );
 
           Some(quote! {
@@ -1307,12 +1299,12 @@ fn build_call_visitor(
 
   // let label = &field.ident;
   let value_label = get_value_label(label);
-  let label_name = if let Some(ref value) = field_attrs.rename {
-    Ident::new(&value.to_string(), Span::call_site()).to_string()
-  } else {
-    label.clone().unwrap().to_string()
-  };
-  let visitor_label = Ident::new(&format!("__Visitor{}", label_name), Span::call_site());
+  let label_name = field_attrs
+    .rename
+    .clone()
+    .unwrap_or_else(|| label.as_ref().unwrap().to_string());
+
+  let visitor_label = build_visitor_ident(&label_name, None);
 
   let namespaces_matches: TokenStream = namespaces
     .iter()
@@ -1410,3 +1402,14 @@ fn get_value_label(ident: &Option) -> Option {
     None => None,
   }
 }
+
+fn build_visitor_ident(label: &str, struct_id: Option<&str>) -> Ident {
+  Ident::new(
+    &format!(
+      "__Visitor_{}_{}",
+      label.replace(".", "_"),
+      struct_id.unwrap_or("")
+    ),
+    Span::call_site(),
+  )
+}
diff --git a/yaserde_derive/src/ser/expand_struct.rs b/yaserde_derive/src/ser/expand_struct.rs
index 4751439..d80f337 100644
--- a/yaserde_derive/src/ser/expand_struct.rs
+++ b/yaserde_derive/src/ser/expand_struct.rs
@@ -24,16 +24,9 @@ pub fn serialize(
         return None;
       }
 
-      let renamed_label = match field_attrs.rename {
-        Some(value) => Ident::new(&value, Span::call_site()),
-        None => field.ident.clone().unwrap(),
-      };
       let label = &field.ident;
-      let label_name = if let Some(prefix) = field_attrs.prefix {
-        prefix + ":" + renamed_label.to_string().as_ref()
-      } else {
-        renamed_label.to_string()
-      };
+
+      let label_name = build_label_name(&field, &field_attrs);
 
       match get_field_type(field) {
         Some(FieldType::FieldTypeString)
@@ -270,16 +263,7 @@ pub fn serialize(
         ));
       }
 
-      let renamed_label = match field_attrs.rename {
-        Some(value) => Ident::new(&value, Span::call_site()),
-        None => field.ident.clone().unwrap(),
-      };
-
-      let label_name = if let Some(prefix) = field_attrs.prefix {
-        format!("{}:{}", prefix, renamed_label)
-      } else {
-        renamed_label.to_string()
-      };
+      let label_name = build_label_name(&field, &field_attrs);
 
       match get_field_type(field) {
         Some(FieldType::FieldTypeString)
@@ -473,3 +457,17 @@ pub fn serialize(
     }
   }
 }
+
+fn build_label_name(field: &syn::Field, field_attrs: &YaSerdeAttribute) -> String {
+  format!(
+    "{}{}",
+    field_attrs
+      .prefix
+      .clone()
+      .map_or("".to_string(), |prefix| prefix + ":"),
+    field_attrs
+      .rename
+      .clone()
+      .unwrap_or_else(|| field.ident.as_ref().unwrap().to_string())
+  )
+}