diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2d4976b74737e8de506bb26ad0acfd4cebf1ad33..e4c8f69ba3e2e97b974470d6e91241126ae4c0cb 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,12 @@ The format is based on [keep a changelog](http://keepachangelog.com/) and this p
 - Add User-Agent to the default list of accepted CORS request headers.
 - Improve how the dashboard component is stopped when server shuts down.
 - Improve dashboard CORS support by extending the list of allowed request headers.
+- Server startup output now contains database version string.
+- Migrate command output now contains database version string.
+- Doctor command output now contains database version string.
+
+### Changed
+- Internal operations exposed to the script runtime through function bindings now silently ignore unknown parameters.
 
 ## [1.2.0] - 2017-11-06
 ### Added
diff --git a/Makefile b/Makefile
index e2d54ce531070d491510b5b49f0b2fc4afa7e8ea..0b4a8f7b8e58269098cf529ea20280dc379aa6e6 100644
--- a/Makefile
+++ b/Makefile
@@ -146,8 +146,7 @@ dbsetup:
 	./${BUILDDIR}/dev/${BINNAME} migrate up
 
 .PHONY: dbreset
-dbreset:
-	./${BUILDDIR}/dev/${BINNAME} migrate down --limit 0
+dbreset: dbstop $(shell rm -rf /tmp/cockroach) dbstart
 
 .PHONY: dockerbuild
 dockerbuild:
diff --git a/cmd/migrate.go b/cmd/migrate.go
index 347b03427b4bb3480496851943e334a233d033c0..a7a196a2da2b7b3ec9a4bde4d8a22bb924efa4e0 100644
--- a/cmd/migrate.go
+++ b/cmd/migrate.go
@@ -126,6 +126,12 @@ func MigrateParse(args []string, logger *zap.Logger) {
 		logger.Fatal("Error pinging database", zap.Error(err))
 	}
 
+	var dbVersion string
+	if err = db.QueryRow("SELECT version()").Scan(&dbVersion); err != nil {
+		logger.Fatal("Error querying database version", zap.Error(err))
+	}
+	logger.Info("Database information", zap.String("version", dbVersion))
+
 	var exists bool
 	err = db.QueryRow("SELECT EXISTS(SELECT 1 FROM pg_database WHERE datname = $1)", dbname).Scan(&exists)
 start:
diff --git a/main.go b/main.go
index 77eef71339092be550f10990e3eb181d65d1f9ea..e96e9fbde612952c0db6485ffd32d8c4fe8c99bd 100644
--- a/main.go
+++ b/main.go
@@ -81,7 +81,8 @@ func main() {
 	multiLogger.Info("Data directory", zap.String("path", config.GetDataDir()))
 	multiLogger.Info("Database connections", zap.Strings("dsns", config.GetDatabase().Addresses))
 
-	db := dbConnect(multiLogger, config.GetDatabase().Addresses)
+	db, dbVersion := dbConnect(multiLogger, config.GetDatabase().Addresses)
+	multiLogger.Info("Database information", zap.String("version", dbVersion))
 
 	// Check migration status and log if the schema has diverged.
 	cmd.MigrationStartupCheck(multiLogger, db)
@@ -114,7 +115,7 @@ func main() {
 	purchaseService := server.NewPurchaseService(jsonLogger, multiLogger, db, config.GetPurchase())
 	pipeline := server.NewPipeline(config, db, trackerService, matchmakerService, messageRouter, sessionRegistry, socialClient, runtimePool, purchaseService, notificationService)
 	authService := server.NewAuthenticationService(jsonLogger, config, db, jsonpbMarshaler, jsonpbUnmarshaler, statsService, sessionRegistry, socialClient, pipeline, runtimePool)
-	dashboardService := server.NewDashboardService(jsonLogger, multiLogger, semver, config, statsService)
+	dashboardService := server.NewDashboardService(jsonLogger, multiLogger, semver, dbVersion, config, statsService)
 
 	gaenabled := len(os.Getenv("NAKAMA_TELEMETRY")) < 1
 	cookie := newOrLoadCookie(config.GetDataDir())
@@ -148,7 +149,7 @@ func main() {
 	select {}
 }
 
-func dbConnect(multiLogger *zap.Logger, dsns []string) *sql.DB {
+func dbConnect(multiLogger *zap.Logger, dsns []string) (*sql.DB, string) {
 	// TODO config database pooling
 	rawurl := fmt.Sprintf("postgresql://%s?sslmode=disable", dsns[0])
 	url, err := url.Parse(rawurl)
@@ -169,7 +170,12 @@ func dbConnect(multiLogger *zap.Logger, dsns []string) *sql.DB {
 		multiLogger.Fatal("Error pinging database", zap.Error(err))
 	}
 
-	return db
+	var dbVersion string
+	if err := db.QueryRow("SELECT version()").Scan(&dbVersion); err != nil {
+		multiLogger.Fatal("Error querying database version", zap.Error(err))
+	}
+
+	return db, dbVersion
 }
 
 // Help improve Nakama by sending anonymous usage statistics.
diff --git a/server/dashboard_accepter.go b/server/dashboard_accepter.go
index ca916c050bc2375e60a4c6a01cd301f15e988279..412cacfa68e612cc6f6d2657df2ab22941bdf735 100644
--- a/server/dashboard_accepter.go
+++ b/server/dashboard_accepter.go
@@ -33,6 +33,7 @@ import (
 type dashboardService struct {
 	logger              *zap.Logger
 	version             string
+	dbVersion           string
 	config              Config
 	statsService        StatsService
 	httpServer          *http.Server
@@ -41,10 +42,11 @@ type dashboardService struct {
 }
 
 // NewDashboardService creates a new dashboardService
-func NewDashboardService(logger *zap.Logger, multiLogger *zap.Logger, version string, config Config, statsService StatsService) *dashboardService {
+func NewDashboardService(logger *zap.Logger, multiLogger *zap.Logger, version string, dbVersion string, config Config, statsService StatsService) *dashboardService {
 	service := &dashboardService{
 		logger:       logger,
 		version:      version,
+		dbVersion:    dbVersion,
 		config:       config,
 		statsService: statsService,
 		mux:          mux.NewRouter(),
@@ -106,11 +108,12 @@ func (s *dashboardService) infoHandler(w http.ResponseWriter, r *http.Request) {
 	w.Header().Set("Content-Type", "application/json; charset=utf-8")
 
 	info := map[string]interface{}{
-		"version": s.version,
-		"go":      runtime.Version(),
-		"arch":    runtime.GOARCH,
-		"os":      runtime.GOOS,
-		"cpus":    runtime.NumCPU(),
+		"version":    s.version,
+		"db_version": s.dbVersion,
+		"go":         runtime.Version(),
+		"arch":       runtime.GOARCH,
+		"os":         runtime.GOOS,
+		"cpus":       runtime.NumCPU(),
 	}
 
 	infoBytes, _ := json.Marshal(info)
diff --git a/server/runtime_nakama_module.go b/server/runtime_nakama_module.go
index 7329e1f72453648d3cea766b3a8b29c21cf8d415..457fcbf49780ddacac32c14489217ea301ba7cb1 100644
--- a/server/runtime_nakama_module.go
+++ b/server/runtime_nakama_module.go
@@ -762,9 +762,6 @@ func (n *NakamaModule) usersUpdate(l *lua.LState) int {
 					return
 				}
 				update.AvatarUrl = v.String()
-			default:
-				conversionError = "unrecognised update key, expects a valid set of user updates"
-				return
 			}
 		})
 
@@ -1222,9 +1219,6 @@ func (n *NakamaModule) storageUpdate(l *lua.LState) int {
 					return
 				}
 				update.Patch = patch
-			default:
-				conversionError = "unrecognised update key, expects a valid set of storage updates"
-				return
 			}
 		})
 
@@ -1796,9 +1790,6 @@ func (n *NakamaModule) groupsUpdate(l *lua.LState) int {
 				}
 
 				p.Metadata = string(metadataBytes)
-			default:
-				conversionError = fmt.Sprintf("unknown group field: %v", k.String())
-				return
 			}
 		})