Index: share/dataselect.wadl
===================================================================
--- share/dataselect.wadl	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ share/dataselect.wadl	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -36,6 +36,10 @@
 				<option value="B"/>
 				<option value="M"/>
 			</param>
+			<param name="nodata" style="query" type="xsd:int" default="204">
+				<option value="204"/>
+				<option value="404"/>
+			</param>
 		</request>
 		<response status="200">
 			<representation mediaType="application/vnd.fdsn.mseed"/>
Index: share/event.html
===================================================================
--- share/event.html	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ share/event.html	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -32,10 +32,11 @@
       <em>agencyID</em></li>
     <li>additional request parameters:
       <ul>
-        <li><em>format</em>: <em>string [qml, qml-rt, sc3ml, csv]</em>, default:
+        <li><em>format</em>: string [qml, qml-rt, sc3ml, csv], default:
           <em>qml</em></li>
         <li><em>includecomments</em>: boolean, default: <em>true</em></li>
         <li><em>formatted</em>: boolean, default: <em>false</em></li>
+        <li><em>nodata</em>: integer [204, 404], default: <em>204</em></li>
       </ul>
     </li>
   </ul>
Index: share/station.html
===================================================================
--- share/station.html	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ share/station.html	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -35,6 +35,7 @@
         <li><em>format</em>: <em>string [fdsnxml, stationxml, sc3ml]</em>, default:
           <em>fdsnxml</em></li>
         <li><em>formatted</em>: boolean, default: <em>false</em></li>
+        <li><em>nodata</em>: integer [204, 404], default: <em>204</em></li>
       </ul>
     </li>
   </ul>
Index: share/event.wadl
===================================================================
--- share/event.wadl	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ share/event.wadl	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -50,6 +50,10 @@
 					</param>
 					<param name="includecomments" style="query" type="xsd:boolean" default="true"/>
 					<param name="formatted" style="query" type="xsd:boolean" default="false"/>
+					<param name="nodata" style="query" type="xsd:int" default="204">
+						<option value="204"/>
+						<option value="404"/>
+					</param>
 				</request>
 				<response status="200">
 					<representation mediaType="application/xml"/>
Index: share/station.wadl
===================================================================
--- share/station.wadl	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ share/station.wadl	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -36,6 +36,10 @@
 						<option value="sc3ml"/>
 					</param>
 					<param name="formatted" style="query" type="xsd:boolean" default="false"/>
+					<param name="nodata" style="query" type="xsd:int" default="204">
+						<option value="204"/>
+						<option value="404"/>
+					</param>
 				</request>
 				<response status="200">
 					<representation mediaType="application/xml"/>
Index: share/dataselect.html
===================================================================
--- share/dataselect.html	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ share/dataselect.html	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -31,6 +31,11 @@
     <li><em>longestonly</em> request parameter not implemented</li>
     <li>access to restricted networks and stations is only granted through the
       <em>queryauth</em> method</li>
+    <li>additional request parameters:
+      <ul>
+        <li><em>nodata</em>: integer [204, 404], default: <em>204</em></li>
+      </ul>
+    </li>
   </ul>
 </body>
 </html>
Index: fdsnws/request.py
===================================================================
--- fdsnws/request.py	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ fdsnws/request.py	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -8,6 +8,7 @@
 ################################################################################
 
 import fnmatch, math, re, string, sys
+from twisted.web import http
 
 from seiscomp3.Core import Time
 from seiscomp3 import Logging, Math
@@ -15,8 +16,8 @@
 class RequestOptions:
 
 	ChannelChars = re.compile(r'[^A-Z0-9*?]').search
