diff --git a/lib/Drupal/profile2/ProfileFormController.php b/lib/Drupal/profile2/ProfileFormController.php
new file mode 100644
index 0000000..5296167
--- /dev/null
+++ b/lib/Drupal/profile2/ProfileFormController.php
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\profile2\ProfileFormController.
+ */
+
+namespace Drupal\profile2;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityFormController;
+
+/**
+ * Form controller for profile forms.
+ */
+class ProfileFormController extends EntityFormController {
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityFormController::actionsElement().
+   */
+  protected function actionsElement(array $form, array &$form_state) {
+    $element = parent::actionsElement($form, $form_state);
+
+    if (!user_access('administer profiles')) {
+      unset($element['delete']);
+    }
+
+    return $element;
+  }
+}
diff --git a/lib/Drupal/profile2/ProfileType.php b/lib/Drupal/profile2/ProfileType.php
index a95b11d..c458069 100644
--- a/lib/Drupal/profile2/ProfileType.php
+++ b/lib/Drupal/profile2/ProfileType.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\profile2;
 
-use Drupal\config\ConfigEntityBase;
+use Drupal\Core\Config\Entity\ConfigEntityBase;
 
 /**
  * Use a separate class for profile types so we can specify some defaults
diff --git a/lib/Drupal/profile2/ProfileTypeFormController.php b/lib/Drupal/profile2/ProfileTypeFormController.php
new file mode 100644
index 0000000..0a561d6
--- /dev/null
+++ b/lib/Drupal/profile2/ProfileTypeFormController.php
@@ -0,0 +1,76 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\profile2\ProfileTypeFormController.
+ */
+
+namespace Drupal\profile2;
+
+use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\EntityFormController;
+
+/**
+ * Form controller for profile type forms.
+ */
+class ProfileTypeFormController extends EntityFormController {
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityFormController::form().
+   */
+  function form(array $form, array &$form_state, EntityInterface $profile_type) {
+    $form['label'] = array(
+      '#title' => t('Label'),
+      '#type' => 'textfield',
+      '#default_value' => $profile_type->label(),
+      '#description' => t('The human-readable name of this profile type.'),
+      '#required' => TRUE,
+      '#size' => 30,
+    );
+
+    $form['id'] = array(
+      '#type' => 'machine_name',
+      '#default_value' => $profile_type->id(),
+      '#maxlength' => 32,
+      '#machine_name' => array(
+        'exists' => 'profile2_type_load',
+        'source' => array('label'),
+      ),
+    );
+
+    $form['registration'] = array(
+      '#type' => 'checkbox',
+      '#title' => t('Show during user account registration.'),
+      '#default_value' => $profile_type->get('registration'),
+    );
+
+    return $form;
+  }
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityFormController::save().
+   */
+  public function save(array $form, array &$form_state) {
+    $profile_type = $this->getEntity($form_state);
+    $profile_type->save();
+
+    drupal_set_message(t('%label configuration has been saved.', array('%label' => $profile_type->label())));
+
+    $form_state['redirect'] = 'admin/structure/profiles';
+
+    // Rebuild the menu tree.
+    menu_router_rebuild();
+  }
+
+  /**
+   * Overrides Drupal\Core\Entity\EntityFormController::delete().
+   */
+  public function delete(array $form, array &$form_state) {
+    $profile_type = $this->getEntity($form_state);
+
+    $form_state['redirect'] = 'admin/structure/profiles/manage/' . $profile_type->id() . '/delete';
+
+    // Rebuild the menu tree.
+    menu_router_rebuild();
+  }
+}
diff --git a/profile2.admin.inc b/profile2.admin.inc
index df11353..bd5aaaa 100644
--- a/profile2.admin.inc
+++ b/profile2.admin.inc
@@ -8,79 +8,11 @@
 use Drupal\profile2\ProfileType;
 
 /**
- * Generates the profile type editing form.
+ * Page callback: Renders the form for adding profile types.
  */
