Ajax callback does not replace the form but add a new field
You have to setup a wrapper on the field you want to update :

$form['responsible']['zipcode'] = array(
      '#type'               =&gt; 'textfield',
      '#title'              =&gt; t('Zipcode'),
      '#default_value'      =&gt; empty($account-&gt;Dossier-&gt;responsable-&gt;adresse-&gt;codePostal) 
                                    ? Null 
                                    : $account-&gt;Dossier-&gt;responsable-&gt;adresse-&gt;codePostal,
      '#required'           =&gt; True,
      '#maxlength'          =&gt; 5,
      '#ajax' =&gt; array(
        'callback' =&gt; 'ajax_get_cities_callback',
        'wrapper' =&gt; 'div_city_wrapper', // Changed here
        'method' =&gt; 'replace',
      ),
    );

    $form['responsible']['city'] = array(
      '#type'               =&gt; 'select',
      '#title'              =&gt; t('City'),
      '#options'            =&gt; array(),
      '#required'           =&gt; True,
      '#prefix'           =&gt; '&lt;div id="div_city_wrapper"&gt;', // Added this
      '#suffix'           =&gt; '&lt;/div&gt;', // Added this
    );


The callback function seems to be fine as it returns the wrapped form element ($form['responsible']['city'])