diff --git a/modules/entity/entity.class.inc b/modules/entity/entity.class.inc
index ce34bb3..607110f 100644
--- a/modules/entity/entity.class.inc
+++ b/modules/entity/entity.class.inc
@@ -79,6 +79,15 @@ interface EntityInterface {
   public function label();
 
   /**
+   * Returns the language of the entity.
+   *
+   * @return
+   *   The language of the entity, or LANGUAGE_NONE if there is no language
+   *   defined.
+   */
+  public function language();
+
+  /**
    * Returns the uri elements of the entity.
    *
    * @return
@@ -93,8 +102,8 @@ interface EntityInterface {
    *
    * @param $property_name
    *   The name of the property to return; e.g., 'title'.
-   * @param $language
-   *   (optional) In case the property is translatable, the language object of
+   * @param $langcode
+   *   (optional) In case the property is translatable, the language code of
    *   the language that should be used for getting the property. If set to
    *   NULL, the default language is being used.
    * @todo
@@ -103,7 +112,7 @@ interface EntityInterface {
    * @return
    *   The property value, or NULL in case it is not defined.
    */
-  public function get($property_name, $language = NULL);
+  public function get($property_name, $langcode = NULL);
 
   /**
    * Sets the value of an entity property.
@@ -112,14 +121,14 @@ interface EntityInterface {
    *   The name of the property to set; e.g., 'title'.
    * @param $value
    *   The value to set, or NULL to unset the property.
-   * @param $language
-   *   (optional) In case the property is translatable, the language object of
+   * @param $langcode
+   *   (optional) In case the property is translatable, the language code of
    *   the language that should be used for getting the property. If set to
    *   NULL, the default language is being used.
    * @todo
    *   Which default language should be used.
    */
-  public function set($property_name, $value, $language = NULL);
+  public function set($property_name, $value, $langcode = NULL);
 
   /**
    * Saves an entity permanently.
@@ -200,6 +209,32 @@ class Entity implements EntityInterface {
     $this->bundleKey = isset($this->entityInfo['entity keys']['bundle']) ? $this->entityInfo['entity keys']['bundle'] : NULL;
   }
 
+  protected function propertyInfo($property_name) {
+    // @todo implement a proper property interface dealing with fields and
+    // properties in a unified way.
+    $fields = field_info_fields();
+    return isset($fields[$property_name]) ? $fields[$property_name] : FALSE;
+  }
+
+  protected function propertyMultilingual($property_name) {
+    // @todo implement a proper property interface dealing with fields and
+    // properties in a unified way.
+    $info = $this->propertyInfo($property_name);
+    return $info ? field_is_translatable($this->entity_type, $info) : NULL;
+  }
+
+  protected function propertyLanguage($property_name) {
+    // @todo remove the compatibility layer once we have language support for
+    // properties.
+    $multilingual = $this->propertyMultilingual($property_name);
+    if (!isset($multilingual)) {
+      return FALSE;
+    }
+    else {
+      return $multilingual ? $this->language() : LANGUAGE_NONE;
+    }
+  }
+
   public function id() {
     return isset($this->{$this->idKey}) ? $this->{$this->idKey} : NULL;
   }
@@ -224,6 +259,10 @@ class Entity implements EntityInterface {
     return NULL;
   }
 
+  public function language() {
+    return entity_language($this->entityType, $this);
+  }
+
   public function label() {
     return entity_label($this->entityType, $this);
   }
@@ -232,29 +271,31 @@ class Entity implements EntityInterface {
     return entity_uri($this->entityType, $this);
   }
 
-  /**
-   * @todo
-   *   Implement default handling of language.
-   */
-  public function get($property_name, $language = NULL) {
+  public function get($property_name, $langcode = NULL) {
     $value = isset($this->$property_name) ? $this->$property_name : NULL;
-    if (isset($language)) {
-      return isset($value[$language]) ? $value[$language] : NULL;
+    if (!isset($langcode)) {
+      $langcode = $this->propertyLanguage($property_name);
+    }
+    // Compatibility layer: if we have no language support just return the raw
+    // property value.
+    if (empty($langcode)) {
+      return $value;
     }
-    return $value;
+    return isset($value[$langcode]) ? $value[$langcode] : NULL;
   }
 
-  /**
-   * @todo
-   *   Implement default handling of language.
-   */
-  public function set($property_name, $value, $language = NULL) {
-    if (isset($language)) {
-      $this->$property_name[$language] = $value;
+  public function set($property_name, $value, $langcode = NULL) {
+    if (!isset($langcode)) {
+      $langcode = $this->propertyLanguage($property_name);
     }
-    else {
+    // Compatibility layer: if we have no language support just set the raw
+    // property value.
+    if (empty($langcode)) {
       $this->$property_name = $value;
     }
+    else {
+      $this->{$property_name}[$langcode] = $value;
+    }
   }
 
   public function save() {
diff --git a/modules/entity/entity.module b/modules/entity/entity.module
index 5c2aeef..363adf4 100644
--- a/modules/entity/entity.module
+++ b/modules/entity/entity.module
@@ -424,6 +424,35 @@ function entity_label($entity_type, $entity) {
 }
 
 /**
+* Returns the language of an entity.
+*
+* @param $entity_type
+*   The entity type; e.g., 'node' or 'user'.
+* @param $entity
+*   The entity for which to get the language.
+*
+* @return
+*   The entity language, or LANGUAGE_NONE if not found.
+*/
+function entity_language($entity_type, $entity) {
+  $info = entity_get_info($entity_type);
+
+  // Invoke the callback to get the language. If there is no callback, try
+  // to get it from a property of the entity, otherwise LANGUAGE_NONE.
+  if (isset($info['language callback']) && function_exists($info['language callback'])) {
+    $langcode = $info['language callback']($entity);
+  }
+  elseif (!empty($info['entity keys']['language']) && isset($entity->{$info['entity keys']['language']})) {
+    $langcode = $entity->{$info['entity keys']['language']};
+  }
+  else {
+    $langcode = LANGUAGE_NONE;
+  }
+
+  return $langcode;
+}
+
+/**
  * Helper function for attaching field API validation to entity forms.
  */
 function entity_form_field_validate($entity_type, $form, &$form_state) {
