diff --git a/sdk/jme3-core/src/com/jme3/gde/core/editor/SceneApplication.java b/sdk/jme3-core/src/com/jme3/gde/core/editor/SceneApplication.java
new file mode 100644
index 000000000..a38a1b8bc
--- /dev/null
+++ b/sdk/jme3-core/src/com/jme3/gde/core/editor/SceneApplication.java
@@ -0,0 +1,66 @@
+package com.jme3.gde.core.editor;
+
+import com.jme3.app.SimpleApplication;
+import com.jme3.app.StatsAppState;
+import com.jme3.gde.core.Installer;
+import com.jme3.renderer.ViewPort;
+import com.jme3.scene.Node;
+import com.jme3.system.AppSettings;
+import com.jme3.system.awt.AwtPanel;
+import com.jme3.system.awt.AwtPanelsContext;
+import com.jme3.system.awt.PaintMode;
+import java.util.concurrent.Callable;
+import org.openide.util.NbPreferences;
+
+/**
+ *
+ * @author normenhansen
+ */
+public class SceneApplication extends SimpleApplication {
+
+ private AwtPanel panel;
+ private ViewPort overlayView;
+
+ public SceneApplication() {
+ super(new StatsAppState());
+ AppSettings newSetting = new AppSettings(true);
+ newSetting.setFrameRate(30);
+ if ("true".equals(NbPreferences.forModule(Installer.class).get("use_opengl_1", "false"))) {
+ newSetting.setRenderer(AppSettings.LWJGL_OPENGL1);
+ }
+ newSetting.setCustomRenderer(AwtPanelsContext.class);
+ setSettings(newSetting);
+ setPauseOnLostFocus(false);
+ setShowSettings(false);
+ }
+
+ public AwtPanel getPanel() {
+ if (panel == null) {
+ panel = ((AwtPanelsContext) getContext()).createPanel(PaintMode.Accelerated);
+ ((AwtPanelsContext) getContext()).setInputSource(panel);
+ attachPanel();
+ }
+ return panel;
+ }
+
+ private void attachPanel() {
+ enqueue(new Callable() {
+ public Object call() throws Exception {
+ panel.attachTo(true, viewPort, /*overlayView, */guiViewPort);
+ return null;
+ }
+ });
+ }
+
+ @Override
+ public Node getRootNode() {
+ return super.getRootNode();
+ }
+
+ @Override
+ public void simpleInitApp() {
+ overlayView = getRenderManager().createMainView("Overlay", cam);
+ overlayView.setClearFlags(false, true, false);
+ }
+
+}
diff --git a/sdk/jme3-core/src/com/jme3/gde/core/editor/SceneEditorTopComponent.form b/sdk/jme3-core/src/com/jme3/gde/core/editor/SceneEditorTopComponent.form
new file mode 100644
index 000000000..1d73df479
--- /dev/null
+++ b/sdk/jme3-core/src/com/jme3/gde/core/editor/SceneEditorTopComponent.form
@@ -0,0 +1,25 @@
+
+
+
diff --git a/sdk/jme3-core/src/com/jme3/gde/core/editor/SceneEditorTopComponent.java b/sdk/jme3-core/src/com/jme3/gde/core/editor/SceneEditorTopComponent.java
new file mode 100644
index 000000000..8b6dc707a
--- /dev/null
+++ b/sdk/jme3-core/src/com/jme3/gde/core/editor/SceneEditorTopComponent.java
@@ -0,0 +1,131 @@
+package com.jme3.gde.core.editor;
+
+import java.io.IOException;
+import javax.swing.JPanel;
+import org.netbeans.api.settings.ConvertAsProperties;
+import org.openide.DialogDisplayer;
+import org.openide.NotifyDescriptor;
+import org.openide.awt.ActionID;
+import org.openide.awt.ActionReference;
+import org.openide.cookies.SaveCookie;
+import org.openide.loaders.DataObject;
+import org.openide.loaders.OpenSupport;
+import org.openide.nodes.Node;
+import org.openide.util.Exceptions;
+import org.openide.windows.TopComponent;
+import org.openide.util.NbBundle.Messages;
+import org.openide.windows.CloneableTopComponent;
+
+/**
+ * Top component which displays something.
+ */
+@ConvertAsProperties(
+ dtd = "-//com.jme3.gde.core.editor//SceneEditor//EN",
+autostore = false)
+@TopComponent.Description(
+ preferredID = "SceneEditorTopComponent",
+//iconBase="SET/PATH/TO/ICON/HERE",
+persistenceType = TopComponent.PERSISTENCE_ALWAYS)
+@TopComponent.Registration(mode = "editor", openAtStartup = false)
+@ActionID(category = "Window", id = "com.jme3.gde.core.editor.SceneEditorTopComponent")
+@ActionReference(path = "Menu/Window" /*, position = 333 */)
+@TopComponent.OpenActionRegistration(
+ displayName = "#CTL_SceneEditorAction",
+preferredID = "SceneEditorTopComponent")
+@Messages({
+ "CTL_SceneEditorAction=SceneEditor",
+ "CTL_SceneEditorTopComponent=SceneEditor Window",
+ "HINT_SceneEditorTopComponent=This is a SceneEditor window"
+})
+public final class SceneEditorTopComponent extends CloneableTopComponent {
+
+ DataObject obj;
+
+ public SceneEditorTopComponent() {
+ initComponents();
+ setToolTipText(Bundle.HINT_SceneEditorTopComponent());
+ }
+
+ public void setDataObject(DataObject scene) {
+ obj = scene;
+ if (scene == null) {
+ return;
+ }
+ setName(scene.getName());
+ setActivatedNodes(new Node[]{scene.getNodeDelegate()});
+ }
+
+ public JPanel getScenePanel() {
+ return scenePanel;
+ }
+
+ /**
+ * This method is called from within the constructor to initialize the form.
+ * WARNING: Do NOT modify this code. The content of this method is always
+ * regenerated by the Form Editor.
+ */
+ // //GEN-BEGIN:initComponents
+ private void initComponents() {
+
+ scenePanel = new javax.swing.JPanel();
+
+ setLayout(new javax.swing.BoxLayout(this, javax.swing.BoxLayout.PAGE_AXIS));
+
+ scenePanel.setLayout(new javax.swing.BoxLayout(scenePanel, javax.swing.BoxLayout.LINE_AXIS));
+ add(scenePanel);
+ }// //GEN-END:initComponents
+ // Variables declaration - do not modify//GEN-BEGIN:variables
+ private javax.swing.JPanel scenePanel;
+ // End of variables declaration//GEN-END:variables
+
+ @Override
+ public boolean canClose() {
+ if (obj != null && obj.isModified()) {
+ NotifyDescriptor.Confirmation mesg = new NotifyDescriptor.Confirmation("Scene has not been saved,\ndo you want to save it?",
+ "Not Saved",
+ NotifyDescriptor.YES_NO_CANCEL_OPTION);
+ DialogDisplayer.getDefault().notify(mesg);
+ if (mesg.getValue() == NotifyDescriptor.Confirmation.YES_OPTION) {
+ try {
+ obj.getCookie(SaveCookie.class).save();
+ } catch (IOException ex) {
+ Exceptions.printStackTrace(ex);
+ }
+ } else if (mesg.getValue() == NotifyDescriptor.Confirmation.CANCEL_OPTION) {
+ return false;
+ } else if (mesg.getValue() == NotifyDescriptor.Confirmation.NO_OPTION) {
+ obj.setModified(false);
+ return true;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public void componentOpened() {
+ // TODO add custom code on component opening
+ }
+
+ @Override
+ public void componentClosed() {
+ // TODO add custom code on component closing
+ if (obj != null) {
+ OpenSupport closer = obj.getLookup().lookup(OpenSupport.class);
+ if (closer != null) {
+ closer.close();
+ }
+ }
+ }
+
+ void writeProperties(java.util.Properties p) {
+ // better to version settings since initial version as advocated at
+ // http://wiki.apidesign.org/wiki/PropertyFiles
+ p.setProperty("version", "1.0");
+ // TODO store your settings
+ }
+
+ void readProperties(java.util.Properties p) {
+ String version = p.getProperty("version");
+ // TODO read your settings according to their version
+ }
+}
diff --git a/sdk/jme3-core/src/com/jme3/gde/core/editor/SpatialAssetOpenSupport.java b/sdk/jme3-core/src/com/jme3/gde/core/editor/SpatialAssetOpenSupport.java
new file mode 100644
index 000000000..039185be0
--- /dev/null
+++ b/sdk/jme3-core/src/com/jme3/gde/core/editor/SpatialAssetOpenSupport.java
@@ -0,0 +1,105 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.gde.core.editor;
+
+import com.jme3.gde.core.assets.AssetData;
+import com.jme3.gde.core.assets.SpatialAssetDataObject;
+import com.jme3.light.DirectionalLight;
+import com.jme3.scene.Spatial;
+import com.jme3.system.awt.AwtPanel;
+import java.util.concurrent.Callable;
+import org.openide.cookies.CloseCookie;
+import org.openide.cookies.OpenCookie;
+import org.openide.loaders.Environment;
+import org.openide.loaders.OpenSupport;
+import org.openide.windows.CloneableTopComponent;
+
+/**
+ *
+ * @author normenhansen
+ */
+public class SpatialAssetOpenSupport extends OpenSupport implements OpenCookie, CloseCookie {
+
+ SpatialAssetDataObject dataObject;
+ SceneApplication app;
+ SceneEditorTopComponent tc;
+
+ public SpatialAssetOpenSupport(SpatialAssetDataObject dataObject) {
+ super(dataObject.getPrimaryEntry());
+ this.dataObject = dataObject;
+ }
+
+ protected CloneableTopComponent createCloneableTopComponent() {
+ if (tc == null) {
+ tc = new SceneEditorTopComponent();
+ }
+ return tc;
+ }
+
+ @Override
+ public void open() {
+ super.open();
+ if (app == null) {
+ app = new SceneApplication();
+ tc.setDataObject(dataObject);
+// dataObject.setModified(true);
+// final ProgressHandle progressHandle = ProgressHandleFactory.createHandle("Opening Scene..");
+// progressHandle.start();
+ //runs new thread, needed?
+ System.out.println("Judge Thread: " + Thread.currentThread().getName());
+ Thread t = new Thread(new Runnable() {
+ public void run() {
+ app.start();
+ //enqueue to wait until started
+ app.enqueue(new Callable() {
+ public Void call() throws Exception {
+ //run on EDT
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ AwtPanel panel = app.getPanel();
+ tc.getScenePanel().add(panel);
+ tc.repaint();
+ }
+ });
+ Spatial spat = (Spatial) dataObject.getLookup().lookup(AssetData.class).loadAsset();
+ if (spat != null) {
+ app.getRootNode().attachChild(spat);
+ app.getRootNode().addLight(new DirectionalLight());
+ }
+ dataObject.getLookupContents().add(app);
+// progressHandle.finish();
+ return null;
+ }
+ });
+ }
+ });
+ t.start();
+ }
+ }
+
+ @Override
+ public boolean close() {
+ System.out.println("CLOSING");
+ boolean close = super.close();
+ if (close && app != null) {
+ app.stop();
+ java.awt.EventQueue.invokeLater(new Runnable() {
+ public void run() {
+ tc.getScenePanel().removeAll();
+ }
+ });
+ dataObject.getLookupContents().remove(app);
+ app = null;
+ }
+ return close;
+ }
+
+ @Override
+ protected boolean canClose() {
+ System.out.println("CANCLOSE");
+ return super.canClose();
+ }
+
+}
diff --git a/sdk/jme3-core/src/com/jme3/gde/core/navigator/DataScanner.java b/sdk/jme3-core/src/com/jme3/gde/core/navigator/DataScanner.java
new file mode 100644
index 000000000..647778efb
--- /dev/null
+++ b/sdk/jme3-core/src/com/jme3/gde/core/navigator/DataScanner.java
@@ -0,0 +1,18 @@
+package com.jme3.gde.core.navigator;
+
+import com.jme3.app.state.AbstractAppState;
+
+/**
+ *
+ * @author normenhansen
+ */
+
+
+public class DataScanner extends AbstractAppState{
+
+ @Override
+ public void update(float tpf) {
+ super.update(tpf);
+ }
+
+}
diff --git a/sdk/jme3-core/src/com/jme3/gde/core/navigator/NavigatorNode.java b/sdk/jme3-core/src/com/jme3/gde/core/navigator/NavigatorNode.java
new file mode 100644
index 000000000..d0a15f0a7
--- /dev/null
+++ b/sdk/jme3-core/src/com/jme3/gde/core/navigator/NavigatorNode.java
@@ -0,0 +1,32 @@
+ package com.jme3.gde.core.navigator;
+
+import java.io.IOException;
+import org.openide.loaders.DataObject;
+import org.openide.nodes.AbstractNode;
+import org.openide.nodes.Children;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author normenhansen
+ */
+
+
+public class NavigatorNode extends AbstractNode{
+
+ public static NavigatorNode createNode(DataObject obj){
+ return null;
+ }
+
+ public NavigatorNode(Children children, Lookup lookup) {
+ super(children, lookup);
+ }
+
+ @Override
+ public void destroy() throws IOException {
+ System.out.println("call destroy");
+ super.destroy();
+ }
+
+
+}
diff --git a/sdk/jme3-core/src/com/jme3/gde/core/navigator/NavigatorNodeChildren.java b/sdk/jme3-core/src/com/jme3/gde/core/navigator/NavigatorNodeChildren.java
new file mode 100644
index 000000000..e49698f00
--- /dev/null
+++ b/sdk/jme3-core/src/com/jme3/gde/core/navigator/NavigatorNodeChildren.java
@@ -0,0 +1,34 @@
+package com.jme3.gde.core.navigator;
+
+import com.jme3.gde.core.editor.SceneApplication;
+import java.util.List;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.openide.nodes.ChildFactory;
+import org.openide.nodes.Node;
+import org.openide.util.Lookup;
+
+/**
+ *
+ * @author normenhansen
+ */
+public class NavigatorNodeChildren extends ChildFactory