Index: /applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfReader.java
===================================================================
--- /applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfReader.java	(revision 30659)
+++ /applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfReader.java	(revision 30660)
@@ -13,6 +13,9 @@
 import java.util.Map;
 
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.DataSource;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -30,4 +33,5 @@
 import crosby.binary.Osmformat;
 import crosby.binary.Osmformat.DenseNodes;
+import crosby.binary.Osmformat.HeaderBBox;
 import crosby.binary.Osmformat.HeaderBlock;
 import crosby.binary.Osmformat.Info;
@@ -45,6 +49,37 @@
         public IllegalDataException exception = null;
         
+        private double parseRawDegrees(long raw) {
+            return raw * .000000001;
+        }
+        
         @Override
         protected void parse(HeaderBlock header) {
+            
+            for (String requiredFeature : header.getRequiredFeaturesList()) {
+                switch (requiredFeature) {
+                case "OsmSchema-V0.6":
+                    ds.setVersion("0.6");
+                    break;
+                case "DenseNodes":
+                    break;
+                default:
+                    throw new UnsupportedOperationException("Unsupported feature: "+requiredFeature);
+                }
+            }
+            
+            HeaderBBox bbox = header.getBbox();
+            if (bbox != null) {
+                double minlat = parseRawDegrees(bbox.getBottom());
+                double minlon = parseRawDegrees(bbox.getLeft());
+                double maxlat = parseRawDegrees(bbox.getTop());
+                double maxlon = parseRawDegrees(bbox.getRight());
+                Bounds b = new Bounds(minlat, minlon, maxlat, maxlon);
+                if (!b.isCollapsed() && LatLon.isValidLat(minlat) && LatLon.isValidLat(maxlat) 
+                                     && LatLon.isValidLon(minlon) && LatLon.isValidLon(maxlon)) {
+                    ds.dataSources.add(new DataSource(b, header.getSource()));
+                } else {
+                    Main.error("Invalid Bounds: "+b);
+                }
+            }
         }
 
Index: /applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfWriter.java
===================================================================
--- /applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfWriter.java	(revision 30659)
+++ /applications/editors/josm/plugins/pbf/src/org/openstreetmap/josm/plugins/pbf/io/PbfWriter.java	(revision 30660)
@@ -332,6 +332,7 @@
             public void processSources(Collection<DataSource> sources) {
                 switchTypes();
-                for (DataSource source: sources) {
-                    processBounds(source);
+                // Can only write one bbox
+                if (!sources.isEmpty()) {
+                    processBounds(sources.iterator().next());
                 }
             }
@@ -356,6 +357,8 @@
                 }
                 for (Node n : node) {
-                    nodes.add(n);
-                    checkLimit();
+                    if (n.getCoor() != null) {
+                        nodes.add(n);
+                        checkLimit();
+                    }
                 }
             }
@@ -410,7 +413,7 @@
             Osmformat.HeaderBBox.Builder bbox = Osmformat.HeaderBBox.newBuilder();
             bbox.setLeft(mapRawDegrees(entity.bounds.getMinLon()));
-            bbox.setBottom(mapRawDegrees(entity.bounds.getMaxLat()));
+            bbox.setBottom(mapRawDegrees(entity.bounds.getMinLat()));
             bbox.setRight(mapRawDegrees(entity.bounds.getMaxLon()));
-            bbox.setTop(mapRawDegrees(entity.bounds.getMinLat()));
+            bbox.setTop(mapRawDegrees(entity.bounds.getMaxLat()));
             headerblock.setBbox(bbox);
 
