diff --git a/cmis_field/cmis_field.admin.inc b/cmis_field/cmis_field.admin.inc
new file mode 100644
index 0000000..cff66ef
--- /dev/null
+++ b/cmis_field/cmis_field.admin.inc
@@ -0,0 +1,121 @@
+<?php
+
+function cmis_field_admin_ajax_browse($widget_id, $path_id = '') {
+  module_load_include('api.inc', 'cmis');
+  module_load_include('utils.inc', 'cmis_browser');
+
+  $cssBrowserID = 'cmis-field-browse-form';
+  $content = '';
+  try {
+    $repository = cmis_get_repository();
+    $root = cmisapi_getObjectByPath($repository->repositoryId, "/");
+    $rootId = $root->properties['cmis:objectId'];
+
+    if ($path_id == "") {
+      $object = $root;
+    }
+    else {
+      $object = cmisapi_getObject($repository->repositoryId, base64_decode($path_id));
+    }
+
+    switch ($object->properties['cmis:baseTypeId']) {
+      case 'cmis:document':
+      $commands[] = ajax_command_invoke('#' . $cssBrowserID, 'dialog', array("close"));
+      $commands[] = ajax_command_invoke('#' . $widget_id . '-title', 'val', array($object->properties['cmis:name']));
+      $commands[] = ajax_command_invoke('#' . $widget_id . '-path', 'val', array($object->properties['cmis:objectId']));
+
+      break;
+      case 'cmis:folder':
+      $children = _cmis_field_content_get_folder($repository, $object, array_slice(explode('/', $_GET['q']), 5));
+
+      $content = array();
+
+      foreach ($children as $child) {
+        $childUrl =  _cmis_field_browse_url($child->id, $widget_id);
+        $content[] = array(
+          'browse-url' => $childUrl,
+          'title' => $child->properties['cmis:name'],
+          'type' => $child->properties['cmis:baseTypeId'],
+          'author' => $child->properties['cmis:createdBy'],
+          'updated' => new DateTime($child->properties['cmis:lastModificationDate']),
+          'size' => isset($child->properties['cmis:contentStreamLength']) ? $child->properties['cmis:contentStreamLength'] : '',
+          'mimetype' => isset($child->properties['cmis:contentStreamMimeType']) ? $child->properties['cmis:contentStreamMimeType'] : '',
+        );
+      }
+
+      $parents = _cmis_field_object_parents($object, $repository->repositoryId, $rootId, $widget_id);
+      $commands[] = ajax_command_remove('#' . $cssBrowserID);
+      $commands[] = ajax_command_append('html',
+        theme('cmis_field_browser', array(
+          'children' => $content,
+          'breadcrumbs' => $parents,
+          '#attributes' => array(
+            'id' => $cssBrowserID,
+          ),
+        ))
+      );
+
+      $title = $object->properties['cmis:name'];
+
+      if (empty($title)) {
+        $title = basename($object->properties['cmis:path']);
+      }
+
+      $commands[] = ajax_command_invoke('#' . $cssBrowserID, 'dialog', array(array('width' => 'auto', 'resizable' => "false", 'modal' => "true", 'title' => $title)));
+      // Fire attach behaviors for the dialog by doing a dummy insert.
+      $commands[] = ajax_command_append('html', '');
+      break;
+      default:
+      throw new CMISException(t('Unable to handle cmis object @object_id of type @object_type', array(
+        '@object_id' => $object->id,
+        '@object_type' => $object->type
+      )));
+    }
+  }
+  catch (CMISException $e) {
+    $commands[] = ajax_command_alert(t('Cmis Error, %error', array('%error' => $e->getMessage())));
+  }
+
+  $page = array();
+  $page['#type'] = 'ajax';
+  $page['#commands'] = $commands;
+  return $page;
+}
+
+function _cmis_field_browse_url($objectId, $widgetId) {
+  $id = base64_encode($objectId);
+  return 'admin/settings/cmis/field/ajax/' . $widgetId . '/' . $id;
+}
+
+function _cmis_field_object_parents($object, $repoId, $rootId, $widgetId, $parents = array()) {
+  module_load_include('api.inc', 'cmis');
+  $parent = cmisapi_getObject($repoId, $object->properties['cmis:parentId']);
+  if ($parent->properties['cmis:objectId'] == $rootId) {
+    return $parents;
+  }
+  else {
+    array_unshift($parents, array(
+      'title' => $parent->properties['cmis:name'],
+      'properties' => $parent->properties,
+      'url' => _cmis_field_browse_url($parent->properties['cmis:objectId'], $widgetId)
+    ));
+
+    return _cmis_field_object_parents($parent, $repoId, $rootId, $widgetId, $parents);
+  }
+}
+
+/**
+ * CMIS folder browser handler.
+ *
+ */
+function _cmis_field_content_get_folder($repository, $object) {
+  try {
+  $children = cmisapi_getChildren($repository->repositoryId, $object->id)->objectList;
+
+  }
+  catch (CMISException $e) {
+  cmis_error_handler('cmis_browser', $e);
+  return '';
+  }
+  return $children;
+}
diff --git a/cmis_field/cmis_field.module b/cmis_field/cmis_field.module
index 955a9b7..b65ff73 100644
--- a/cmis_field/cmis_field.module
+++ b/cmis_field/cmis_field.module
@@ -1,5 +1,54 @@
 <?php
 
