    - Parameter map: A JSON dictionary
   */
   public init(_ map: JSONDictionary) {
-    title    <- map.property("title")
-    subtitle <- map.property("subtitle")
-    image    <- map.property("image")
-    kind     <- map.property("type") ?? map.property("kind")
-    action   <- map.property("action")
-    meta     <- map.property("meta")
-
-    if let relation = map["relations"] as? [String : [ViewModel]] {
+    index    <- map.property(.Index)
+    title    <- map.property(.Title)
+    subtitle <- map.property(.Subtitle)
+    image    <- map.property(.Image)
+    kind     <- map.property(.Type) ?? map.property(.Kind)
+    action   <- map.property(.Action) ?? nil
+    meta     <- map.property(.Meta)
+
+    if let relation = map[.Relations] as? [String : [ViewModel]] {
       relations = relation
     }
 
-    if let relations = map["relations"] as? [String : [JSONDictionary]] {
+    if let relations = map[.Relations] as? [String : [JSONDictionary]] {
       var newRelations = [String : [ViewModel]]()
       relations.forEach { key, array in
         if newRelations[key] == nil { newRelations[key] = [ViewModel]() }

 A value type struct, it conforms to the Mappable protocol so that it can be instantiated with JSON
*/
public struct ViewModel: Mappable {
  /// The index of the ViewModel when appearing in a list, should be computed and continuously updated by the data source
  public var index = 0
  /// The main representation of the ViewModel

  /// A key-value dictionary for related view models
  public var relations = [String : [ViewModel]]()

  public var dictionary: JSONDictionary {
    return [
      Key.Index.string : index,
      Key.Title.string : title,
      Key.Subtitle.string : subtitle,
      Key.Image.string : image,
      Key.Kind.string : kind,
      //Key.Action.string : action
    ]
  }

  // MARK: - Initialization

  /**