-	TimeFormats = ( "%FT%T.%f",    # YYYY-MM-DDThh:mm:ss.sss
-	                "%Y-%jT%T.%f", # YYYY-DDDThh:mm:ss.sss
+	TimeFormats = ( "%FT%T.%f",    # YYYY-MM-DDThh:mm:ss.ssssss
+	                "%Y-%jT%T.%f", # YYYY-DDDThh:mm:ss.ssssss
 	                "%FT%T",       # YYYY-MM-DDThh:mm:ss
 	                "%Y-%jT%T",    # YYYY-DDDThh:mm:ss
 	                "%FT%R",       # YYYY-MM-DDThh:mm
@@ -77,12 +78,15 @@
 			self.endBefore   = None
 			self.endAfter    = None
 
-		def match(self, start, end):
+		# used by FDSN Station only
+		def match(self, start, end=None):
 			# simple time
 			if self.simpleTime:
+				# limit to metadata epochs active on or after the specified
+				# start time and starting before specified end time
 				return \
-					(not self.start or (start and start >= self.start)) and \
-					(not self.end or (end and end <= self.end))
+					(not self.start or (not end or end >= self.start)) and \
+					(not self.end or start <= self.end)
 
 			# window time
 			return \
@@ -160,7 +164,7 @@
 				if b.dateLineCrossing():
 					return lon >= b.minLon or lon <= b.maxLon
 				if b.minLon is not None and lon < b.minLon: return False
-				if b.maxLat is not None and lon > b.maxLon: return False
+				if b.maxLon is not None and lon > b.maxLon: return False
 				return True
 			elif self.bCircle:
 				c = self.bCircle
@@ -177,6 +181,7 @@
 		self.service    = ""
 		self.accessTime = Time.GMT()
 		self.userName   = None
+		self.noData     = http.NO_CONTENT
 
 		self.channel = None
 		self.time    = None
@@ -188,6 +193,13 @@
 			for key in args.keys():
 				self._args[key.lower()] = args[key]
 
+	#---------------------------------------------------------------------------
+	def parseNoData(self):
+		if "nodata" in self._args:
+			code = self.parseInt("nodata")
+			if code != http.NO_CONTENT and code != http.NOT_FOUND:
+				raise ValueError, "Invalid value in parameter nodata"
+			self.noData = code
 
 	#---------------------------------------------------------------------------
 	def parseChannel(self):
@@ -280,7 +292,7 @@
 			b.maxLat = self.parseFloat("maxlatitude", -90, 90)
 		if b.minLat is not None and b.maxLat is not None and \
 		   b.minLat > b.maxLat:
-			raise ValueError, "minlatitude exceeds maxlatitude"
+			raise ValueError, "Minlatitude exceeds maxlatitude"
 
 		if "minlon" in self._args:
 			b.minLon = self.parseFloat("minlon", -180, 180)
@@ -313,7 +325,7 @@
 			c.maxRad = self.parseFloat("maxradius", 0, 180)
 		if c.minRad is not None and c.maxRad is not None and \
 		   c.minRad > c.maxRad:
-			raise ValueError, "minradius exceeds maxradius"
+			raise ValueError, "Minradius exceeds maxradius"
 
 		hasBCircleRadParam = c.minRad is not None or c.maxRad is not None
 		hasBCircleParam = c.lat is not None or c.lon is not None or \
Index: fdsnws/dataselect.py
===================================================================
--- fdsnws/dataselect.py	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ fdsnws/dataselect.py	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -95,7 +95,7 @@
 		if self.PLongestOnly in self._args:
 			self.longestonly = self.parseBoolean(self.PLongestOnly)
 
-		# channel filter (optional)
+		self.parseNoData()
 		self.parseChannel()
 		self.parseTime()
 
@@ -191,7 +191,8 @@
 					if ro.time.end.fromString(toks[5], fmt): break
 
 			Logging.debug("ro: %s.%s.%s.%s %s" % (ro.channel.net,
-			              ro.channel.sta, ro.channel.loc, ro.channel.cha, ro.time.start.iso()))
+			              ro.channel.sta, ro.channel.loc, ro.channel.cha,
+			              ro.time.start.iso()))
 			self.streams.append(ro)
 
 		if len(self.streams) == 0:
@@ -331,7 +332,7 @@
 			for net in utils.networkIter(inv, s):
 				if ro.userName is None and net.restricted():
 					continue
-				for sta in utils.stationIter(net, s, True, False, False):
+				for sta in utils.stationIter(net, s):
 					if ro.userName is None and sta.restricted():
 						continue
 					for loc in utils.locationIter(sta, s):
@@ -354,7 +355,7 @@
 								diffSec = (s.time.end - s.time.start).length()
 								samples += int(diffSec * n / d)
 								if samples > maxSamples:
-									msg = "maximum number of %sM samples " \
+									msg = "Maximum number of %sM samples " \
 									      "exceeded" % str(app._samplesM)
 									return HTTP.renderErrorPage(req,
 									       http.REQUEST_ENTITY_TOO_LARGE, msg,
Index: fdsnws/http.py
===================================================================
--- fdsnws/http.py	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ fdsnws/http.py	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -36,11 +36,15 @@
 %s
 """
 
+		# rewrite response code if requested an no data was found
+		if ro is not None and code == http.NO_CONTENT:
+			code = ro.noData
+
 		request.setHeader("Content-Type", "text/plain")
 		request.setResponseCode(code)
 
 		codeStr = http.RESPONSES[code]
-		Logging.warning("Responding with error: %i (%s)" % (code, codeStr))
+		Logging.warning("responding with error: %i (%s)" % (code, codeStr))
 		date = Core.Time.GMT().toString("%FT%T.%f")
 		response = resp % (code, codeStr, msg, request.uri, date, VERSION)
 		utils.accessLog(request, ro, code, len(response), msg)
@@ -50,7 +54,7 @@
 	#---------------------------------------------------------------------------
 	@staticmethod
 	def renderNotFound(request):
-		msg = "The requested resource does not exist on this server"
+		msg = "The requested resource does not exist on this server."
 		return HTTP.renderErrorPage(request, http.NOT_FOUND, msg)
 
 	#---------------------------------------------------------------------------
@@ -63,8 +67,8 @@
 
 		msg = "The result set of your request exceeds the configured maximum " \
 		      "number of objects (%i). Refine your request parameters." % maxObj
-		writeTS(req, HTTP.renderErrorPage(req, http.REQUEST_ENTITY_TOO_LARGE,
-			                                  msg))
+		utils.writeTS(req, HTTP.renderErrorPage(
+		              req, http.REQUEST_ENTITY_TOO_LARGE, msg))
 		return False
 
 
Index: fdsnws/utils.py
===================================================================
--- fdsnws/utils.py	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ fdsnws/utils.py	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -24,19 +24,38 @@
 	for i in xrange(inv.networkCount()):
 		net = inv.network(i)
 
-		if not ro.channel or ro.channel.matchNet(net.code()):
-			yield net
+		# network code
+		if ro.channel and not ro.channel.matchNet(net.code()):
+			continue
 
+		# start and end time
+		if ro.time:
+			try: end = net.end()
+			except: end = None
+			if not ro.time.match(net.start(), end):
+				continue
+
+		yield net
+
+
 #-------------------------------------------------------------------------------
 # Filtered station iterator which yields stations of a particular network
 # matching request options
-def stationIter(net, ro, matchChannel=True, matchGeo=True, matchTime=True):
+def stationIter(net, ro, matchGeo=False):
 	for i in xrange(net.stationCount()):
 		sta = net.station(i)
+
 		# station code
-		if matchChannel and ro.channel and not ro.channel.matchSta(sta.code()):
+		if ro.channel and not ro.channel.matchSta(sta.code()):
 			continue
 
+		# start and end time
+		if ro.time:
+			try: end = sta.end()
+			except: end = None
+			if not ro.time.match(sta.start(), end):
+				continue
+
 		# geographic location
 		if matchGeo and ro.geo:
 			try:
@@ -46,13 +65,6 @@
 			if not ro.geo.match(lat, lon):
 				continue
 
-		# start and end time
-		if matchTime and ro.time:
-			try: end = sta.end()
-			except: end = None
-			if not ro.time.match(sta.start(), end):
-				continue
-
 		yield sta
 
 
@@ -62,19 +74,41 @@
 def locationIter(sta, ro):
 	for i in xrange(sta.sensorLocationCount()):
 		loc = sta.sensorLocation(i)
-		if not ro.channel or ro.channel.matchLoc(loc.code()):
-			yield loc
 
+		# location code
+		if ro.channel and not ro.channel.matchLoc(loc.code()):
+			continue
+
+		# start and end time
+		if ro.time:
+			try: end = loc.end()
+			except: end = None
+			if not ro.time.match(loc.start(), end):
+				continue
+
+		yield loc
+
 #-------------------------------------------------------------------------------
 # Filtered stream iterator which yields channels of a particular location
 # matching request options
 def streamIter(loc, ro):
 	for i in xrange(loc.streamCount()):
 		stream = loc.stream(i)
-		if not ro.channel or ro.channel.matchCha(stream.code()):
-			yield stream
 
+		# stream code
+		if ro.channel and not ro.channel.matchCha(stream.code()):
+			continue
 
+		# start and end time
+		if ro.time:
+			try: end = stream.end()
+			except: end = None
+			if not ro.time.match(stream.start(), end):
+				continue
+
+		yield stream
+
+
 #-------------------------------------------------------------------------------
 # Thread-safe write of data using reactor main thread
 def writeTS(req, data):
@@ -85,13 +119,13 @@
 # Finish served requests
 def onRequestServed(success, req):
 	if req._disconnected:
-		Logging.debug("Request aborted")
+		Logging.debug("request aborted")
 		return
 
 	if success:
-		Logging.debug("Request successfully served")
+		Logging.debug("request successfully served")
 	else:
-		Logging.debug("Request failed")
+		Logging.debug("request failed")
 	reactor.callFromThread(req.finish)
 
 
Index: fdsnws/event.py
===================================================================
--- fdsnws/event.py	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ fdsnws/event.py	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -90,10 +90,8 @@
 
 	#---------------------------------------------------------------------------
 	def parse(self):
-		# time
+		self.parseNoData()
 		self.parseTime()
-
-		# geo filter (bounding box or bounding circle)
 		self.parseGeo()
 
 		# depth
@@ -103,7 +101,7 @@
 		if "maxdepth" in self._args:
 			d.max = self.parseFloat("maxdepth")
 		if d.min is not None and d.max is not None and d.min > d.max:
-			raise ValueError, "mindepth exceeds maxdepth"
+			raise ValueError, "Mindepth exceeds maxdepth"
 		if d.min is not None or d.max:
 			self.depth = d
 
@@ -118,7 +116,7 @@
 		elif "maxmagnitude" in self._args:
 			m.max = self.parseFloat("maxmagnitude")
 		if m.min is not None and m.max is not None and m.min > m.max:
-			raise ValueError, "minmagnitude exceeds maxmagnitude"
+			raise ValueError, "Minmagnitude exceeds maxmagnitude"
 		if "magtype" in self._args:
 			m.type = self._args["magtype"][0]
 		elif "magnitudetype" in self._args:
@@ -257,7 +255,7 @@
 			return False
 
 		objCount = ep.eventCount()
-		Logging.debug("Events found: %i" % objCount)
+		Logging.debug("events found: %i" % objCount)
 		if not HTTP.checkObjects(req, objCount, maxObj): return False
 
 		# add related information
@@ -394,13 +392,15 @@
 		if ro.time:
 			colTimeMS = _T("time_value_ms")
 			if ro.time.start is not None:
-				q += " AND o.%s >= '%s'" % (colTime, _time(ro.time.start))
+				t = _time(ro.time.start)
 				ms = ro.time.start.microseconds()
-				if ms > 0: q += " AND o.%s >= %i" % (colTimeMS, ms)
+				q += " AND (o.%s > '%s' OR (o.%s = '%s' AND o.%s >= %i)) " % (
+				     colTime, t, colTime, t, colTimeMS, ms)
 			if ro.time.end is not None:
-				q += " AND o.%s c= '%s'" % (colTime, _time(ro.time.end))
+				t = _time(ro.time.end)
 				ms = ro.time.end.microseconds()
-				if ms > 0: q += " AND o.%s <= %i" % (colTimeMS, ms)
+				q += " AND (o.%s < '%s' OR (o.%s = '%s' AND o.%s <= %i))" % (
+				     colTime, t, colTime, t, colTimeMS, ms)
 
 		# bounding box
 		if bBox:
@@ -428,24 +428,17 @@
 
 		# updated after
 		if ro.updatedAfter:
-			timeStr = _time(ro.updatedAfter)
+			t = _time(ro.updatedAfter)
 			ms = ro.updatedAfter.microseconds()
-			colCTime = _T("creationinfo_creationtime")
-			colMTime = _T("creationinfo_modificationtime")
-			if ms > 0:
-				colCTimeMS = _T("creationinfo_creationtime_ms")
-				colMTimeMS = _T("creationinfo_modificationtime_ms")
-				tFilter = "(o.%s >= '%s' AND o.%s > %i)"
-			else:
-				tFilter = "o.%s > '%s'"
+			colCTime   = _T("creationinfo_creationtime")
+			colCTimeMS = _T("creationinfo_creationtime_ms")
+			colMTime   = _T("creationinfo_modificationtime")
+			colMTimeMS = _T("creationinfo_modificationtime_ms")
+			tFilter = "(o.%s > '%s' OR (o.%s = '%s' AND o.%s > %i))"
 
 			q += " AND ("
-			if ms > 0: q += tFilter % (colCTime, timeStr, colCTimeMS, ms)
-			else:      q += tFilter % (colCTime, timeStr)
-			q += " OR "
-			if ms > 0: q += tFilter % (colMTime, timeStr, colMTimeMS, ms)
-			else:      q += tFilter % (colMTime, timeStr)
-			q += ")"
+			q += tFilter % (colCTime, t, colCTime, t, colCTimeMS, ms) + " OR "
+			q += tFilter % (colMTime, t, colMTime, t, colMTimeMS, ms) + ")"
 
 		# magnitude information filter
 		if reqMag:
@@ -500,7 +493,7 @@
 			if ro.offset is not None:
 				q += " OFFSET %i" % ro.offset
 
-		Logging.debug("Event query: %s" % q)
+		Logging.debug("event query: %s" % q)
 
 		for e in dbq.getObjectIterator(q, DataModel.Event.TypeInfo()):
 			ep.add(DataModel.Event.Cast(e))
Index: fdsnws/station.py
===================================================================
--- fdsnws/station.py	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ fdsnws/station.py	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -58,6 +58,7 @@
 
 	#---------------------------------------------------------------------------
 	def parse(self):
+		self.parseNoData()
 		self.parseChannel()
 		self.parseTime(True)
 		self.parseGeo()
@@ -65,14 +66,14 @@
 		# level: [network, station, channel, response]
 		if "level" in self._args:
 			value = self._args["level"][0].lower()
-			if value ==  "network":
+			if value ==  "network" or value == "net":
 				self.includeSta = False
-			elif value == "channel":
+			elif value == "channel" or value == "cha" or value == "chan":
 				self.includeCha = True
-			elif value == "response":
+			elif value == "response" or value == "res" or value == "resp":
 				self.includeCha = True
 				self.includeRes = True
-			elif value != "station":
+			elif value != "station" and value != "sta":
 				raise ValueError, "Invalid value in parameter: level"
 
 		# includeRestricted (optional)
@@ -169,7 +170,7 @@
 			newNet = DataModel.Network(net)
 
 			# iterate over inventory stations of current network
-			for sta in utils.stationIter(net, ro):
+			for sta in utils.stationIter(net, ro, matchGeo=True):
 				if not ro.restricted and sta.restricted(): continue
 				if not HTTP.checkObjects(req, objCount, maxObj): return False
 				if ro.includeCha:
@@ -241,7 +242,7 @@
 			return True
 
 		for loc in utils.locationIter(sta, ro):
-			if not ro.channel.cha:
+			if not ro.channel.cha and not ro.time:
 				return True
 
 			for stream in utils.streamIter(loc, ro):
Index: descriptions/fdsnws.rst
===================================================================
--- descriptions/fdsnws.rst	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ descriptions/fdsnws.rst	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -24,22 +24,25 @@
 URL
 ^^^
 
-* http://localhost:8080/fdsnws/1/dataselect/query
-* http://localhost:8080/fdsnws/1/dataselect/queryauth
-* http://localhost:8080/fdsnws/1/dataselect/version
-* http://localhost:8080/fdsnws/1/dataselect/application.wadl
+* http://localhost:8080/fdsnws/dataselect/1/query
+* http://localhost:8080/fdsnws/dataselect/1/queryauth
+* http://localhost:8080/fdsnws/dataselect/1/version
+* http://localhost:8080/fdsnws/dataselect/1/application.wadl
 
 Example
 ^^^^^^^
 
-http://localhost:8080/fdsnws/1/dataselect/query?net=GE&sta=BKNI&cha=BH?&start=2013-04-11T00:00:00&end=2013-04-11T12:00:00
+http://localhost:8080/fdsnws/dataselect/1/query?net=GE&sta=BKNI&cha=BH?&start=2013-04-11T00:00:00&end=2013-04-11T12:00:00
 
+Be careful with encoding the '?' present in wildcards. Use '%3F' or '%3f' in
+place of any '?' in the parameters.
+
 To summit POST request the command line tool ``wget`` in combination with the
 parameter ``post-data`` or ``post-file`` may be used.
 
 .. code-block:: sh
 
-   sysop@host:~$ wget --post-file=request.txt "http://localhost:8080/fdsnws/1/dataselect/query" -O output.mseed
+   sysop@host:~$ wget --post-file=request.txt "http://localhost:8080/fdsnws/dataselect/1/query" -O output.mseed
 
 Feature Notes
 ^^^^^^^^^^^^^
@@ -49,7 +52,11 @@
 * ``longestonly`` parameter is not implemented
 * access to restricted networks and stations is only granted through the
   ``queryauth`` method
+* additional request parameters:
 
+  * ``nodata: [204, 404]``, default: ``204``, HTTP-GET only, defines the HTTP
+    error code the server should respond with if no data was found
+
 Station
 -------
 
@@ -61,14 +68,14 @@
 URL
 ^^^
 
-* http://localhost:8080/fdsnws/1/station/query
-* http://localhost:8080/fdsnws/1/station/version
-* http://localhost:8080/fdsnws/1/station/application.wadl
+* http://localhost:8080/fdsnws/station/1/query
+* http://localhost:8080/fdsnws/station/1/version
+* http://localhost:8080/fdsnws/station/1/application.wadl
 
 Example
 ^^^^^^^
 
-* http://localhost:8080/fdsnws/1/station/query?net=GE&level=sta
+* http://localhost:8080/fdsnws/station/1/query?net=GE&level=sta
 
 Feature Notes
 ^^^^^^^^^^^^^
@@ -77,13 +84,15 @@
   in SeisComP is tracked on the object level. If a child of an object is updated
   the update time is not propagated to all parents. In order to check if a
   station was updated all children must be evaluated recursively. This operation
-  would be much to expensive.
+  would be much too expensive.
 * to enable FDSNXML or StationXML support the plugins ``fdsnxml`` resp.
   ``staxml`` have to be loaded
 * additional request parameters:
 
   * ``format: [fdsnxml, stationxml, sc3ml]``, default: ``fdsnxml``
   * ``formatted``: boolean, default: ``false``
+  * ``nodata: [204, 404]``, default: ``204``, defines the HTTP error code the
+    server should respond with if no data was found
 
 Event
 -----
@@ -96,21 +105,21 @@
 URL
 ^^^
 
-* http://localhost:8080/fdsnws/1/event/query
-* http://localhost:8080/fdsnws/1/event/catalogs
-* http://localhost:8080/fdsnws/1/event/contributors
-* http://localhost:8080/fdsnws/1/event/version
-* http://localhost:8080/fdsnws/1/event/application.wadl
+* http://localhost:8080/fdsnws/event/1/query
+* http://localhost:8080/fdsnws/event/1/catalogs
+* http://localhost:8080/fdsnws/event/1/contributors
+* http://localhost:8080/fdsnws/event/1/version
+* http://localhost:8080/fdsnws/event/1/application.wadl
 
 Example
 ^^^^^^^
 
-* http://localhost:8080/fdsnws/1/event/query?start=2013-04-18&lat=55&lon=11&maxradius=10
+* http://localhost:8080/fdsnws/event/1/query?start=2013-04-18&lat=55&lon=11&maxradius=10
 
 Feature Notes
 ^^^^^^^^^^^^^
 
-* ``catalog`` request parameter not implemented (information not available in
+* ``catalog`` request parameter is not implemented (information not available in
   SeisComP)
 * ``contributor`` request parameter is mapped to the ``agencyID``, the file
   ``@DATADIR@/share/fdsn/contributors.xml`` has to be filled manually with all
@@ -120,6 +129,8 @@
   * ``format: [qml, qml-rt, sc3ml, csv]``, default: ``qml``
   * ``includecomments``: boolean, default: ``true``
   * ``formatted``: boolean, default: ``false``
+  * ``nodata: [204, 404]``, default: ``204``, defines the HTTP error code the
+    server should respond with if no data was found
 
 
 .. _sec-port:
@@ -172,7 +183,7 @@
 Firewall
 ^^^^^^^^
 
-All major Linux distributions ship with there own firewall implementations which
+All major Linux distributions ship with their own firewall implementations which
 are front-ends for the ``iptables`` kernel functions. The following line
 temporary adds a firewall rule which redirects all incoming traffic on port 8080
 to port 80.
@@ -182,6 +193,6 @@
    sysop@host:~$ sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
 
 Please refer to the documentation of your particular firewall solution on how to
-setup this rule permanently.
+set up this rule permanently.
 
 
Index: fdsnws.py
===================================================================
--- fdsnws.py	(.../tags/releases/seattle/build-2013.149.01/src/trunk/apps/fdsnws)	(Revision 9806)
+++ fdsnws.py	(.../trunk/src/trunk/apps/fdsnws)	(Revision 9806)
@@ -84,7 +84,7 @@
 
 		username = auth.get('username')
 		if not username:
-			raise error.LoginFailed('Invalid response, no username given.')
+			raise error.LoginFailed('Invalid response, no user name given.')
 
 		if 'opaque' not in auth:
 			raise error.LoginFailed('Invalid response, no opaque given.')
@@ -221,7 +221,7 @@
 
 		if not self._serveDataSelect and not self._serveEvent and \
 		   not self._serveStation:
-			Logging.error("All services disabled through configuration")
+			Logging.error("all services disabled through configuration")
 			return False
 
 		# access logger if requested
@@ -267,7 +267,7 @@
 			fileRes.childNotFound = NoResource()
 			dataselect1.putChild("", fileRes)
 			dataselect1.putChild("query", FDSNDataSelect())
-			msg = "authorization for restricted time series data required"
+			msg = "Authorization for restricted time series data required"
 			authSession = self._getAuthSessionWrapper(FDSNDataSelectRealm(), msg)
 			dataselect1.putChild("queryauth", authSession)
 			dataselect1.putChild("version", serviceVersion)