-function profile2_type_form($form, &$form_state, ProfileType $profile_type = NULL, $op = 'edit') {
-  // During initial form build, add the entity to the form state for use
-  // during form building and processing. During a rebuild, use what is in the
-  // form state.
-  if (!isset($form_state['profile2_type'])) {
-    if (!isset($profile_type)) {
-      $profile_type = entity_create('profile2_type', array());
-    }
-    $form_state['profile2_type'] = $profile_type;
-  }
-  else {
-    $profile_type = $form_state['profile2_type'];
-  }
-
-  $form['label'] = array(
-    '#title' => t('Label'),
-    '#type' => 'textfield',
-    '#default_value' => $profile_type->label(),
-    '#description' => t('The human-readable name of this profile type.'),
-    '#required' => TRUE,
-    '#size' => 30,
-  );
-  $form['id'] = array(
-    '#type' => 'machine_name',
-    '#default_value' => $profile_type->id(),
-    '#maxlength' => 32,
-    '#machine_name' => array(
-      'exists' => 'profile2_type_load',
-      'source' => array('label'),
-    ),
-  );
-
-  $form['registration'] = array(
-    '#type' => 'checkbox',
-    '#title' => t('Show during user account registration.'),
-    '#default_value' => $profile_type->get('registration'),
-  );
-
-  $form['actions'] = array('#type' => 'actions');
-  $form['actions']['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Save profile type'),
-    '#weight' => 40,
-  );
-
-  if ($profile_type->id()) {
-    $form['actions']['delete'] = array(
-      '#type' => 'submit',
-      '#value' => t('Delete profile type'),
-      '#weight' => 45,
-      '#limit_validation_errors' => array(),
-      '#submit' => array('profile2_type_form_submit_delete')
-    );
-  }
-  return $form;
-}
-
-/**
- * Form API submit callback for the type form.
- */
-function profile2_type_form_submit(&$form, &$form_state) {
-  form_state_values_clean($form_state);
-
-  $profile_type = $form_state['profile2_type'];
-  entity_form_submit_build_entity('profile2_type', $profile_type, $form, $form_state);
-
-  $profile_type->save();
-
-  drupal_set_message(t('%label configuration has been saved.', array('%label' => $profile_type->label())));
-
-  $form_state['redirect'] = 'admin/structure/profiles';
+function profile2_type_add() {
+  $profile_type = entity_create('profile2_type', array());
+  return entity_get_form($profile_type);
 }
 
 /**
@@ -107,11 +39,4 @@ function profile2_type_delete_form($form, &$form_state, ProfileType $profile_typ
 function profile2_type_delete_form_submit($form, &$form_state) {
   $form_state['profile2_type']->delete();
   $form_state['redirect'] = 'admin/structure/profiles';
-}
-
-/**
- * Form API submit callback for the delete button.
- */
-function profile2_type_form_submit_delete(&$form, &$form_state) {
-  $form_state['redirect'] = 'admin/structure/profiles/manage/' . $form_state['profile2_type']->id() . '/delete';
-}
+}
\ No newline at end of file
diff --git a/profile2.module b/profile2.module
index fa7bba2..8ad2e8e 100644
--- a/profile2.module
+++ b/profile2.module
@@ -20,6 +20,9 @@ function profile2_entity_info() {
       'base table' => 'profile',
       'uri callback' => 'profile2_profile_uri',
       'fieldable' => TRUE,
+      'form controller class' => array(
+        'default' => 'Drupal\profile2\ProfileFormController',
+      ),
       'view modes' => array(
         'account' => array(
           'label' => t('User account'),
@@ -64,7 +67,10 @@ function profile2_entity_info() {
   $return['profile2_type'] = array(
     'label' => t('Profile type'),
     'entity class' => 'Drupal\profile2\ProfileType',
-    'controller class' => 'Drupal\config\ConfigStorageController',
+    'controller class' => 'Drupal\Core\Config\Entity\ConfigStorageController',
+    'form controller class' => array(
+      'default' => 'Drupal\profile2\ProfileTypeFormController',
+    ),
     'config prefix' => 'profile2.type',
     'entity keys' => array(
       'id' => 'id',
@@ -106,18 +112,16 @@ function profile2_menu() {
   );
   $items['admin/structure/profiles/add'] = array(
     'title' => 'Add profile type',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('profile2_type_form'),
+    'page callback' => 'profile2_type_add',
     'access arguments' => array('administer profile types'),
     'type' => MENU_LOCAL_ACTION,
     'file' => 'profile2.admin.inc',
   );
   $items['admin/structure/profiles/manage/%profile2_type'] = array(
     'title' => 'Edit profile type',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('profile2_type_form', 4),
+    'page callback' => 'entity_get_form',
+    'page arguments' => array(4),
     'access arguments' => array('administer profile types'),
-    'file' => 'profile2.admin.inc',
   );
   $items['admin/structure/profiles/manage/%profile2_type/edit'] = array(
     'title' => 'Edit',
@@ -133,14 +137,26 @@ function profile2_menu() {
     'context' => MENU_CONTEXT_INLINE,
     'file' => 'profile2.admin.inc',
   );
-  $items['user/%user/edit/%profile2_type'] = array(
-    'title' => 'test',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('profile2_user_form', 1, 3),
-    'access callback' => 'profile2_profile_edit_access',
-    'access arguments' => array(3, 1),
+
+  $items["user/%user/edit/account"] = array(
+    'title' => 'Account',
+    'type' => MENU_DEFAULT_LOCAL_TASK,
   );
 
+  foreach (profile2_get_types() as $id => $profile_type) {
+    $key = strtr($id, '_', '-');
+    $label = $profile_type->label();
+
+    $items["user/%user/edit/profile/$key"] = array(
+      'title' => $label,
+      'page callback' => 'profile2_profile_edit',
+      'page arguments' => array(1, $id),
+      'access callback' => 'profile2_profile_edit_access',
+      'access arguments' => array(1, $id),
+      'type' => MENU_LOCAL_TASK,
+    );
+  }
+
   return $items;
 }
 
@@ -440,6 +456,8 @@ function profile2_user_view($account, $view_mode, $langcode) {
 
 /**
  * Implements hook_form_FORM_ID_alter() for the registration form.
+ *
+ * @todo Let's try to find a better solution for this and everything related.
  */
 function profile2_form_user_register_form_alter(&$form, &$form_state) {
   foreach (profile2_get_types() as $type_name => $profile_type) {
@@ -448,6 +466,7 @@ function profile2_form_user_register_form_alter(&$form, &$form_state) {
         $form_state['profiles'][$type_name] = profile2_create(array('type' => $type_name));
       }
       profile2_attach_form($form, $form_state);
+
       // Wrap each profile form in a fieldset.
       $form['profile_' . $type_name] += array(
         '#type' => 'fieldset',
@@ -455,6 +474,7 @@ function profile2_form_user_register_form_alter(&$form, &$form_state) {
       );
     }
   }
+
   $form['#validate'][] = 'profile2_user_form_validate';
   $form['actions']['submit']['#submit'][] = 'profile2_user_form_submit';
 }
@@ -465,20 +485,12 @@ function profile2_form_user_register_form_alter(&$form, &$form_state) {
  * @see profile2_user_form_validate()
  * @see profile2_user_form_submit()
  */
-function profile2_user_form($form, &$form_state, User $user, ProfileType $profile_type) {
-  $profile = profile2_load_by_user($user, $profile_type->id());
+function profile2_profile_edit(User $user, $profile_type) {
+  $profile = profile2_load_by_user($user, $profile_type);
   if (empty($profile)) {
-    $profile = profile2_create(array('type' => $profile_type->id(), 'uid' => $user->uid));
+    $profile = profile2_create(array('type' => $profile_type, 'uid' => $user->uid));
   }
-  $form_state['profiles'][$profile->type] = $profile;
-  profile2_attach_form($form, $form_state);
-
-  $form['actions'] = array('#type' => 'actions');
-  $form['actions']['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Save'),
-  );
-  return $form;
+  return entity_get_form($profile);
 }
 
 /**
@@ -651,10 +663,13 @@ function profile2_profile2_access($op, Profile $profile = NULL, User $account =
  *
  * @see profile2_access()
  */
-function profile2_profile_edit_access(ProfileType $type, User $account) {
-  $profile = profile2_load_by_user($account, $type->id());
+function profile2_profile_edit_access(User $account, $profile_type) {
+  if (!profile2_type_load($profile_type)) {
+    return FALSE;
+  }
+  $profile = profile2_load_by_user($account, $profile_type);
   if (empty($profile)) {
-    $profile = entity_create('profile2', array('uid' => $account->uid, 'type' => $type->id()));
+    $profile = entity_create('profile2', array('uid' => $account->uid, 'type' => $profile_type));
   }
   return profile2_access('edit', $profile);
 }
