diff --git a/includes/media.browser.inc b/includes/media.browser.inc
index 811df7b..a97c14a 100644
--- a/includes/media.browser.inc
+++ b/includes/media.browser.inc
@@ -194,7 +194,7 @@ function media_media_browser_plugin_info() {
     '#weight' => 10,
   );
 
-  if (user_access('administer media') || user_access('edit media')) {
+  if (user_access('administer media') || user_access('upload media')) {
     $plugins['upload'] = array(
       '#weight' => -10,
      );
@@ -203,7 +203,7 @@ function media_media_browser_plugin_info() {
 }
 
 /**
- * Implementaion of hook_media_browser_plugin_view().
+ * Implementation of hook_media_browser_plugin_view().
  */
 function media_media_browser_plugin_view($plugin_name, $params) {
   $path = drupal_get_path('module', 'media');
@@ -240,27 +240,29 @@ function media_media_browser_plugin_view($plugin_name, $params) {
       );
       break;
     case 'library':
-      return array(
-        '#title' => t('Library'),
-        '#attached' => array(
-          'js' => array(
-            $path . '/js/plugins/media.library.js',
-          ),
-          'css' => array(
-            //@todo: should move this.
-            $path . '/js/plugins/media.library.css',
-          ),
-        ),
-        '#settings' => array(
-          'viewMode' => 'thumbnails',
-          'getMediaUrl' => url('media/browser/list'),
-          'types' => $types,
-          'multiselect' => $multiselect,
-        // We should probably change this to load dynamically when requested
-        // via the JS file.
-        ),
-        '#markup' => '<div id="container"><div id="scrollbox"><ul id="media-browser-library-list" class="media-list-thumbnails"></ul><div id="status"></div></div></div>',
-      );
+			if (user_access('administer media') || user_access('view media browser library')) {
+      	return array(
+      	  '#title' => t('Library'),
+      	  '#attached' => array(
+      	    'js' => array(
+      	      $path . '/js/plugins/media.library.js',
+      	    ),
+      	    'css' => array(
+      	      //@todo: should move this.
+      	      $path . '/js/plugins/media.library.css',
+      	    ),
+      	  ),
+      	  '#settings' => array(
+      	    'viewMode' => 'thumbnails',
+      	    'getMediaUrl' => url('media/browser/list'),
+      	    'types' => $types,
+      	    'multiselect' => $multiselect,
+      	  // We should probably change this to load dynamically when requested
+      	  // via the JS file.
+      	  ),
+      	  '#markup' => '<div id="container"><div id="scrollbox"><ul id="media-browser-library-list" class="media-list-thumbnails"></ul><div id="status"></div></div></div>',
+				);
+			}
     break;
   }
 
diff --git a/media.module b/media.module
index b6caf7e..46ca62f 100644
--- a/media.module
+++ b/media.module
@@ -207,7 +207,7 @@ function media_menu() {
     'page callback' => 'media_page_edit',
     'page arguments'  => array(1),
     'access callback' => 'media_access',
-    'access arguments' => array('edit'),
+    'access arguments' => array('edit', 1),
     'weight' => 0,
     'type' => MENU_LOCAL_TASK,
     'context' => MENU_CONTEXT_PAGE | MENU_CONTEXT_INLINE,
@@ -285,10 +285,22 @@ function media_permission() {
       'title' => t('View media'),
       'description' => t('View all media files.'), // @TODO better description
     ),
+    'view media browser library' => array(
+      'title' => t('View media browser library'),
+      'description' => t('View media browser library.'),
+    ),
+    'upload media' => array(
+      'title' => t('Upload media'),
+      'description' => t('Upload media files.'),
+    ),
     'edit media' => array(
       'title' => t('Edit media'),
       'description' => t('Edit all media files.'), // @TODO better description
     ),
+    'edit own media' => array(
+      'title' => t('Edit own media'),
+      'description' => t('Edit own media files.'),
+    ),
   );
 }
 
@@ -551,8 +563,17 @@ function media_multi_load($fids) {
 /**
  * Access callback for media assets.
  */
-function media_access($op) {
-  return (user_access('administer media') || user_access($op . ' media'));
+function media_access($op, $media = NULL) {
+  global $user;
+
+  if (user_access('administer media') || user_access($op . ' media')) {
+    return TRUE;
+  }
+  elseif ($media && $user->uid == $media->uid && user_access($op . ' own media')) {
+    return TRUE;
+  }
+
+  return FALSE;
 }
 
 /**
