diff --git a/src/netbeans.c b/src/netbeans.c
index f1bae59..50882e0 100644
--- a/src/netbeans.c
+++ b/src/netbeans.c
@@ -24,6 +24,9 @@
 
 #if defined(FEAT_NETBEANS_INTG) || defined(PROTO)
 
+/* TODO: when should this not be defined? */
+#define INET_SOCKETS
+
 /* Note: when making changes here also adjust configure.in. */
 #ifdef WIN32
 # ifdef DEBUG
@@ -43,8 +46,13 @@
 # define sock_close(sd) closesocket(sd)
 # define sleep(t) Sleep(t*1000) /* WinAPI Sleep() accepts milliseconds */
 #else
-# include <netdb.h>
-# include <netinet/in.h>
+# ifdef INET_SOCKETS
+#  include <netdb.h>
+#  include <netinet/in.h>
+# else
+#  include <sys/un.h>
+# endif
+
 # include <sys/socket.h>
 # ifdef HAVE_LIBGEN_H
 #  include <libgen.h>
@@ -57,8 +65,6 @@
 
 #include "version.h"
 
-#define INET_SOCKETS
-
 #define GUARDED		10000 /* typenr for "guarded" annotation */
 #define GUARDEDOFFSET 1000000 /* base for "guarded" sign id's */
 #define MAX_COLOR_LENGTH 32 /* max length of color name in defineAnnoType */
@@ -75,7 +81,7 @@
 static void postpone_keycommand __ARGS((char_u *keystr));
 static void special_keys __ARGS((char_u *args));
 
-static void netbeans_connect __ARGS((void));
+static int netbeans_connect __ARGS((char *, int));
 static int getConnInfo __ARGS((char *file, char **host, char **port, char **password));
 
 static void nb_init_graphics __ARGS((void));
@@ -90,6 +96,7 @@
 static void nb_parse_cmd __ARGS((char_u *));
 static int  nb_do_cmd __ARGS((int, char_u *, int, int, char_u *));
 static void nb_send __ARGS((char *buf, char *fun));
+static void nb_free __ARGS((void));
 
 /* TRUE when netbeans is running with a GUI. */
 #ifdef FEAT_GUI
@@ -102,20 +109,20 @@
 typedef int NBSOCK;
 #endif
 
-static NBSOCK sd = -1;			/* socket fd for Netbeans connection */
+static NBSOCK nbsock = -1;		/* socket fd for Netbeans connection */
+#define NETBEANS_OPEN (nbsock != -1)
+
 #ifdef FEAT_GUI_MOTIF
-static XtInputId inputHandler;		/* Cookie for input */
+static XtInputId inputHandler = (XtInputId)NULL;  /* Cookie for input */
 #endif
 #ifdef FEAT_GUI_GTK
-static gint inputHandler;		/* Cookie for input */
+static gint inputHandler = 0;		/* Cookie for input */
 #endif
 #ifdef FEAT_GUI_W32
 static int  inputHandler = -1;		/* simply ret.value of WSAAsyncSelect() */
 extern HWND s_hwnd;			/* Gvim's Window handle */
 #endif
 static int r_cmdno;			/* current command number for reply */
-static int haveConnection = FALSE;	/* socket is connected and
-					   initialization is done */
 static int dosetvisible = FALSE;
 
 /*
@@ -125,10 +132,17 @@
 # include "nbdebug.c"
 #endif
 
-/* Connect back to Netbeans process */
+static int needupdate = 0;
+static int inAtomic = 0;
+
     static void