+function cmis_field_menu() {
+
+  // Entry Level Browser (when clicking the Button beneath a CMIS-Field)
+  $items['admin/settings/cmis/field/ajax'] = array(
+    'title' => 'cmis browse',
+    'page callback' => 'cmis_field_admin_ajax_browse',
+    'page arguments' => array(),
+    'delivery callback' => 'ajax_deliver',
+    'access arguments' => array('access cmis'),
+    'file' => 'cmis_field.admin.inc',
+    'type' => MENU_CALLBACK,
+  );
+
+  // Successive calls to subfolders go here (notice the wildcard)
+  $items['admin/settings/cmis/field/ajax/%/%'] = array(
+    'title' => 'cmis browse',
+    'page callback' => 'cmis_field_admin_ajax_browse',
+    'page arguments' => array(5,6),
+    'delivery callback' => 'ajax_deliver',
+    'access arguments' => array('access cmis'),
+    'file' => 'cmis_field.admin.inc',
+    'type' => MENU_CALLBACK,
+  );
+
+
+  return $items;
+}
+
+/**
+ * Allow CMIS fields to be themed via Drupal Theming
+ *
+ * @implements hook_theme()
+ */
+function cmis_field_theme() {
+  $items['cmis_field_browser'] = array(
+    'file' => 'cmis_field.theme.inc',
+  );
+
+  $items['cmis_field_browse_children'] = array(
+    'file' => 'cmis_field.theme.inc',
+  );
+
+  $items['cmis_field_browse_breadcrumbs'] = array(
+    'file' => 'cmis_field.theme.inc',
+  );
+
+  return $items;
+}
+
 /**
  * Implementation of hook_field_info()
  *
@@ -63,10 +112,6 @@ function cmis_field_field_instance_settings_form($field, $instance) {
     '#default_value' => isset($settings['cmis_field_rootFolderPath']) ? $settings['cmis_field_rootFolderPath'] : '',
   );
 
-  $form['#attached']['js'] = array(
-    array('data' => drupal_get_path('module', 'cmis_field') . '/js/cmis_field.js'),
-  );
-
   return $form;
 }
 
@@ -96,6 +141,7 @@ function cmis_field_field_widget_info() {
  * @return array - form element
  */
 function cmis_field_field_widget_form(&$form, &$form_state, $field, $instance, $langcode, $items, $delta, $element) {
+  drupal_add_library('system', 'ui.dialog');
   $title = isset($items[$delta]['title']) ? $items[$delta]['title'] : '';
   $path = isset($items[$delta]['path']) ? $items[$delta]['path'] : '';
   $element += array(
@@ -104,24 +150,51 @@ function cmis_field_field_widget_form(&$form, &$form_state, $field, $instance, $
   $element['path'] = array();
   $element['title'] = array();
 
+  $widget_id = 'edit-cmis-field-' . preg_replace("/_/", "-", $instance['field_name']) . '-' . $delta;
+
   $element['title'] += array(
     '#type' => 'textfield',
     '#default_value' => $title,
-    '#attributes' => array('class' => array('edit-field-cmis-field')),
+    '#attributes' => array('class' => array('edit-field-cmis-field'), 'id' => $widget_id . '-title'),
     '#title_display' => 'before',
     '#title' => check_plain($instance['label']),
   );
 
   $element['path'] += array(
     '#type' => 'hidden',
-    '#attributes' => array('class' => array('edit-field-cmis-path', 'search-form')),
+    '#attributes' => array('class' => array('edit-field-cmis-path', 'search-form'), 'id' => $widget_id . '-path'),
     '#default_value' => $path,
   );
 
-  $element['#attached']['js'] = array(
-    array('data' => drupal_get_path('module', 'cmis_field') . '/js/cmis_field.js'),
-    array('data' => array('cmispath' => $instance['settings']['cmis_field_rootFolderPath']), 'type' => 'setting'),
+  $root_folder_path = $instance['settings']['cmis_field_rootFolderPath'];
+  $ajax_path = 'admin/settings/cmis/field/ajax/' . $widget_id . '/';
+
+  if ($root_folder_path != '') {
+    module_load_include('api.inc', 'cmis');
+    module_load_include('utils.inc', 'cmis_browser');
+
+    // Invoke CMIS service
+    $repository = cmis_get_repository();
+
+    $object = cmisapi_getObjectByPath($repository->repositoryId, $root_folder_path);
+    $ajax_path .= base64_encode($object->properties['cmis:objectId']);
+  }
+
+  $button = array(
+    '#type' => 'button',
+    '#value' => t('Browse CMIS repository'),
+    '#submit' => array(),
+    '#ajax' => array(
+      'path' => $ajax_path,
+    ),
+    '#limit_validation_errors' => array(),
   );
+
+  $element['browse'] = $button;
+  $element['#type'] = "markup";
+  $element['#theme_wrappers'] = array('container');
+  $element['#attributes'] = array('id' => $widget_id);
+
   return $element;
 }
 
diff --git a/cmis_field/cmis_field.theme.inc b/cmis_field/cmis_field.theme.inc
new file mode 100644
index 0000000..4a723ca
--- /dev/null
+++ b/cmis_field/cmis_field.theme.inc
@@ -0,0 +1,80 @@
+<?php
+
+function theme_cmis_field_browser($variables) {
+  $breadcrumbs = theme('cmis_field_browse_breadcrumbs', array('context' => $variables['breadcrumbs'], 'ajax' => TRUE));
+  $children = theme('cmis_field_browse_children', array('context' => $variables['children']));
+
+  return theme('container', array(
+    'element' => array(
+      '#attributes' => $variables['#attributes'],
+      '#children' => $breadcrumbs . $children,
+    ),
+  ));
+}
+
+function theme_cmis_field_browse_breadcrumbs($variables) {
+  $links = array();
+
+  foreach ($variables['context'] as $child) {
+    $links[] = l($child['title'], $child['url'], array(
+      'attributes' => array(
+        'class' => @$variables['ajax'] ? 'use-ajax' : ''
+        )
+      )
+    );
+  }
+
+  return theme('breadcrumb', array('breadcrumb' => $links));
+}
+
+/**
+ * Custom theme for cmis_browser_browse action
+ *
+ * @param $children
+ */
+
+function theme_cmis_field_browse_children($variables) {
+  $header = array(t('name'), t('type'), t('size'), t('author'), t('last modified'), '');
+  $rows = array();
+  $folder_img = theme('image', array('path' => drupal_get_path('module', 'cmis_browser') .'/images/space.gif'));
+  $document_img = theme('image', array('path' => drupal_get_path('module', 'cmis_browser') .'/images/file.png'));
+
+  foreach ($variables['context'] as $child) {
+    $author = $child['author'];
+    $updated = format_date($child['updated']->getTimestamp());
+    $actions = array();
+
+    switch ($child['type']) {
+      case 'cmis:folder':
+        $icon = $folder_img;
+
+        $link = l($child['title'], $child['browse-url'], array(
+          'attributes' => array(
+            'class' => array(
+              'use-ajax',
+            ),
+          ),)
+        );
+
+        $mimetype = 'Space';
+        $size = '';
+        break;
+      default:
+        $icon = $document_img;
+        $link = l($child['title'], $child['browse-url'], array(
+          'attributes' => array(
+            'class' => array(
+              'use-ajax',
+            ),
+          ),)
+        );
+
+        $mimetype = $child['mimetype'];
+        $size = format_size($child['size']);
+    }
+
+    $rows[] = array($icon .' '. $link, $mimetype, $size, $author, $updated, theme('item_list', array('items' => $actions, 'title' => NULL, 'type' => 'ul', 'attributes' => array('class'=>'actions'))));
+  }
+
+  return theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('class' => array('cmis_field_browse_children'))));
+}
\ No newline at end of file
diff --git a/cmis_field/js/cmis_field.js b/cmis_field/js/cmis_field.js
deleted file mode 100644
index 150104a..0000000
--- a/cmis_field/js/cmis_field.js
+++ /dev/null
@@ -1,56 +0,0 @@
-(function($){
-
-  Drupal.behaviors.cmisField = {
-    attach: function(context, settings) {
-      //TODO: This selector doesn't seem right - will it work if there's a different default lang.?
-      //$("#edit-field-cmis-und-0-title", context).after('<input type="button" id="edit-cmis-field" class="cmis-field-insert-button form-submit" value="Browse" />');
-      $(".edit-field-cmis-field", context).after('<input type="button" id="edit-cmis-field" class="cmis-field-insert-button form-submit" value="Browse" />');
-      $("#edit-instance-settings-cmis-field-rootfolderpath", context).after('<input type="button" id="edit-cmis-settings" class="cmis-field-insert-button form-submit" value="Browse" />');
-      $('.cmis-field-insert-button').click(function() {
-        var caller = '';
-        if ($(this).attr('id') == 'edit-cmis-settings') {
-          caller = 'settings';
-        }
-        else {
-          caller = 'widget';
-        }
-        var rootDir = Drupal.settings.cmispath;
-        //TODO: Make this a modal, not a popup (will be much harder to manage context when clicking around the cmis browser)
-        if (rootDir == true){
-	      rootDir === '';
-	      window.open('/cmis/browser?type=popup&caller=' + caller, 'cmisBrowser', 'width=800,height=500,resizable');
-        }else{
-          window.open('/cmis/browser' + rootDir + '?type=popup&caller=' + caller, 'cmisBrowser', 'width=800,height=500,resizable');
-        }
-        return false;
-      });
-      
-      $(".cmis-field-insert", context).click(function() {
-        if($.query['caller'] == 'settings') {
-          var cmispath = $(this).attr('href');
-          $('#edit-instance-settings-cmis-field-rootfolderpath', window.opener.document).val(cmispath.replace("//", "/"));
-        }
-        else {
-          var cmispath = $(this).attr('id');
-          var cmisname = $(this).attr('name');
-          //$('#edit-field-cmis-und-0-title', window.opener.document).val(cmisname);          
-          $('.edit-field-cmis-field', window.opener.document).val(cmisname);
-          $('.edit-field-cmis-path', window.opener.document).val(cmispath);
-        }
-        window.close();
-        return false;
-      });
-    }
-  };
-  
-  $.query = (function(a) {
-    if (a == "") return {};
-    var b = {};
-    for (var i = 0; i < a.length; ++i)
-    {
-        var p=a[i].split('=');
-        b[p[0]] = decodeURIComponent(p[1].replace(/\+/g, " "));
-    }
-    return b;
-})(window.location.search.substr(1).split('&'))
-})(jQuery);
\ No newline at end of file
