diff --git spaces_panels/plugins/access_spaces_feature.inc spaces_panels/plugins/access_spaces_feature.inc
new file mode 100644
index 0000000..206d575
--- /dev/null
+++ spaces_panels/plugins/access_spaces_feature.inc
@@ -0,0 +1,54 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Plugin to provide access control/visibility based on a spaces feature being
+ * enabled.
+ */
+
+$plugin = array(
+  'title' => t("Spaces: Feature Access"),
+  'description' => t('Control access by whether or not a feature is enabled in this space.'),
+  'callback' => 'spaces_feature_access_check',
+  'settings form' => 'spaces_feature_access_settings',
+  'summary' => 'spaces_feature_access_summary',
+  'defaults' => array('feature' => 0),
+);
+
+/**
+ * Settings form
+ */
+function spaces_feature_access_settings(&$form, &$form_state, $conf) {
+  // Generate feature options.
+  $options = array(0 => t('Autodetect'));
+  foreach (spaces_features() as $feature) {
+    $options[$feature->name] = check_plain($feature->info['name']);
+  }
+  
+  $form['settings']['feature'] = array(
+    '#type' => 'select',
+    '#title' => t('Feature'),
+    '#description' => t("Only allow access to this view if the user has access to the selected feature."),
+    '#options' => $options,
+    '#default_value' => $conf['feature'],
+  );
+}
+
+/**
+ * Check for access.  Thank you spaces_access_feature().
+ */
+function spaces_feature_access_check($conf, $context) {
+  if ($conf['feature']){
+    return spaces_access_feature('view', $conf['feature']);
+  }
+}
+
+/**
+ * Provide a summary description based upon the specified context
+ */
+function spaces_feature_access_summary($conf, $context) {
+  if (!empty($conf['feature'])) {
+    return t('current user has access to the "@identifier" feature.', array('@identifier' => $conf['feature']));
+  }
+}
diff --git spaces_panels/plugins/context_spaces_og.inc spaces_panels/plugins/context_spaces_og.inc
new file mode 100644
index 0000000..44786a7
--- /dev/null
+++ spaces_panels/plugins/context_spaces_og.inc
@@ -0,0 +1,89 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ *
+ * Plugin to provide a node context from the current group space.
+ */
+
+/**
+ * 
+ */
+$plugin = array(
+  'title' => t("Spaces: OG Node context"),
+  'description' => t('A node object derived from the current Group Space.'),
+  'context' => 'spaces_context_og_create',
+  'keyword' => 'space_og',
+  'context name' => 'space_og',
+  'convert list' => 'spaces_context_og_convert_list',
+  'convert' => 'spaces_context_og_convert',
+);
+
+/**
+ * It's important to remember that $conf is optional here, because contexts
+ * are not always created from the UI.
+ */
+function spaces_context_og_create($empty, $data = NULL, $conf = FALSE) {
+  $context = new ctools_context('node');
+  $context->plugin = 'node';
+ 
+  $space = spaces_get_space();
+  if ($empty || empty($space) || $space->type != 'og') {
+    return $context;
+  }
+  
+  $data = $space->group;
+
+  if (!empty($data)) {
+    $context->data     = $data;
+    $context->title    = $data->title;
+    $context->argument = $data->nid;
+
+    $context->restrictions['type'] = array($data->type);
+    return $context;
+  }
+}
+
+/**
+ * Provide a list of ways that this context can be converted to a string.
+ */
+function spaces_context_og_convert_list() {
+  $list = array(
+    'nid' => t('Node ID'),
+    'vid' => t('Node revision ID'),
+    'title' => t('Node title'),
+    'uid' => t('Author UID'),
+    'type' => t('Node type'),
+  );
+
+  if (module_exists('token')) {
+    $list += reset(token_get_list(array('node')));
+  }
+
+  return $list;
+}
+
+/**
+ * Convert a context into a string.
+ */
+function spaces_context_og_convert($context, $type) {
+  switch ($type) {
+    case 'nid':
+      return $context->data->nid;
+    case 'vid':
+      return $context->data->vid;
+    case 'title':
+      return $context->data->title;
+    case 'uid':
+      return $context->data->uid;
+    case 'type':
+      return $context->data->type;
+  }
+  if (module_exists('token')) {
+    $values = token_get_values('node', $context->data);
+    if ($key = array_search($type, $values->tokens)) {
+      return $values->values[$key];
+    }
+  }
+}
diff --git spaces_panels/plugins/context_spaces_user.inc spaces_panels/plugins/context_spaces_user.inc
new file mode 100644
index 0000000..bcfca71
--- /dev/null
+++ spaces_panels/plugins/context_spaces_user.inc
@@ -0,0 +1,84 @@
+<?php
+// $Id: user.inc,v 1.4.2.5 2010/07/16 20:09:48 merlinofchaos Exp $
+
+/**
+ * @file
+ *
+ * Plugin to provide a user context
+ */
+
+/**
+ * Plugins are described by creating a $plugin array which will be used
+ * by the system that includes this file.
+ */
+$plugin = array(
+  'title' => t("Spaces: User Context"),
+  'description' => t('A single user object, derived from the current Space.'),
+  'context' => 'spaces_context_user_create',
+  /*
+  'settings form' => 'ctools_context_user_settings_form',
+  'settings form validate' => 'ctools_context_user_settings_form_validate',
+  'settings form submit' => 'ctools_context_user_settings_form_submit',
+  'defaults' => array('type' => 'select', 'uid' => ''),
+  */
+  'keyword' => 'space_user',
+  'context name' => 'space_user',
+  'convert list' => 'spaces_context_user_convert_list',
+  'convert' => 'spaces_context_user_convert',
+  'convert default' => 'name',
+);
+
+/**
+ * It's important to remember that $conf is optional here, because contexts
+ * are not always created from the UI.
+ */
+function spaces_context_user_create($empty, $data = NULL, $conf = FALSE) {
+ $context = new ctools_context('user');
+  $context->plugin = 'user';
+
+  $space = spaces_get_space();
+  if ($empty || empty($space) || $space->type != 'user') {
+    return $context;
+  }
+  
+  $data = $space->user;
+
+  if (!empty($data)) {
+    $context->data     = $data;
+    $context->title    = isset($data->name) ? $data->name : t('Anonymous');
+    $context->argument = $data->uid;
+    return $context;
+  }
+}
+
+/**
+ * Provide a list of replacements.
+ */
+function spaces_context_user_convert_list() {
+  $list = array(
+    'uid' => t('User ID'),
+    'name' => t('User name'),
+  );
+  if (module_exists('token')) {
+    $list += reset(token_get_list(array('user')));
+  }
+  return $list;
+}
+
+/**
+ * Convert a context into a string.
+ */
+function spaces_context_user_convert($context, $type) {
+  switch ($type) {
+    case 'uid':
+      return $context->data->uid;
+    case 'name':
+      return $context->data->name;
+  }
+  if (module_exists('token')) {
+    $values = token_get_values('user', $context->data);
+    if ($key = array_search($type, $values->tokens)) {
+      return $values->values[$key];
+    }
+  }
+}
diff --git spaces_panels/spaces_panels.info spaces_panels/spaces_panels.info
new file mode 100644
index 0000000..279f302
--- /dev/null
+++ spaces_panels/spaces_panels.info
@@ -0,0 +1,7 @@
+; $Id$
+name = "Spaces Panels"
+description = "Provides integration between Spaces and Panels."
+package = "Spaces"
+core = "6.x"
+dependencies[] = spaces
+dependencies[] = panels
diff --git spaces_panels/spaces_panels.module spaces_panels/spaces_panels.module
new file mode 100644
index 0000000..6ee22cb
--- /dev/null
+++ spaces_panels/spaces_panels.module
@@ -0,0 +1,21 @@
+<?php
+// $Id$
+
+/**
+ * Implementation of hook_ctools_plugin_api().
+ */
+function spaces_panels_ctools_plugin_api($module, $api) {
+  if ($module == 'spaces' && $api == 'plugins') {
+    return array('version' => 3);
+  }
+}
+
+/**
+ * Implementation of hook_ctools_plugin_directory().
+ */
+function spaces_panels_ctools_plugin_directory($module, $plugin) {
+  if ($module = 'ctools') {
+    return 'plugins';
+  }
+}
+