-netbeans_disconnect(void)
+netbeans_close(void)
 {
+    if (!NETBEANS_OPEN)
+	return;
+
+    netbeans_send_disconnect();
+
 #ifdef FEAT_GUI_MOTIF
     if (inputHandler != (XtInputId)NULL)
     {
@@ -146,26 +160,42 @@
 #  ifdef FEAT_GUI_W32
     if (inputHandler == 0)
     {
-	WSAAsyncSelect(sd, s_hwnd, 0, 0);
+	WSAAsyncSelect(nbsock, s_hwnd, 0, 0);
 	inputHandler = -1;
     }
 #  endif
 # endif
 #endif
 
-    sd = -1;
-    haveConnection = FALSE;
 #ifdef FEAT_BEVAL
     bevalServers &= ~BEVAL_NETBEANS;
 #endif
+
+    sock_close(nbsock);
+    nbsock = -1;
+
+    needupdate = 0;
+    inAtomic = 0;
+    nb_free();
+
+    /* remove all signs and update the screen after gutter removal */
+    coloncmd(":sign unplace *");
+    changed_window_setting();
+    update_screen(CLEAR);
+    setcursor();
+    out_flush();
+#ifdef FEAT_GUI
+    gui_update_cursor(TRUE, FALSE);
+    gui_mch_flush();
+#endif
 }
 
 #define NB_DEF_HOST "localhost"
 #define NB_DEF_ADDR "3219"
 #define NB_DEF_PASS "changeme"
 
-    static void
-netbeans_connect(void)
+    static int
+netbeans_connect(char *params, int abort)
 {
 #ifdef INET_SOCKETS
     struct sockaddr_in	server;
@@ -178,6 +208,7 @@
 #else
     struct sockaddr_un	server;
 #endif
+    int		sd;
     char	buf[32];
     char	*hostname = NULL;
     char	*address = NULL;
@@ -185,29 +216,29 @@
     char	*fname;
     char	*arg = NULL;
 
-    if (netbeansArg[3] == '=')
+    if (*params == '=')
     {
-	/* "-nb=fname": Read info from specified file. */
-	if (getConnInfo(netbeansArg + 4, &hostname, &address, &password)
+	/* "=fname": Read info from specified file. */
+	if (getConnInfo(params + 1, &hostname, &address, &password)
 								      == FAIL)
-	    return;
+	    return FAIL;
     }
     else
     {
-	if (netbeansArg[3] == ':')
-	    /* "-nb:<host>:<addr>:<password>": get info from argument */
-	    arg = netbeansArg + 4;
+	if (*params == ':')
+	    /* ":<host>:<addr>:<password>": get info from argument */
+	    arg = params + 1;
 	if (arg == NULL && (fname = getenv("__NETBEANS_CONINFO")) != NULL)
 	{
-	    /* "-nb": get info from file specified in environment */
+	    /* "": get info from file specified in environment */
 	    if (getConnInfo(fname, &hostname, &address, &password) == FAIL)
-		return;
+		return FAIL;
 	}
 	else
 	{
 	    if (arg != NULL)
 	    {
-		/* "-nb:<host>:<addr>:<password>": get info from argument */
+		/* ":<host>:<addr>:<password>": get info from argument */
 		hostname = arg;
 		address = strchr(hostname, ':');
 		if (address != NULL)
@@ -256,6 +287,10 @@
     if (hostname == NULL || address == NULL || password == NULL)
 	goto theend;	    /* out of memory */
 
+#ifdef FEAT_GUI_W32
+    netbeans_init_winsock();
+#endif
+
 #ifdef INET_SOCKETS
     port = atoi(address);
 
@@ -281,7 +316,6 @@
 	}
 	nbdebug(("error in gethostbyname() in netbeans_connect()\n"));
 	PERROR("gethostbyname() in netbeans_connect()");
-	sd = -1;
 	goto theend;
     }
     memcpy((char *)&server.sin_addr, host->h_addr, host->h_length);
@@ -327,6 +361,15 @@
 		{
 		    nbdebug(("retrying...\n"));
 		    sleep(5);
+		    if (!abort)
+		    {
+			ui_breakcheck();
+			if (got_int)
+			{
+			    sock_errno = EINTR;
+			    break;
+			}
+		    }
 		    if (connect(sd, (struct sockaddr *)&server,
 				sizeof(server)) == 0)
 		    {
@@ -339,7 +382,9 @@
 		    /* Get here when the server can't be found. */
 		    nbdebug(("Cannot connect to Netbeans #2\n"));
 		    PERROR(_("Cannot connect to Netbeans #2"));
-		    getout(1);
+		    if (abort)
+			getout(1);
+		    goto theend;
 		}
 	    }
 
@@ -348,25 +393,24 @@
 	{
 	    nbdebug(("Cannot connect to Netbeans\n"));
 	    PERROR(_("Cannot connect to Netbeans"));
-	    getout(1);
+	    if (abort)
+		getout(1);
+	    goto theend;
 	}
     }
 
+    nbsock = sd;
     vim_snprintf(buf, sizeof(buf), "AUTH %s\n", password);
     nb_send(buf, "netbeans_connect");
 
     sprintf(buf, "0:version=0 \"%s\"\n", ExtEdProtocolVersion);
     nb_send(buf, "externaleditor_version");
 
-/*    nb_init_graphics();  delay until needed */
-
-    haveConnection = TRUE;
-
 theend:
     vim_free(hostname);
     vim_free(address);
     vim_free(password);
-    return;
+    return NETBEANS_OPEN ? OK : FAIL;
 }
 
 /*
@@ -580,6 +624,9 @@
     char_u	*p;
     queue_T	*node;
 
+    if (!NETBEANS_OPEN)
+	return;
+
     while (head.next != NULL && head.next != &head)
     {
 	node = head.next;
@@ -683,7 +730,7 @@
 # endif
 #endif
 
-    if (sd < 0)
+    if (!NETBEANS_OPEN)
     {
 	nbdebug(("messageFromNetbeans() called without a socket\n"));
 	return;
@@ -711,20 +758,20 @@
     {
 #ifdef HAVE_SELECT
 	FD_ZERO(&rfds);
-	FD_SET(sd, &rfds);
+	FD_SET(nbsock, &rfds);
 	tval.tv_sec = 0;
 	tval.tv_usec = 0;
-	if (select(sd + 1, &rfds, NULL, NULL, &tval) <= 0)
+	if (select(nbsock + 1, &rfds, NULL, NULL, &tval) <= 0)
 	    break;
 #else
 # ifdef HAVE_POLL
-	fds.fd = sd;
+	fds.fd = nbsock;
 	fds.events = POLLIN;
 	if (poll(&fds, 1, 0) <= 0)
 	    break;
 # endif
 #endif
-	len = sock_read(sd, buf, MAXMSGSIZE);
+	len = sock_read(nbsock, buf, MAXMSGSIZE);
 	if (len <= 0)
 	    break;	/* error or nothing more to read */
 
@@ -738,7 +785,7 @@
     if (readlen <= 0)
     {
 	/* read error or didn't read anything */
-	netbeans_disconnect();
+	netbeans_close();
 	nbdebug(("messageFromNetbeans: Error in read() from socket\n"));
 	if (len < 0)
 	{
@@ -793,11 +840,9 @@
     if (STRCMP(cmd, "DISCONNECT") == 0)
     {
 	/* We assume the server knows that we can safely exit! */
-	if (sd >= 0)
-	    sock_close(sd);
 	/* Disconnect before exiting, Motif hangs in a Select error
 	 * message otherwise. */
-	netbeans_disconnect();
+	netbeans_close();
 	getout(0);
 	/* NOTREACHED */
     }
@@ -805,9 +850,7 @@
     if (STRCMP(cmd, "DETACH") == 0)
     {
 	/* The IDE is breaking the connection. */
-	if (sd >= 0)
-	    sock_close(sd);
-	netbeans_disconnect();
+	netbeans_close();
 	return;
     }
 
@@ -878,13 +921,13 @@
 
 typedef struct nbbuf_struct nbbuf_T;
 
-static nbbuf_T *buf_list = 0;
+static nbbuf_T *buf_list = NULL;
 static int buf_list_size = 0;	/* size of buf_list */
 static int buf_list_used = 0;	/* nr of entries in buf_list actually in use */
 
-static char **globalsignmap;
-static int globalsignmaplen;
-static int globalsignmapused;
+static char **globalsignmap = NULL;
+static int globalsignmaplen = 0;
+static int globalsignmapused = 0;
 
 static int  mapsigntype __ARGS((nbbuf_T *, int localsigntype));
 static void addsigntype __ARGS((nbbuf_T *, int localsigntype, char_u *typeName,
@@ -896,6 +939,66 @@
 static int curPCtype = -1;
 
 /*
+ * Free netbeans resources.
+ */
+    static void
+nb_free()
+{
+    keyQ_T *key_node = keyHead.next;
+    queue_T *cmd_node = head.next;
+    nbbuf_T buf;
+    buf_T *bufp;
+    int i;
+
+    /* free the netbeans buffer list */
+    for (i = 0; i < buf_list_used; i++)
+    {
+	buf = buf_list[i];
+	vim_free(buf.displayname);
+	vim_free(buf.signmap);
+	if ((bufp=buf.bufp) != NULL)
+	{
+	    buf.bufp->b_netbeans_file = FALSE;
+	    buf.bufp->b_was_netbeans_file = FALSE;
+	}
+    }
+    vim_free(buf_list);
+    buf_list = NULL;
+    buf_list_size = 0;
+    buf_list_used = 0;
+
+    /* free the queued key commands */
+    while(key_node != NULL && key_node != &keyHead)
+    {
+	keyQ_T *next = key_node->next;
+	vim_free(key_node->keystr);
+	vim_free(key_node);
+	if (next == &keyHead)
+	{
+	    keyHead.next = &keyHead;
+	    keyHead.prev = &keyHead;
+	    break;
+	}
+	key_node = next;
+    }
+
+    /* free the queued netbeans commands */
+    while(cmd_node != NULL && cmd_node != &head)
+    {
+	queue_T *next = cmd_node->next;
+	vim_free(cmd_node->buffer);
+	vim_free(cmd_node);
+	if (next == &head)
+	{
+	    head.next = &head;
+	    head.prev = &head;
+	    break;
+	}
+	cmd_node = next;
+    }
+}
+
+/*
  * Get the Netbeans buffer number for the specified buffer.
  */
     static int
@@ -915,7 +1018,7 @@
     int
 isNetbeansBuffer(buf_T *bufp)
 {
-    return usingNetbeans && bufp->b_netbeans_file;
+    return NETBEANS_OPEN && bufp->b_netbeans_file;
 }
 
 /*
@@ -930,7 +1033,7 @@
     int
 isNetbeansModified(buf_T *bufp)
 {
-    if (usingNetbeans && bufp->b_netbeans_file)
+    if (isNetbeansBuffer(bufp))
     {
 	int bufno = nb_getbufno(bufp);
 
@@ -1010,7 +1113,7 @@
     int i;
     static char buf[128];
 
-    if (!haveConnection)
+    if (!NETBEANS_OPEN)
 	return;
 
     for (i = 0; i < buf_list_used; i++)
@@ -1026,9 +1129,8 @@
 	}
 	sprintf(buf, "%d:killed=%d\n", i, r_cmdno);
 	nbdebug(("EVT: %s", buf));
-/*	nb_send(buf, "netbeans_end");    avoid "write failed" messages */
-	if (sd >= 0)
-	    ignored = sock_write(sd, buf, (int)STRLEN(buf));
+	/* nb_send(buf, "netbeans_end");    avoid "write failed" messages */
+	ignored = sock_write(nbsock, buf, (int)STRLEN(buf));
     }
 }
 
@@ -1042,7 +1144,7 @@
      * exited, only mention the first error until the connection works again. */
     static int did_error = FALSE;
 
-    if (sd < 0)
+    if (!NETBEANS_OPEN)
     {
 	if (!did_error)
 	{
@@ -1051,7 +1153,7 @@
 	}
 	did_error = TRUE;
     }
-    else if (sock_write(sd, buf, (int)STRLEN(buf)) != (int)STRLEN(buf))
+    else if (sock_write(nbsock, buf, (int)STRLEN(buf)) != (int)STRLEN(buf))
     {
 	if (!did_error)
 	{
@@ -1073,9 +1175,6 @@
 {
     char reply[32];
 
-    if (!haveConnection)
-	return;
-
     nbdebug(("REP %d: <none>\n", cmdno));
 
     sprintf(reply, "%d\n", cmdno);
@@ -1092,9 +1191,6 @@
 {
     char_u *reply;
 
-    if (!haveConnection)
-	return;
-
     nbdebug(("REP %d: %s\n", cmdno, (char *)result));
 
     reply = alloc((unsigned)STRLEN(result) + 32);
@@ -1113,9 +1209,6 @@
 {
     char reply[32];
 
-    if (!haveConnection)
-	return;
-
     nbdebug(("REP %d: %ld\n", cmdno, result));
 
     sprintf(reply, "%d %ld\n", cmdno, result);
@@ -1272,8 +1365,6 @@
 
 #define SKIP_STOP 2
 #define streq(a,b) (strcmp(a,b) == 0)
-static int needupdate = 0;
-static int inAtomic = 0;
 
 /*
  * Do the actual processing of a single netbeans command or function.
@@ -2648,6 +2739,12 @@
     vim_free(save_str);
 }
 
+    void
+ex_nbclose(eap)
+    exarg_T	*eap UNUSED;
+{
+    netbeans_close();
+}
 
     void
 ex_nbkey(eap)
@@ -2656,6 +2753,12 @@
     (void)netbeans_keystring(eap->arg);
 }
 
+    void
+ex_nbstart(eap)
+    exarg_T	*eap;
+{
+    netbeans_open((char *)eap->arg, FALSE);
+}
 
 /*
  * Initialize highlights and signs for use by netbeans  (mostly obsolete)
@@ -2766,7 +2869,7 @@
 
     /* Don't do anything when 'ballooneval' is off, messages scrolled the
      * windows up or we have no connection. */
-    if (!p_beval || msg_scrolled > 0 || !haveConnection)
+    if (!p_beval || msg_scrolled > 0 || !NETBEANS_OPEN)
 	return;
 
     if (get_beval_info(beval, TRUE, &wp, &lnum, &text, &col) == OK)
@@ -2791,12 +2894,21 @@
 #endif
 
 /*
+ * Return TRUE when the netbeans connection is closed.
+ */
+    int
+netbeans_active(void)
+{
+    return NETBEANS_OPEN;
+}
+
+/*
  * Return netbeans file descriptor.
  */
     int
-netbeans_filedesc (void)
+netbeans_filedesc(void)
 {
-    return sd;
+    return nbsock;
 }
 
 #if defined(FEAT_GUI) || defined(PROTO)
@@ -2806,41 +2918,38 @@
     void
 netbeans_gui_register(void)
 {
-    if (!NB_HAS_GUI)
+    if (!NB_HAS_GUI || !NETBEANS_OPEN)
 	return;
 
-    if (sd > 0)
-    {
 # ifdef FEAT_GUI_MOTIF
-	/* tell notifier we are interested in being called
-	 * when there is input on the editor connection socket
-	 */
-	if (inputHandler == (XtInputId)NULL)
-	    inputHandler = XtAppAddInput((XtAppContext)app_context, sd,
-			     (XtPointer)(XtInputReadMask + XtInputExceptMask),
-						   messageFromNetbeans, NULL);
+    /* tell notifier we are interested in being called
+     * when there is input on the editor connection socket
+     */
+    if (inputHandler == (XtInputId)NULL)
+	inputHandler = XtAppAddInput((XtAppContext)app_context, nbsock,
+			 (XtPointer)(XtInputReadMask + XtInputExceptMask),
+					       messageFromNetbeans, NULL);
 # else
 #  ifdef FEAT_GUI_GTK
-	/*
-	 * Tell gdk we are interested in being called when there
-	 * is input on the editor connection socket
-	 */
-	if (inputHandler == 0)
-	    inputHandler = gdk_input_add((gint)sd, (GdkInputCondition)
-		((int)GDK_INPUT_READ + (int)GDK_INPUT_EXCEPTION),
-						   messageFromNetbeans, NULL);
+    /*
+     * Tell gdk we are interested in being called when there
+     * is input on the editor connection socket
+     */
+    if (inputHandler == 0)
+	inputHandler = gdk_input_add((gint)nbsock, (GdkInputCondition)
+	    ((int)GDK_INPUT_READ + (int)GDK_INPUT_EXCEPTION),
+					       messageFromNetbeans, NULL);
 #  else
 #   ifdef FEAT_GUI_W32
-	/*
-	 * Tell Windows we are interested in receiving message when there
-	 * is input on the editor connection socket
-	 */
-	if (inputHandler == -1)
-	    inputHandler = WSAAsyncSelect(sd, s_hwnd, WM_NETBEANS, FD_READ);
+    /*
+     * Tell Windows we are interested in receiving message when there
+     * is input on the editor connection socket
+     */
+    if (inputHandler == -1)
+	inputHandler = WSAAsyncSelect(nbsock, s_hwnd, WM_NETBEANS, FD_READ);
 #   endif
 #  endif
 # endif
-    }
 
 # ifdef FEAT_BEVAL
     bevalServers |= BEVAL_NETBEANS;
@@ -2852,15 +2961,17 @@
  * Tell netbeans that the window was opened, ready for commands.
  */
     void
-netbeans_startup_done(void)
+netbeans_open(char *params, int abort)
 {
     char *cmd = "0:startupDone=0\n";
 
-    if (!usingNetbeans)
+    if (NETBEANS_OPEN)
+    {
+	EMSG(_("E511: netbeans already connected"));
 	return;
+    }
 
-    netbeans_connect();
-    if (!haveConnection)
+    if (netbeans_connect(params, abort) != OK)
 	return;
 #ifdef FEAT_GUI
     netbeans_gui_register();
@@ -2868,6 +2979,16 @@
 
     nbdebug(("EVT: %s", cmd));
     nb_send(cmd, "netbeans_startup_done");
+
+    /* update the screen after having added the gutter */
+    changed_window_setting();
+    update_screen(CLEAR);
+    setcursor();
+    out_flush();
+#ifdef FEAT_GUI
+    gui_update_cursor(TRUE, FALSE);
+    gui_mch_flush();
+#endif
 }
 
 /*
@@ -2879,7 +3000,7 @@
 {
     char buf[128];
 
-    if (haveConnection)
+    if (NETBEANS_OPEN)
     {
 	sprintf(buf, "0:disconnect=%d\n", r_cmdno);
 	nbdebug(("EVT: %s", buf));
@@ -2896,7 +3017,7 @@
 {
     char buf[128];
 
-    if (!haveConnection)
+    if (!NETBEANS_OPEN)
 	return;
 
     sprintf(buf, "0:geometry=%d %d %d %d %d\n",
@@ -2917,7 +3038,7 @@
     char    buffer[2*MAXPATHL];
     char_u  *q;
 
-    if (!haveConnection || dosetvisible)
+    if (!NETBEANS_OPEN || !bufp->b_netbeans_file || dosetvisible)
 	return;
 
     q = nb_quote(bufp->b_ffname);
@@ -2949,7 +3070,7 @@
     nbbuf_T *bp = nb_get_buf(nb_getbufno(bufp));
     int	    bnum;
 
-    if (!haveConnection)
+    if (!NETBEANS_OPEN)
 	return;
 
     q = nb_quote(bufp->b_ffname);
@@ -2985,7 +3106,7 @@
     nbbuf_T	*nbbuf = nb_get_buf(bufno);
     char	buffer[2*MAXPATHL];
 
-    if (!haveConnection || bufno == -1)
+    if (!NETBEANS_OPEN || bufno == -1)
 	return;
 
     nbdebug(("netbeans_file_killed:\n"));
@@ -3012,7 +3133,7 @@
     int		bufno;
     nbbuf_T	*nbbuf;
 
-    if (!haveConnection || !netbeansFireChanges)
+    if (!NETBEANS_OPEN || !netbeansFireChanges)
 	return NULL;		/* changes are not reported at all */
 
     bufno = nb_getbufno(bufp);
@@ -3046,6 +3167,9 @@
     char_u	*p;
     char_u	*newtxt;
 
+    if (!NETBEANS_OPEN)
+	return;
+
     nbbuf = nb_bufp2nbbuf_fire(bufp, &bufno);
     if (nbbuf == NULL)
 	return;
@@ -3091,6 +3215,9 @@
     pos_T	pos;
     long	off;
 
+    if (!NETBEANS_OPEN)
+	return;
+
     nbbuf = nb_bufp2nbbuf_fire(bufp, &bufno);
     if (nbbuf == NULL)
 	return;
@@ -3119,6 +3246,9 @@
     void
 netbeans_unmodified(buf_T *bufp UNUSED)
 {
+    if (!NETBEANS_OPEN)
+	return;
+
 #if 0
     char_u	buf[128];
     int		bufno;
@@ -3148,6 +3278,9 @@
     char	buf[128];
     int		bufno;
 
+    if (!NETBEANS_OPEN)
+	return;
+
     bufno = nb_getbufno(curbuf);
 
     if (bufno >= 0 && curwin != NULL && curwin->w_buffer == curbuf)
@@ -3199,10 +3332,9 @@
     long	off;
     char_u	*q;
 
-    if (!haveConnection)
+    if (!NETBEANS_OPEN)
 	return TRUE;
 
-
     if (bufno == -1)
     {
 	nbdebug(("got keycommand for non-NetBeans buffer, opening...\n"));
@@ -3260,6 +3392,9 @@
     int		bufno;
     nbbuf_T	*nbbuf;
 
+    if (!NETBEANS_OPEN)
+	return;
+
     nbbuf = nb_bufp2nbbuf_fire(bufp, &bufno);
     if (nbbuf == NULL)
 	return;
@@ -3282,6 +3417,9 @@
     int		bufno;
     nbbuf_T	*nbbuf;
 
+    if (!NETBEANS_OPEN)
+	return;
+
     nbbuf = nb_bufp2nbbuf_fire(bufp, &bufno);
     if (nbbuf == NULL)
 	return;
@@ -3307,6 +3445,9 @@
     signlist_T	*p;
     int		lnum;
 
+    if (!NETBEANS_OPEN)
+	return FALSE;
+
     for (p = curbuf->b_signlist; p != NULL; p = p->next)
 	if (p->id >= GUARDEDOFFSET)
 	    for (lnum = top + 1; lnum < bot; lnum++)
@@ -3328,6 +3469,9 @@
     int y;
     int x;
 
+    if (!NETBEANS_OPEN)
+	return;
+
     x = 0;
     y = row * gui.char_height + 2;
 
@@ -3357,6 +3501,9 @@
     int x;
     GdkDrawable *drawable = gui.drawarea->window;
 
+    if (!NETBEANS_OPEN)
+	return;
+
     x = 0;
     y = row * gui.char_height + 2;
 
@@ -3382,6 +3529,9 @@
 {
     signlist_T	*p;
 
+    if (!NETBEANS_OPEN)
+	return;
+
     for (p = curbuf->b_signlist; p != NULL; p = p->next)
     {
 	if (p->lnum == lnum && p->next && p->next->lnum == lnum)
