diff --git a/src/sbbs3/js_sqlite.c b/src/sbbs3/js_sqlite.c
index e2af242e923c7a0b7f850ccdb9bb3e7d2febec3a..1a9448c6b1dcda1139f6e308f43b0f27e0d671f2 100644
--- a/src/sbbs3/js_sqlite.c
+++ b/src/sbbs3/js_sqlite.c
@@ -119,8 +119,66 @@ js_close(JSContext *cx, uintN argc, jsval *arglist)
 	JS_SET_RVAL(cx, arglist, JSVAL_TRUE);
 	return JS_TRUE;
 }
+
 static JSBool
 js_exec(JSContext *cx, uintN argc, jsval *arglist)
+{
+	int           rc;
+	private_t*    p;
+	JSString*     str;
+	size_t        stmt_sz = 0;
+	jsval *       argv = JS_ARGV(cx, arglist);
+	JSObject *    parent = JS_THIS_OBJECT(cx, arglist);
+	char *		  dberror = NULL;
+
+	if ((p = (private_t*)JS_GetPrivate(cx, parent)) == NULL) {
+		JS_ReportError(cx, getprivate_failure, WHERE);
+		return JS_FALSE;
+	}
+
+	// use the parameter as query
+	if (argc <= 0) {
+		dbprintf(TRUE, p, "exec expects at least one string parameter");
+		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+		return JS_TRUE;		
+	}
+
+	dbprintf (FALSE, p, "exec has stmt");
+	str = JS_ValueToString(cx, argv[0]);
+	if (str != NULL) {
+		JSSTRING_TO_RASTRING(cx, str, p->stmt, &stmt_sz, NULL);
+		dbprintf (FALSE, p, "exec param: %s", p->stmt);
+	}
+	
+	if (p->db == NULL) {
+		dbprintf(TRUE, p, "Database is not opened");
+		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+		return JS_TRUE;
+	}
+
+	if (p->stmt == NULL) {
+		dbprintf(FALSE, p, "Empy statement");
+		p->errormsg = "Empty statement";
+		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+		return JS_TRUE;
+	}
+
+	dbprintf (FALSE, p, "Execute: %s", p->stmt);
+	rc = sqlite3_exec(p->db, p->stmt, NULL, NULL, &dberror);
+
+	if (rc == SQLITE_OK) {
+		return JS_TRUE;
+	}
+	else {
+		p->errormsg = (char* ) sqlite3_errmsg(p->db);
+		JS_SET_RVAL(cx, arglist, JSVAL_FALSE);
+		dbprintf(FALSE, p, "Prepare error: %s. %s", sqlite3_errmsg(p->db), dberror);
+		return JS_TRUE;
+	}
+}
+
+static JSBool
+js_query(JSContext *cx, uintN argc, jsval *arglist)
 {
 	int           rc, i;
 	private_t*    p;
@@ -215,7 +273,6 @@ js_exec(JSContext *cx, uintN argc, jsval *arglist)
 /* Sqlite Object Properites */
 enum {
 	SQLITE_PROP_NAME
-	, SQLITE_PROP_STMT
 	, SQLITE_PROP_DEBUG
 	, SQLITE_PROP_ERRORMSG
 };
@@ -226,8 +283,6 @@ static JSBool js_sqlite_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict
 	jsint      tiny;
 	private_t* p;
 	int32      intval = 0;
-	JSString*  js_str;
-	size_t     js_str_sz = 0;
 	jsval      idval;
 
 	if ((p = (private_t*)JS_GetPrivate(cx, obj)) == NULL) {
@@ -246,11 +301,6 @@ static JSBool js_sqlite_set(JSContext *cx, JSObject *obj, jsid id, JSBool strict
 	dbprintf(FALSE, p, "Setting property %d", tiny);
 
 	switch (tiny) {
-		case SQLITE_PROP_STMT:
-			if ((js_str = JS_ValueToString(cx, *vp)) == NULL)
-				return JS_FALSE;
-			JSSTRING_TO_RASTRING(cx, js_str, p->stmt, &js_str_sz, NULL);
-			break;
 		case SQLITE_PROP_DEBUG:
 			p->debug = intval;
 			break;
@@ -282,11 +332,6 @@ static JSBool js_sqlite_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
 				return JS_FALSE;
 			*vp = STRING_TO_JSVAL(js_str);
 			break;
-		case SQLITE_PROP_STMT:
-			if ((js_str = JS_NewStringCopyZ(cx, p->stmt)) == NULL)
-				return JS_FALSE;
-			*vp = STRING_TO_JSVAL(js_str);
-			break;
 		case SQLITE_PROP_DEBUG:
 			*vp = BOOLEAN_TO_JSVAL(p->debug);
 			break;
@@ -306,7 +351,6 @@ static JSBool js_sqlite_get(JSContext *cx, JSObject *obj, jsid id, jsval *vp)
 static jsSyncPropertySpec js_sqlite_properties[] = {
 /*		 name				,tinyid					,flags,				ver	*/
 	{   "name", SQLITE_PROP_NAME, SQLITE_PROP_ROFLAGS,  321},
-	{   "stmt", SQLITE_PROP_STMT, JSPROP_ENUMERATE,  321},
 	{   "debug", SQLITE_PROP_DEBUG, JSPROP_ENUMERATE,  321},
 	{   "errormsg", SQLITE_PROP_ERRORMSG, SQLITE_PROP_ROFLAGS,  321},
 	{0}
@@ -315,7 +359,6 @@ static jsSyncPropertySpec js_sqlite_properties[] = {
 #ifdef BUILD_JSDOCS
 static char*            sqlite_prop_desc[] = {
 	"filename specified in constructor - <small>READ ONLY</small>"
-	, "string sql statement"
 	, "set to <i>true</i> to enable debug log output"
 	, "get the last error message - <small>READ ONLY</small>"
 	, NULL
@@ -331,7 +374,10 @@ static jsSyncMethodSpec js_sqlite_functions[] = {
 	 , JSDOCSTR("close database")
 	 , 321},
 	{"exec",            js_exec,            0,  JSTYPE_BOOLEAN, JSDOCSTR("")
-	 , JSDOCSTR("exec the sql query on database")
+	 , JSDOCSTR("exec the sql query on database without results")
+	 , 321},
+	{"query",            js_query,            0,  JSTYPE_BOOLEAN, JSDOCSTR("")
+	 , JSDOCSTR("exec the sql query on database that return rows")
 	 , 321},
 	{0}
 };